Browse Source

- funktionelle Aufteilung
- Dashboard-Color hinzu
- Beschreibungen und Screenshots

FloKra 3 years ago
parent
commit
1eb6d1c72c
50 changed files with 1435 additions and 2 deletions
  1. BIN
      DDE-Abgleich/DDEAbgleich.png
  2. 438 0
      DDE-Abgleich/DDEAbgleich_D50M57E1_noProg.ccpage
  3. BIN
      DDE-Abgleich/DDE_LLAbgleich_noProg.png
  4. 22 0
      DDE-Abgleich/README.md
  5. BIN
      DDE5/DDE5_FueAir.png
  6. BIN
      DDE5/DDE5_Generator.png
  7. BIN
      DDE5/DDE5_Laufunruhe.png
  8. 82 0
      DDE5/DDEFuelAir_D50M57E1.ccpage
  9. 95 0
      DDE5/DDEGenerator_D50M57E1.ccpage
  10. 0 0
      DDE5/DDELaufunruhe_D50M57E1.ccpage
  11. 0 0
      DDE5/DDELaufunruhe_code_D50M57E1.ccpage
  12. 30 0
      DDE5/README.md
  13. BIN
      Dashboard-Color/IBUS_APP_Color1.png
  14. BIN
      Dashboard-Color/IBUS_APP_Color2.png
  15. 0 0
      Dashboard-Color/IBUS_APP_E46_D50M57E1.ccpage
  16. 15 0
      Dashboard-Color/README.md
  17. 0 0
      Fahrzeugkonfigurationen/E46 M57N/BmwDeepObd.xsd
  18. 0 0
      Fahrzeugkonfigurationen/E46 M57N/D50M57E1.ccpage
  19. 0 0
      Fahrzeugkonfigurationen/E46 M57N/DDEAbgleich.txt
  20. 0 0
      Fahrzeugkonfigurationen/E46 M57N/DDEAbgleich_D50M57E1.ccpage
  21. 0 0
      Fahrzeugkonfigurationen/E46 M57N/DDEGenerator.ccpage
  22. 0 0
      Fahrzeugkonfigurationen/E46 M57N/DSC_MK60.ccpage
  23. 0 0
      Fahrzeugkonfigurationen/E46 M57N/Errors.ccpage
  24. 0 0
      Fahrzeugkonfigurationen/E46 M57N/Errors_old.ccpage
  25. 133 0
      Fahrzeugkonfigurationen/E46 M57N/IBUS_App.ccpage
  26. 0 0
      Fahrzeugkonfigurationen/E46 M57N/IBUS_App_BT.cccfg
  27. 0 0
      Fahrzeugkonfigurationen/E46 M57N/IBUS_App_USB.cccfg
  28. 0 0
      Fahrzeugkonfigurationen/E46 M57N/IBUS_App_noCode.ccpage
  29. 0 0
      Fahrzeugkonfigurationen/E46 M57N/IHKA46_3.ccpage
  30. 0 0
      Fahrzeugkonfigurationen/E46 M57N/KOMBI46R.ccpage
  31. 0 0
      Fahrzeugkonfigurationen/E46 M57N/KOMBI46R_SIA.ccpage
  32. 0 0
      Fahrzeugkonfigurationen/E46 M57N/KOMBI46R_SIA.txt
  33. 0 0
      Fahrzeugkonfigurationen/E46 M57N/KOMBI46R_SIA_4buttons.ccpage
  34. 0 0
      Fahrzeugkonfigurationen/E46 M57N/LSZ_2.ccpage
  35. 0 0
      Fahrzeugkonfigurationen/E46 M57N/LWS5_1B.ccpage
  36. 35 0
      Fahrzeugkonfigurationen/E46 M57N/Laufunruhe.ccpage
  37. 62 0
      Fahrzeugkonfigurationen/E46 M57N/Laufunruhe_code.ccpage
  38. 0 0
      Fahrzeugkonfigurationen/E46 M57N/PDCACT.ccpage
  39. 0 0
      Fahrzeugkonfigurationen/E46 M57N/Pages.ccpages
  40. 0 0
      Fahrzeugkonfigurationen/E46 M57N/RPA_DSC_MK60.ccpage
  41. 0 0
      Fahrzeugkonfigurationen/E46 M57N/Translation.xml.zip
  42. 36 0
      README.md
  43. 17 0
      RPA-Reset/README.md
  44. 129 0
      RPA-Reset/RPA_DSC_MK60.ccpage
  45. BIN
      RPA-Reset/RPA_DSC_MK60.png
  46. 2 2
      SIA-Reset/KOMBI39C_SIA.ccpage
  47. 255 0
      SIA-Reset/KOMBI46R_SIA.ccpage
  48. 56 0
      SIA-Reset/KOMBI46R_SIA.txt
  49. 28 0
      SIA-Reset/README.md
  50. BIN
      SIA-Reset/SIA_E46.png

BIN
DDE-Abgleich/DDEAbgleich.png


+ 438 - 0
DDE-Abgleich/DDEAbgleich_D50M57E1_noProg.ccpage

@@ -0,0 +1,438 @@
+<?xml version="1.0" encoding="utf-8"?>
+<fragment xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
+  <page name="DDE5AbgleichNP" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="DDE5E1_Abgleich.log">
+    <strings>
+      <string name="DDE5AbgleichNP">DDE5 IDLE-adjustment noProg</string>
+      <!--<string name="!JOB#AGR_ABGLEICH_LESEN_WERT"> EGR (fresh air rate)</string>-->
+      <string name="!JOB#LLA_ABGLEICH_LESEN_WERT"> increase idle speed [rpm]</string>
+    </strings>
+	<strings lang="de">
+      <string name="DDE5AbgleichNP">DDE5 LL-Abgleich noProg</string>
+      <!--<string name="!JOB#AGR_ABGLEICH_LESEN_WERT"> AGR (Frischluftrate)</string>-->
+      <string name="!JOB#LLA_ABGLEICH_LESEN_WERT"> Anhebung Leerlaufdrehzahl [u/min]</string>
+    </strings>
+    <!--<display name="!JOB#AGR_ABGLEICH_LESEN_WERT" result="AGR_ABGLEICH_LESEN_WERT" format="L" display-order="0" grid-type="text" min-value="0" max-value="100" log_tag="AGR" />-->
+    <display name="!JOB#LLA_ABGLEICH_LESEN_WERT" result="LLA_ABGLEICH_LESEN_WERT" format="L" display-order="0" grid-type="text" min-value="0" max-value="100" log_tag="LLA" />
+    <jobs sgbd="D50M57E1" />
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {
+        // Button deklarieren
+        //private Button buttonAGRserie;
+        //private Button buttonAGRred;
+        private Button buttonLLA0;
+        private Button buttonLLA50;
+        private Button buttonLLA70;
+        private Button buttonLLA100;
+        private Button buttonLLA150;
+        private Button buttonLLA200;
+        
+        // Ablaufvariable deklarieren und initialisieren
+        // diese boolsche Variable wird vom Button auf true gesetzt und in der ExecuteJob Methode ausgewertet
+        // wo dann ggf. der eigentliche Befehl ans Steuergerät ausgeführt wird
+        //private bool set_AGR_serie = false;
+        //private bool set_AGR_red = false;
+        private bool set_LLA_0 = false;
+        private bool set_LLA_50 = false;
+        private bool set_LLA_70 = false;
+        private bool set_LLA_100 = false;
+        private bool set_LLA_150 = false;
+        private bool set_LLA_200 = false;
+        
+        // Seitenaufbau: 
+        // <display... tags müssen direkt unter <page... stehen und result="RESULT_NAME" (ohne job name) enthalten
+        // diese werden unterhalb von der Funktion ExecuteJob befüllt
+        // <job... tags wie normalerweise gibt es nicht
+        // Es darf nur ein <jobs> tag in dieser form vorhanden sein: <jobs sgbg="sgbdname" />
+        // Jedenfalls wurde bei meinen Tests die ExecuteJobs Funktion niemals aufgerufen wenn in der ccpage 
+        // jobs im normalen Format enthalten waren. Ob das wirklich so ist oder ich einen anderen Fehler hatte 
+        // muss ich erst noch rausfinden. 
+        
+        public void CreateLayout(ActivityMain activity, JobReader.PageInfo pageInfo, LinearLayout pageLayout)
+        {
+            LinearLayout buttonLayout = new LinearLayout(activity);
+            buttonLayout.Orientation = Orientation.Horizontal;
+		
+            LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MatchParent,
+                ViewGroup.LayoutParams.WrapContent);
+            buttonLayoutParams.Weight = 1;
+			
+			
+			//  // Button AGR Serie
+            //  buttonAGRserie = new Button(activity);
+            //  buttonAGRserie.Text = "AGR Serie";
+            //  buttonAGRserie.Click += delegate
+            //  {
+            //      // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+            //      set_AGR_serie = true;
+            //      
+            //      //// Benachrichtung anzeigen wenn man will
+            //      //ActivityMain.ShowNotification(activity, 0, 2,
+            //      //    "DDE Abgleich",
+            //      //    "AGR 0");
+            //  };
+            //  buttonLayout.AddView(buttonAGRserie, buttonLayoutParams);
+			//  
+			//  
+			//  // Button AGR Reduziert
+            //  buttonAGRred = new Button(activity);
+            //  buttonAGRred.Text = "AGR min.";
+            //  buttonAGRred.Click += delegate
+            //  {
+            //      // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+            //      set_AGR_red = true;
+            //      
+            //      //// Benachrichtung anzeigen wenn man will
+            //      //ActivityMain.ShowNotification(activity, 0, 2,
+            //      //    "DDE Abgleich",
+            //      //    "AGR 87");
+            //  };
+            //  buttonLayout.AddView(buttonAGRred, buttonLayoutParams);
+			
+			
+			// Button Leerlauf Serie
+            buttonLLA0 = new Button(activity);
+            buttonLLA0.Text = "LL \n +0";
+            buttonLLA0.Click += delegate
+            {
+                // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+                set_LLA_0 = true;
+                
+                //// Benachrichtung anzeigen wenn man will
+				//ActivityMain.ShowNotification(activity, 0, 2,
+				//    "DDE Abgleich",
+                //    "Leerlaufdrehzahl +0");
+            };
+            buttonLayout.AddView(buttonLLA0, buttonLayoutParams);
+			
+			
+			// Button Leerlauf +50
+            buttonLLA50 = new Button(activity);
+            buttonLLA50.Text = "LL \n +50";
+            buttonLLA50.Click += delegate
+            {
+                // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+                set_LLA_50 = true;
+                
+                //// Benachrichtung anzeigen wenn man will
+                //ActivityMain.ShowNotification(activity, 0, 2,
+                //    "DDE Abgleich",
+                //    "Leerlaufdrehzahl +50");
+            };
+            buttonLayout.AddView(buttonLLA50, buttonLayoutParams);
+			
+			
+			// Button Leerlauf +70
+            buttonLLA70 = new Button(activity);
+            buttonLLA70.Text = "LL \n +70";
+            buttonLLA70.Click += delegate
+            {
+                // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+                set_LLA_70 = true;
+                
+                //// Benachrichtung anzeigen wenn man will
+                //ActivityMain.ShowNotification(activity, 0, 2,
+                //    "DDE Abgleich",
+                //    "Leerlaufdrehzahl +70");
+            };
+            buttonLayout.AddView(buttonLLA70, buttonLayoutParams);
+			
+			
+			// Button Leerlauf +100
+            buttonLLA100 = new Button(activity);
+            buttonLLA100.Text = "LL \n+100";
+            buttonLLA100.Click += delegate
+            {
+                // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+                set_LLA_100 = true;
+                
+                //// Benachrichtung anzeigen wenn man will
+                //ActivityMain.ShowNotification(activity, 0, 2,
+                //    "DDE Abgleich",
+                //    "Leerlaufdrehzahl +100");
+            };
+            buttonLayout.AddView(buttonLLA100, buttonLayoutParams);
+			
+			
+			// Button Leerlauf +150
+            buttonLLA150 = new Button(activity);
+            buttonLLA150.Text = "LL \n+150";
+            buttonLLA150.Click += delegate
+            {
+                // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+                set_LLA_150 = true;
+                
+                //// Benachrichtung anzeigen wenn man will
+                //ActivityMain.ShowNotification(activity, 0, 2,
+                //    "DDE Abgleich",
+                //    "Leerlaufdrehzahl +150");
+            };
+            buttonLayout.AddView(buttonLLA150, buttonLayoutParams);
+			
+			
+			// Button Leerlauf +200
+            buttonLLA200 = new Button(activity);
+            buttonLLA200.Text = "LL \n+200";
+            buttonLLA200.Click += delegate
+            {
+                // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+                set_LLA_200 = true;
+                
+                //// Benachrichtung anzeigen wenn man will
+                //ActivityMain.ShowNotification(activity, 0, 2,
+                //    "DDE Abgleich",
+                //    "Leerlaufdrehzahl +200");
+            };
+            buttonLayout.AddView(buttonLLA200, buttonLayoutParams);
+			
+			
+		
+            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MatchParent,
+                ViewGroup.LayoutParams.WrapContent);
+            pageLayout.AddView(buttonLayout, layoutParams);
+        }
+		
+        public void DestroyLayout(JobReader.PageInfo pageInfo)
+        {
+            // buttonAGRserie = null;
+            // buttonAGRred = null;
+            buttonLLA0 = null;
+            buttonLLA50 = null;
+            buttonLLA70 = null;
+            buttonLLA100 = null;
+            buttonLLA150 = null;
+            buttonLLA200 = null;
+        }
+
+        public void ExecuteJob(EdiabasNet ediabas, ref MultiMap<string, EdiabasNet.ResultData> resultDict, bool firstCall)
+        {
+            List<Dictionary<string, EdiabasNet.ResultData>> resultSets;  // hier werden die job results zwischengespeichert
+            
+            // unterhalb der/die JOB(s) zur Datenanzeige
+			
+			
+            // ediabas.ArgString = "agr";
+            // ediabas.ArgBinaryStd = null;
+            // ediabas.ResultsRequests = string.Empty;
+            // ediabas.ExecuteJob("ABGLEICH_LESEN");
+            // 
+            // resultSets = ediabas.ResultSets;
+            // if (resultSets != null && resultSets.Count >= 2)
+            // {
+            //     // results der aktuellen Abfrage mit unveränderten result namen übernehmen
+            //     EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1], "AGR_");
+            // }
+			
+			
+			ediabas.ArgString = "lla";
+            ediabas.ArgBinaryStd = null;
+            ediabas.ResultsRequests = string.Empty;
+            ediabas.ExecuteJob("ABGLEICH_LESEN");
+            
+            resultSets = ediabas.ResultSets;
+            if (resultSets != null && resultSets.Count >= 2)
+            {
+                // results der aktuellen Abfrage mit unveränderten result namen übernehmen
+                EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1], "LLA_");
+            }
+						
+            
+            // ENDE JOBs
+			
+			
+            
+            // Button JOBs
+			
+			// if (set_AGR_serie) {
+            //     ediabas.ArgString = "agr;0";
+            //     ediabas.ArgBinaryStd = null;
+            //     ediabas.ResultsRequests = "JOB_STATUS";
+            //     ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+			// 	
+			// 	// ediabas.ArgString = "agr;0";
+            //     // ediabas.ArgBinaryStd = null;
+            //     // ediabas.ResultsRequests = "JOB_STATUS";
+            //     // ediabas.ExecuteJob("ABGLEICH_PROG");
+            //     
+            //     // JOB RESULT ermitteln (wird derzeit nicht weiter verwendet weil man es anhand der geänderten Daten 
+            //     // und den blinkenden LEDs im KOMBI eh sofort sieht)
+            //     //resultSets = ediabas.ResultSets;
+            //     //if (resultSets != null && resultSets.Count >= 2)
+            //     //{
+            //     //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+            //     //}
+            //     
+            //     // Ablaufvariable wieder zurücksetzen, sonst würde dieser Befehl nun bei jedem weiteren Durchlauf ausgeführt werden...
+            //     set_AGR_serie = false;
+            // }
+			// 
+			// if (set_AGR_red) {
+            //     ediabas.ArgString = "agr;87";
+            //     ediabas.ArgBinaryStd = null;
+            //     ediabas.ResultsRequests = "JOB_STATUS";
+            //     ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+			// 	
+			// 	// ediabas.ArgString = "agr;87";
+            //     // ediabas.ArgBinaryStd = null;
+            //     // ediabas.ResultsRequests = "JOB_STATUS";
+            //     // ediabas.ExecuteJob("ABGLEICH_PROG");
+            //     
+            //     // JOB RESULT ermitteln (wird derzeit nicht weiter verwendet weil man es anhand der geänderten Daten 
+            //     // und den blinkenden LEDs im KOMBI eh sofort sieht)
+            //     //resultSets = ediabas.ResultSets;
+            //     //if (resultSets != null && resultSets.Count >= 2)
+            //     //{
+            //     //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+            //     //}
+            //     
+            //     // Ablaufvariable wieder zurücksetzen, sonst würde dieser Befehl nun bei jedem weiteren Durchlauf ausgeführt werden...
+            //     set_AGR_red = false;
+            // }
+			
+            if (set_LLA_0) {
+                ediabas.ArgString = "lla;0";
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+				
+				// ediabas.ArgString = "lla;0";
+                // ediabas.ArgBinaryStd = null;
+                // ediabas.ResultsRequests = "JOB_STATUS";
+                // ediabas.ExecuteJob("ABGLEICH_PROG");
+                
+                // JOB RESULT ermitteln (wird derzeit nicht weiter verwendet weil man es anhand der geänderten Daten 
+                // und den blinkenden LEDs im KOMBI eh sofort sieht)
+                //resultSets = ediabas.ResultSets;
+                //if (resultSets != null && resultSets.Count >= 2)
+                //{
+                //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+                //}
+                
+                // Ablaufvariable wieder zurücksetzen, sonst würde dieser Befehl nun bei jedem weiteren Durchlauf ausgeführt werden...
+                set_LLA_0 = false;
+            }
+			
+			if (set_LLA_50) {
+                ediabas.ArgString = "lla;50";
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+				
+				// ediabas.ArgString = "lla;50";
+                // ediabas.ArgBinaryStd = null;
+                // ediabas.ResultsRequests = "JOB_STATUS";
+                // ediabas.ExecuteJob("ABGLEICH_PROG");
+                
+                // JOB RESULT ermitteln (wird derzeit nicht weiter verwendet weil man es anhand der geänderten Daten 
+                // und den blinkenden LEDs im KOMBI eh sofort sieht)
+                //resultSets = ediabas.ResultSets;
+                //if (resultSets != null && resultSets.Count >= 2)
+                //{
+                //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+                //}
+                
+                // Ablaufvariable wieder zurücksetzen, sonst würde dieser Befehl nun bei jedem weiteren Durchlauf ausgeführt werden...
+                set_LLA_50 = false;
+            }
+			
+			if (set_LLA_70) {
+                ediabas.ArgString = "lla;70";
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+				
+				// ediabas.ArgString = "lla;70";
+                // ediabas.ArgBinaryStd = null;
+                // ediabas.ResultsRequests = "JOB_STATUS";
+                // ediabas.ExecuteJob("ABGLEICH_PROG");
+                
+                // JOB RESULT ermitteln (wird derzeit nicht weiter verwendet weil man es anhand der geänderten Daten 
+                // und den blinkenden LEDs im KOMBI eh sofort sieht)
+                //resultSets = ediabas.ResultSets;
+                //if (resultSets != null && resultSets.Count >= 2)
+                //{
+                //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+                //}
+                
+                // Ablaufvariable wieder zurücksetzen, sonst würde dieser Befehl nun bei jedem weiteren Durchlauf ausgeführt werden...
+                set_LLA_70 = false;
+            }
+			
+			if (set_LLA_100) {
+                ediabas.ArgString = "lla;100";
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+				
+				// ediabas.ArgString = "lla;100";
+                // ediabas.ArgBinaryStd = null;
+                // ediabas.ResultsRequests = "JOB_STATUS";
+                // ediabas.ExecuteJob("ABGLEICH_PROG");
+                
+                // JOB RESULT ermitteln (wird derzeit nicht weiter verwendet weil man es anhand der geänderten Daten 
+                // und den blinkenden LEDs im KOMBI eh sofort sieht)
+                //resultSets = ediabas.ResultSets;
+                //if (resultSets != null && resultSets.Count >= 2)
+                //{
+                //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+                //}
+                
+                // Ablaufvariable wieder zurücksetzen, sonst würde dieser Befehl nun bei jedem weiteren Durchlauf ausgeführt werden...
+                set_LLA_100 = false;
+            }
+			
+			if (set_LLA_150) {
+                ediabas.ArgString = "lla;150";
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+				
+				// ediabas.ArgString = "lla;150";
+                // ediabas.ArgBinaryStd = null;
+                // ediabas.ResultsRequests = "JOB_STATUS";
+                // ediabas.ExecuteJob("ABGLEICH_PROG");
+                
+                // JOB RESULT ermitteln (wird derzeit nicht weiter verwendet weil man es anhand der geänderten Daten 
+                // und den blinkenden LEDs im KOMBI eh sofort sieht)
+                //resultSets = ediabas.ResultSets;
+                //if (resultSets != null && resultSets.Count >= 2)
+                //{
+                //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+                //}
+                
+                // Ablaufvariable wieder zurücksetzen, sonst würde dieser Befehl nun bei jedem weiteren Durchlauf ausgeführt werden...
+                set_LLA_150 = false;
+            }
+			
+			if (set_LLA_200) {
+                ediabas.ArgString = "lla;200";
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+				
+				// ediabas.ArgString = "lla;200";
+                // ediabas.ArgBinaryStd = null;
+                // ediabas.ResultsRequests = "JOB_STATUS";
+                // ediabas.ExecuteJob("ABGLEICH_PROG");
+                
+                // JOB RESULT ermitteln (wird derzeit nicht weiter verwendet weil man es anhand der geänderten Daten 
+                // und den blinkenden LEDs im KOMBI eh sofort sieht)
+                //resultSets = ediabas.ResultSets;
+                //if (resultSets != null && resultSets.Count >= 2)
+                //{
+                //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+                //}
+                
+                // Ablaufvariable wieder zurücksetzen, sonst würde dieser Befehl nun bei jedem weiteren Durchlauf ausgeführt werden...
+                set_LLA_200 = false;
+            }
+			
+        }
+    }
+    ]]>
+    </code>
+  </page>
+</fragment>

BIN
DDE-Abgleich/DDE_LLAbgleich_noProg.png


+ 22 - 0
DDE-Abgleich/README.md

@@ -0,0 +1,22 @@
+# DeepOBDConf
+
+## DDE-Abgleich
+
+Fahrzeuge: alle Diesel mit Motorsteuerung DDE3.0, DDE4.0 und DDE5.0
+
+Funktionen:
+
+- Abgleich AGR (Frischluftrate) auf Serienstand oder den jeweiligen Minimalwert
+- Abgleich Leerlaufdrehzahlanhebung, in mehreren Schritten
+
+**Achtung, jede Änderung wird direkt ins Steuergerät programmiert - sollte daher mit Vorsicht angewandt und nicht z.B. mehrmals täglich verändert werden!** 
+
+![](DDEAbgleich.png)
+
+
+
+
+
+Außerdem gibt es für Testzwecke eine Seite, mit welcher die Leerlaufanhebung in noch weiteren Stufen **temporär** (d.h. ohne Programmierung, aktiv nur bis Zündung Aus) verändert werden kann. Dies habe ich für Versuche benötigt, um die optimale Leerlaufdrehzahlanhebung zu finden, da mein M57TÜ aufgrund des (möglicherweise teilweise defekten) elektrischen Zuheizers im Warmlauf starke Leerlaufschwankungen hat. Durch starke Leerlaufanhebung kann dies teilweise ausgeglichen werden. Für dauerhafte Nutzung ist die Anhebung um 150 oder 200 upm allerdings deutlich zu viel. 
+
+![](DDE_LLAbgleich_noProg.png)

BIN
DDE5/DDE5_FueAir.png


BIN
DDE5/DDE5_Generator.png


BIN
DDE5/DDE5_Laufunruhe.png


+ 82 - 0
DDE5/DDEFuelAir_D50M57E1.ccpage

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<fragment xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
+  <page name="DDE_Fuel_Air" display-mode="grid" fontsize="small" gauges-portrait="2" gauges-landscape="5" logfile="DDEFuelAir.log">
+    <strings lang="de">
+      <string name="DDE_Fuel_Air">Diesel/Ladeluft</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> Drehzahl [U/min]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> Drehmoment [Nm]:</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LUFTMASSE_PRO_HUB_WERT"> Luftmasse [mg/Hub]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT"> Ladelufttemp. [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KRAFTSTOFFTEMPERATURK_WERT"> Kraftstofftemperatur [°C]</string>
+	  
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_EINSPRITZMENGE_AKTUELL_WERT"> Einspritzmenge [mg]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_SOLL_WERT"> Raildruck Soll [bar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_WERT"> Raildruck Ist [bar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_SOLL_WERT"> Ladedruck Soll [mbar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_WERT"> Ladedruck Ist [mbar]</string>
+    </strings>
+    <strings>
+      <string name="DDE_Fuel_Air">fuel/air</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> engine speed [U/min]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> torque [Nm]:</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LUFTMASSE_PRO_HUB_WERT"> air mass [mg/stroke]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT"> charge air temperature [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KRAFTSTOFFTEMPERATURK_WERT"> fuel temperature [°C]</string>
+	  
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_EINSPRITZMENGE_AKTUELL_WERT"> fuel mass [mg]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_SOLL_WERT"> target rail pressure [bar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_WERT"> act. rail pressure [bar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_SOLL_WERT"> target boost pressure [mbar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_WERT"> act. boost pressure [mbar]</string>
+
+    </strings>  
+    <jobs>
+      <job sgbd="D50M57E1" name="STATUS_MESSWERTBLOCK_LESEN" args="JA;ILMMG;IPLAD;IMOAK;INMOT;ITLAL;IMEIA;SPLAD;IPRDR;SPRDR;IAAGR">
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT" result="STAT_MOTORDREHZAHL_WERT" grid-type="simple-gauge-round" min-value="0" max-value="5000" log_tag="STAT_MOTORDREHZAHL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LUFTMASSE_PRO_HUB_WERT" result="STAT_LUFTMASSE_PRO_HUB_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1500" log_tag="STAT_LUFTMASSE_PRO_HUB_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT" result="STAT_MOTORMOMENT_AKTUELL_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="600" log_tag="STAT_MOTORMOMENT_AKTUELL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_EINSPRITZMENGE_AKTUELL_WERT" result="STAT_EINSPRITZMENGE_AKTUELL_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="100" log_tag="STAT_EINSPRITZMENGE_AKTUELL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT" result="STAT_LADELUFTTEMPERATUR_WERT" format=".1R" grid-type="simple-gauge-round" min-value="-20" max-value="80" log_tag="STAT_LADELUFTTEMPERATUR_WERT" />
+		
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_SOLL_WERT" result="STAT_RAILDRUCK_SOLL_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1600" log_tag="STAT_RAILDRUCK_SOLL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_WERT" result="STAT_RAILDRUCK_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1600" log_tag="STAT_RAILDRUCK_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_SOLL_WERT" result="STAT_LADEDRUCK_SOLL_WERT" format="4.1R" grid-type="simple-gauge-round" min-value="0" max-value="2500" log_tag="STAT_LADEDRUCK_SOLL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_WERT" result="STAT_LADEDRUCK_WERT" format="4.1R" grid-type="simple-gauge-round" min-value="0" max-value="2500" log_tag="STAT_LADEDRUCK_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_ABGASRUECKFUEHRSTELLER_ANSTEUERUNG_WERT" result="STAT_ABGASRUECKFUEHRSTELLER_ANSTEUERUNG_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="100" log_tag="STAT_ABGASRUECKFUEHRSTELLER_ANSTEUERUNG_WERT" />
+      </job>
+    </jobs>
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {
+        public string FormatResult(JobReader.PageInfo pageInfo, MultiMap<string, EdiabasNet.ResultData> resultDict, string resultName, ref Android.Graphics.Color? textColor)
+        {
+            string result = string.Empty;
+            double value;
+            bool found;
+
+            switch (resultName)
+            {
+                case "STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    
+                    // result format: {0,[DIGITS TOTAL INCL COMMA],[0|0.0|0.00|0.000...]}
+                    result = string.Format(ActivityMain.Culture, "{0,4:0}", value);
+                    
+					// Liste der möglichen Farbnamen: https://docs.microsoft.com/en-us/dotnet/api/android.graphics.color?view=xamarin-android-sdk-9
+                    if (found && value <= 4000) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 4250) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 4500) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 4500) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+
+            }
+            return result;
+        }
+    }
+      ]]>
+    </code>
+  </page>
+</fragment>

+ 95 - 0
DDE5/DDEGenerator_D50M57E1.ccpage

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<fragment xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
+  <page name="Generator" display-mode="grid" fontsize="small" gauges-portrait="2" gauges-landscape="4" logfile="DME_DDE.log">
+    <strings lang="de">
+      <string name="Generator">Generator</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> Drehzahl [U/min]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UBATT_WERT"> Batteriespannung [V]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_GENERATORLAST_WERT"> Generatorlast [%]</string>
+	  <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_ZUHEIZER_ANSTEUERUNG_WERT"> Zuheizer Ansteuerung [%]:</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT"> Kühlmitteltemperatur [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> Drehmoment [Nm]:</string>
+
+    </strings>
+    <strings>
+      <string name="Generator">Generator</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> engine speed [U/min]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UBATT_WERT"> voltage [V]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_GENERATORLAST_WERT"> alternator load [%]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_ZUHEIZER_ANSTEUERUNG_WERT"> el. heater PWM [%]:</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT"> coolant [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> torque [Nm]:</string>
+    </strings>  
+    <jobs>
+      <job sgbd="D50M57E1" name="STATUS_MESSWERTBLOCK_LESEN" args="JA;IUBAT;ITKUM;IMOAK;INMOT;IGENL;ITZUH">
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT" result="STAT_MOTORDREHZAHL_WERT" grid-type="simple-gauge-round" min-value="0" max-value="5000" log_tag="STAT_MOTORDREHZAHL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT" result="STAT_KUEHLMITTELTEMPERATUR_WERT" grid-type="simple-gauge-round" min-value="-20" max-value="120" log_tag="STAT_KUEHLMITTELTEMPERATUR_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT" result="STAT_MOTORMOMENT_AKTUELL_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="600" log_tag="STAT_MOTORMOMENT_AKTUELL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UBATT_WERT" result="STAT_UBATT_WERT" grid-type="simple-gauge-round" min-value="0" max-value="15" log_tag="STAT_UBATT_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_GENERATORLAST_WERT" result="STAT_GENERATORLAST_WERT" format=".1R" grid-type="simple-gauge-round" min-value="0" max-value="100" log_tag="STAT_GENERATORLAST_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_ZUHEIZER_ANSTEUERUNG_WERT" result="STAT_ZUHEIZER_ANSTEUERUNG_WERT" format=".1R" grid-type="simple-gauge-round" min-value="0" max-value="100" log_tag="STAT_ZUHEIZER_ANSTEUERUNG_WERT" />
+      </job>
+    </jobs>
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {
+        public string FormatResult(JobReader.PageInfo pageInfo, MultiMap<string, EdiabasNet.ResultData> resultDict, string resultName, ref Android.Graphics.Color? textColor)
+        {
+            string result = string.Empty;
+            double value;
+            bool found;
+
+            switch (resultName)
+            {
+                case "STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    
+                    // result format: {0,[DIGITS TOTAL INCL COMMA],[0|0.0|0.00|0.000...]}
+                    result = string.Format(ActivityMain.Culture, "{0,4:0}", value);
+                    
+                    if (found && value <= 4000) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 4250) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 4500) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 4500) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+                    
+                case "STATUS_MESSWERTBLOCK_LESEN#STAT_UBATT_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    
+                    // result format: {0,[DIGITS TOTAL INCL COMMA],[0|0.0|0.00|0.000...]}
+                    result = string.Format(ActivityMain.Culture, "{0,4:0.0}", value);
+                    
+                    if (found && value < 10.5) textColor = Android.Graphics.Color.Red;
+                    else if (found && value < 11.5) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value <= 12.5) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 13.2) textColor = Android.Graphics.Color.Gray;
+                    else if (found && value <= 14.5) textColor = Android.Graphics.Color.White;
+                    else if (found && value > 14.5) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+
+
+                case "STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    result = string.Format(ActivityMain.Culture, "{0,3:0}", value);
+                    
+                    if (found && value < 75) textColor = Android.Graphics.Color.Blue;
+                    else if (found && value <= 105) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 110) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 115) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 115) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+            }
+            return result;
+        }
+    }
+      ]]>
+    </code>
+  </page>
+</fragment>

+ 0 - 0
E46 M57N/Laufunruhe.ccpage → DDE5/DDELaufunruhe_D50M57E1.ccpage


+ 0 - 0
E46 M57N/Laufunruhe_code.ccpage → DDE5/DDELaufunruhe_code_D50M57E1.ccpage


+ 30 - 0
DDE5/README.md

@@ -0,0 +1,30 @@
+# DeepOBDConf
+
+## DDE - erweitere Anzeigen
+
+Fahrzeuge: (derzeit) alle Diesel mit Motorsteuerung DDE5.0 (EU4)
+
+### Seiten
+
+- **DDE_Laufunruhe**
+
+  Anzeige der aktuellen Mengenkorrektur der einzelnen Injektoren ("Laufruhemessung"), hilfreich zur Abschätzung des Zustands der Injektoren und Zylinder
+  
+
+- **DDE_FuelAir**
+
+  Anzeige von Ladedruck, Ladeluft, Raildruck usw. (schnellere Aktualisierung und übersichtlicher als auf der Hauptseite)
+  
+
+- **DDE_Generator**
+
+  Anzeige von Generatorlast, Bordspannung, Ansteuerung elektrischer Zuheizer (% PWM), Drehzahl, Motorlast
+  Kann zur Diagnose von Generator-/Zuheizerproblemen und Leerlaufschwankungen hilfreich sein.
+
+
+
+![](DDE5_Laufunruhe.png)
+
+![](DDE5_FueAir.png)
+
+![](DDE5_Generator.png)

BIN
Dashboard-Color/IBUS_APP_Color1.png


BIN
Dashboard-Color/IBUS_APP_Color2.png


+ 0 - 0
E46 M57N/IBUS_App.ccpage → Dashboard-Color/IBUS_APP_E46_D50M57E1.ccpage


+ 15 - 0
Dashboard-Color/README.md

@@ -0,0 +1,15 @@
+# DeepOBDConf
+
+## Dashboard mit farbigen Anzeigen
+
+Modifikation der IBUS-App DeepOBD-Hauptseite, welche für Broadcast verschiedener Werte zur IBUS-App benötigt wird. 
+
+Die Seite wurde durch user defined code um werteabhängig gefärbte Anzeigen erweitert. 
+
+Fahrzeuge: (derzeit) alle E46 Diesel mit Motorsteuerung DDE5.0 (EU4)
+
+
+
+![](IBUS_APP_Color1.png)
+
+![](IBUS_APP_Color2.png)

+ 0 - 0
E46 M57N/BmwDeepObd.xsd → Fahrzeugkonfigurationen/E46 M57N/BmwDeepObd.xsd


+ 0 - 0
E46 M57N/D50M57E1.ccpage → Fahrzeugkonfigurationen/E46 M57N/D50M57E1.ccpage


+ 0 - 0
E46 M57N/DDEAbgleich.txt → Fahrzeugkonfigurationen/E46 M57N/DDEAbgleich.txt


+ 0 - 0
E46 M57N/DDEAbgleich_D50M57E1.ccpage → Fahrzeugkonfigurationen/E46 M57N/DDEAbgleich_D50M57E1.ccpage


+ 0 - 0
E46 M57N/DDEGenerator.ccpage → Fahrzeugkonfigurationen/E46 M57N/DDEGenerator.ccpage


+ 0 - 0
E46 M57N/DSC_MK60.ccpage → Fahrzeugkonfigurationen/E46 M57N/DSC_MK60.ccpage


+ 0 - 0
E46 M57N/Errors.ccpage → Fahrzeugkonfigurationen/E46 M57N/Errors.ccpage


+ 0 - 0
E46 M57N/Errors_old.ccpage → Fahrzeugkonfigurationen/E46 M57N/Errors_old.ccpage


+ 133 - 0
Fahrzeugkonfigurationen/E46 M57N/IBUS_App.ccpage

@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<fragment xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
+  <page name="IBUS_App" display-mode="grid" fontsize="small" gauges-portrait="2" gauges-landscape="5" logfile="DME_DDE.log">
+    <strings lang="de">
+      <string name="IBUS_App">IBUS_App</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LUFTMASSE_PRO_HUB_WERT"> Luftmasse [mg/Hub]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UBATT_WERT"> Batteriespannung [V]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT"> Kühlmitteltemperatur [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> Drehmoment [Nm]:</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> Drehzahl [U/min]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KRAFTSTOFFTEMPERATURK_WERT"> Kraftstofftemperatur [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT"> Ladelufttemp. [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_EINSPRITZMENGE_AKTUELL_WERT"> Einspritzmenge [mg]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_ABGASTEMPERATUR_VOR_KATALYSATOR_WERT"> Abgastemp. vor Kat [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_WERT"> Ladedruck Ist [mbar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_SOLL_WERT"> Ladedruck Soll [mbar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UMGEBUNGSDRUCK_WERT"> Luftdruck [mbar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_WERT"> Raildruck Ist [bar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_SOLL_WERT"> Raildruck Soll [bar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_FAHRZEUGBESCHLEUNIGUNG_WERT"> Beschleunigung [m/s²]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_GESCHWINDIGKEIT_WERT"> Geschwindigkeit [km/h]</string>
+      <string name="!JOB#STATUS_TOENS_IO#STAT_TOG_HIGH_WERT">  TÖNS Heizzeit [ms]</string>
+      <string name="!JOB#STATUS_TOENS_IO#STAT_TOG_LOW_WERT">  TÖNS Kühlzeit [ms]</string>
+    </strings>
+    <strings>
+      <string name="IBUS_App">IBUS_App</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LUFTMASSE_PRO_HUB_WERT"> air mass [mg/stroke]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UBATT_WERT"> voltage [V]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT"> coolant [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> torque [Nm]:</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> engine speed [U/min]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KRAFTSTOFFTEMPERATURK_WERT"> fuel temperature [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT"> charge air temperature [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_EINSPRITZMENGE_AKTUELL_WERT"> fuel mass [mg]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_ABGASTEMPERATUR_VOR_KATALYSATOR_WERT"> exhaust before cat [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_WERT"> act. boost pressure [mbar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_SOLL_WERT"> target boost pressure [mbar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UMGEBUNGSDRUCK_WERT"> air pressure [mbar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_WERT"> act. rail pressure [bar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_SOLL_WERT"> target rail pressure [bar]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_FAHRZEUGBESCHLEUNIGUNG_WERT"> acceleration [m/s²]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_GESCHWINDIGKEIT_WERT"> speed [km/h]</string>
+      <string name="!JOB#STATUS_TOENS_IO#STAT_TOG_HIGH_WERT">  TÖNS heating time [ms]</string>
+      <string name="!JOB#STATUS_TOENS_IO#STAT_TOG_LOW_WERT">  TÖNS cooling time [ms]</string>
+    </strings>  
+    <jobs>
+      <job sgbd="D50M57E1" name="STATUS_MESSWERTBLOCK_LESEN" args="JA;ILMMG;IPLAD;IPUMG;IUBAT;ITKUM;IMOAK;INMOT;ITKRS;ITLAL;IMEIA;ITAVO;SPLAD;IPRDR;SPRDR;IAFZG;IVKMH">
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LUFTMASSE_PRO_HUB_WERT" result="STAT_LUFTMASSE_PRO_HUB_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1500" log_tag="STAT_LUFTMASSE_PRO_HUB_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_WERT" result="STAT_LADEDRUCK_WERT" format="4.1R" grid-type="simple-gauge-round" min-value="0" max-value="2500" log_tag="STAT_LADEDRUCK_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UBATT_WERT" result="STAT_UBATT_WERT" grid-type="simple-gauge-round" min-value="0" max-value="15" log_tag="STAT_UBATT_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT" result="STAT_KUEHLMITTELTEMPERATUR_WERT" grid-type="simple-gauge-round" min-value="-20" max-value="120" log_tag="STAT_KUEHLMITTELTEMPERATUR_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT" result="STAT_MOTORMOMENT_AKTUELL_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="600" log_tag="STAT_MOTORMOMENT_AKTUELL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT" result="STAT_MOTORDREHZAHL_WERT" grid-type="simple-gauge-round" min-value="0" max-value="5000" log_tag="STAT_MOTORDREHZAHL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KRAFTSTOFFTEMPERATURK_WERT" result="STAT_KRAFTSTOFFTEMPERATURK_WERT" format="2.1R" grid-type="simple-gauge-round" min-value="-20" max-value="80" log_tag="STAT_KRAFTSTOFFTEMPERATURK_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT" result="STAT_LADELUFTTEMPERATUR_WERT" format=".1R" grid-type="simple-gauge-round" min-value="-20" max-value="80" log_tag="STAT_LADELUFTTEMPERATUR_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_EINSPRITZMENGE_AKTUELL_WERT" result="STAT_EINSPRITZMENGE_AKTUELL_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="100" log_tag="STAT_EINSPRITZMENGE_AKTUELL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_ABGASTEMPERATUR_VOR_KATALYSATOR_WERT" result="STAT_ABGASTEMPERATUR_VOR_KATALYSATOR_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="500" log_tag="STAT_ABGASTEMPERATUR_VOR_KATALYSATOR_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_SOLL_WERT" result="STAT_LADEDRUCK_SOLL_WERT" format="4.1R" grid-type="simple-gauge-round" min-value="0" max-value="2500" log_tag="STAT_LADEDRUCK_SOLL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_WERT" result="STAT_RAILDRUCK_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1400" log_tag="STAT_RAILDRUCK_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_SOLL_WERT" result="STAT_RAILDRUCK_SOLL_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1400" log_tag="STAT_RAILDRUCK_SOLL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_FAHRZEUGBESCHLEUNIGUNG_WERT" result="STAT_FAHRZEUGBESCHLEUNIGUNG_WERT" format="2.3R" grid-type="simple-gauge-round" min-value="-15" max-value="15" log_tag="STAT_FAHRZEUGBESCHLEUNIGUNG_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_GESCHWINDIGKEIT_WERT" result="STAT_GESCHWINDIGKEIT_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="250" log_tag="STAT_GESCHWINDIGKEIT_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UMGEBUNGSDRUCK_WERT" result="STAT_UMGEBUNGSDRUCK_WERT" format="4.1R" grid-type="simple-gauge-round" min-value="800" max-value="1300" log_tag="STAT_UMGEBUNGSDRUCK_WERT" />
+      </job>
+      <job sgbd="kombi46r" name="STATUS_TOENS_IO">
+        <display name="!JOB#STATUS_TOENS_IO#STAT_TOG_HIGH_WERT" result="STAT_TOG_HIGH_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1000" log_tag="STAT_TOG_HIGH_WERT" />
+        <display name="!JOB#STATUS_TOENS_IO#STAT_TOG_LOW_WERT" result="STAT_TOG_LOW_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1000" log_tag="STAT_TOG_LOW_WERT" />
+      </job>
+    </jobs>
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {
+        public string FormatResult(JobReader.PageInfo pageInfo, MultiMap<string, EdiabasNet.ResultData> resultDict, string resultName, ref Android.Graphics.Color? textColor)
+        {
+            string result = string.Empty;
+            double value;
+            bool found;
+
+            switch (resultName)
+            {
+                case "STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    
+                    // result format: {0,[DIGITS TOTAL INCL COMMA],[0|0.0|0.00|0.000...]}
+                    result = string.Format(ActivityMain.Culture, "{0,4:0}", value);
+                    
+					// Liste der möglichen Farbnamen: https://docs.microsoft.com/en-us/dotnet/api/android.graphics.color?view=xamarin-android-sdk-9
+                    if (found && value <= 4000) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 4250) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 4500) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 4500) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+                    
+                case "STATUS_MESSWERTBLOCK_LESEN#STAT_UBATT_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    
+                    // result format: {0,[DIGITS TOTAL INCL COMMA],[0|0.0|0.00|0.000...]}
+                    result = string.Format(ActivityMain.Culture, "{0,4:0.0}", value);
+                    
+                    if (found && value < 10.5) textColor = Android.Graphics.Color.Red;
+                    else if (found && value < 11.5) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value <= 12.5) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 13.2) textColor = Android.Graphics.Color.Gray;
+                    else if (found && value <= 14.5) textColor = Android.Graphics.Color.White;
+                    else if (found && value > 14.5) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+
+
+                case "STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    result = string.Format(ActivityMain.Culture, "{0,3:0}", value);
+                    
+                    if (found && value < 75) textColor = Android.Graphics.Color.Blue;
+                    else if (found && value <= 105) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 110) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 115) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 115) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+            }
+            return result;
+        }
+    }
+      ]]>
+    </code>
+  </page>
+</fragment>

+ 0 - 0
E46 M57N/IBUS_App_BT.cccfg → Fahrzeugkonfigurationen/E46 M57N/IBUS_App_BT.cccfg


+ 0 - 0
E46 M57N/IBUS_App_USB.cccfg → Fahrzeugkonfigurationen/E46 M57N/IBUS_App_USB.cccfg


+ 0 - 0
E46 M57N/IBUS_App_noCode.ccpage → Fahrzeugkonfigurationen/E46 M57N/IBUS_App_noCode.ccpage


+ 0 - 0
E46 M57N/IHKA46_3.ccpage → Fahrzeugkonfigurationen/E46 M57N/IHKA46_3.ccpage


+ 0 - 0
E46 M57N/KOMBI46R.ccpage → Fahrzeugkonfigurationen/E46 M57N/KOMBI46R.ccpage


+ 0 - 0
E46 M57N/KOMBI46R_SIA.ccpage → Fahrzeugkonfigurationen/E46 M57N/KOMBI46R_SIA.ccpage


+ 0 - 0
E46 M57N/KOMBI46R_SIA.txt → Fahrzeugkonfigurationen/E46 M57N/KOMBI46R_SIA.txt


+ 0 - 0
E46 M57N/KOMBI46R_SIA_4buttons.ccpage → Fahrzeugkonfigurationen/E46 M57N/KOMBI46R_SIA_4buttons.ccpage


+ 0 - 0
E46 M57N/LSZ_2.ccpage → Fahrzeugkonfigurationen/E46 M57N/LSZ_2.ccpage


+ 0 - 0
E46 M57N/LWS5_1B.ccpage → Fahrzeugkonfigurationen/E46 M57N/LWS5_1B.ccpage


+ 35 - 0
Fahrzeugkonfigurationen/E46 M57N/Laufunruhe.ccpage

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<fragment xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
+  <page name="Laufunruhe" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="Laufunruhe.log">
+    <strings>
+      <string name="Laufunruhe">Uneven running</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT"> Cyl. 1 [mg/str]</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT"> Cyl. 2 [mg/str]</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT"> Cyl. 3 [mg/str]</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT"> Cyl. 4 [mg/str]</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT"> Cyl. 5 [mg/str]</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT"> Cyl. 6 [mg/str]</string>
+    </strings>
+	<strings lang="de">
+      <string name="Laufunruhe">Laufunruhe</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT"> Zyl. 1 [mg/Hub]</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT"> Zyl. 2 [mg/Hub]</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT"> Zyl. 3 [mg/Hub]</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT"> Zyl. 4 [mg/Hub]</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT"> Zyl. 5 [mg/Hub]</string>
+      <string name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT"> Zyl. 6 [mg/Hub]</string>
+    </strings>
+	<jobs sgbd="d50m57e1">
+	  <job name="START_SYSTEMCHECK_ZYL" args_first="LLR_EIN" results="JOB_STATUS">
+	  </job>
+      <job name="STATUS_LAUFUNRUHE_LLR_MENGE" results="STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT;STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT;STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT;STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT;STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT;STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT">
+        <display name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT" format=".2R" display-order="1" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT" />
+        <display name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT" format=".2R" display-order="2" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT" />
+        <display name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT" format=".2R" display-order="3" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT" />
+        <display name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT" format=".2R" display-order="4" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT" />
+        <display name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT" format=".2R" display-order="5" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT" />
+        <display name="!JOB#STATUS_LAUFUNRUHE_LLR_MENGE#STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT" format=".2R" display-order="6" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT" />
+      </job>
+	</jobs>
+  </page>
+</fragment>

+ 62 - 0
Fahrzeugkonfigurationen/E46 M57N/Laufunruhe_code.ccpage

@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<fragment xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
+  <page name="Laufunruhe" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="Laufunruhe.log">
+    <strings>
+      <string name="Laufunruhe">Uneven running</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT"> Cyl. 1 [mg/str]</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT"> Cyl. 2 [mg/str]</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT"> Cyl. 3 [mg/str]</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT"> Cyl. 4 [mg/str]</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT"> Cyl. 5 [mg/str]</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT"> Cyl. 6 [mg/str]</string>
+    </strings>
+	<strings lang="de">
+      <string name="Laufunruhe">Laufunruhe</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT"> Zyl. 1 [mg/Hub]</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT"> Zyl. 2 [mg/Hub]</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT"> Zyl. 3 [mg/Hub]</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT"> Zyl. 4 [mg/Hub]</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT"> Zyl. 5 [mg/Hub]</string>
+      <string name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT"> Zyl. 6 [mg/Hub]</string>
+    </strings>
+      <display name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT" format=".2R" display-order="1" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT" />
+      <display name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT" format=".2R" display-order="2" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT" />
+      <display name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT" format=".2R" display-order="3" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT" />
+      <display name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT" format=".2R" display-order="4" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT" />
+      <display name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT" format=".2R" display-order="5" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT" />
+      <display name="STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT" result="STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT" format=".2R" display-order="6" grid-type="simple-gauge-dot" min-value="-10" max-value="10" log_tag="STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT" />
+    
+    <jobs sgbd="d50m57e1"/>
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {
+        public void ExecuteJob(EdiabasNet ediabas, ref MultiMap<string, EdiabasNet.ResultData> resultDict, bool firstCall)
+        {	
+            if (firstCall) {
+                ediabas.ArgString = string.Empty;
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                
+                ediabas.ExecuteJob("START_SYSTEMCHECK_ZYL");
+            }
+            else {
+                ediabas.ArgString = string.Empty;
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "STAT_LAUFUNRUHE_LLR_MENGE_ZYL1_WERT;STAT_LAUFUNRUHE_LLR_MENGE_ZYL2_WERT;STAT_LAUFUNRUHE_LLR_MENGE_ZYL3_WERT;STAT_LAUFUNRUHE_LLR_MENGE_ZYL4_WERT;STAT_LAUFUNRUHE_LLR_MENGE_ZYL5_WERT;STAT_LAUFUNRUHE_LLR_MENGE_ZYL6_WERT";
+                
+                ediabas.ExecuteJob("STATUS_LAUFUNRUHE_LLR_MENGE");
+				
+				List<Dictionary<string, EdiabasNet.ResultData>> resultSets = ediabas.ResultSets;
+				if (resultSets != null && resultSets.Count >= 2)
+				{
+					//EdiabasNet.ResultData resultData;
+					EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+				}
+            }
+        }
+    }
+    ]]>
+    </code>
+  </page>
+</fragment>

+ 0 - 0
E46 M57N/PDCACT.ccpage → Fahrzeugkonfigurationen/E46 M57N/PDCACT.ccpage


+ 0 - 0
E46 M57N/Pages.ccpages → Fahrzeugkonfigurationen/E46 M57N/Pages.ccpages


+ 0 - 0
E46 M57N/RPA_DSC_MK60.ccpage → Fahrzeugkonfigurationen/E46 M57N/RPA_DSC_MK60.ccpage


+ 0 - 0
E46 M57N/Translation.xml.zip → Fahrzeugkonfigurationen/E46 M57N/Translation.xml.zip


+ 36 - 0
README.md

@@ -0,0 +1,36 @@
+# DeepOBDConf
+
+Verschiedene erweiterte Konfigurationen (Seiten) für DeepOBD - einiges davon mit erweiterter Funktionalität inkl. Steuer- und Abgleichfunktionen durch User defined code. 
+Hauptsächlich für die Baureihen E46 und E39. 
+
+Detailinfos in den jeweiligen Unterverzeichnissen. 
+
+ediabaslib/DeepOBD auf Github:
+https://github.com/uholeschak/ediabaslib
+
+Allgemeine Informationen zu User defined code: 
+https://github.com/uholeschak/ediabaslib/blob/master/docs/Page_specification.md#user-defined-code
+
+
+
+## Funktionsübersicht
+
+##### [Dashboard-Color](Dashboard-Color/)
+
+Hauptseite/Dashboard mit werteabhängig gefärbten Anzeigen
+
+##### [RPA-Reset](RPA-Reset/)
+
+Initialisierung der Reifen-Pannen-Anzeige (DSC-Funktion), z.B. wenn diese per Codierung "nachgerüstet" wurde, aber kein RPA-Initialisierungsschalter vorhanden ist. 
+
+
+##### [DDE-Abgleich](DDE-Abgleich/)
+
+Verstellung/Programmierung von Abgleichwerten in DDE Steuergeräten (Anhebung Frischluftrate, Leerlaufdrehzahl)
+
+
+##### [SIA-Reset](SIA-Reset/)
+
+Service Intervall Anzeige - Daten auslesen und Service-Reset (Inspektion, Ölservice, Zeitinspektion) ausführen. 
+
+

+ 17 - 0
RPA-Reset/README.md

@@ -0,0 +1,17 @@
+# DeepOBDConf
+
+## RPA-Reset
+
+Fahrzeuge: E46 mit DSC MK60 (andere Fahrzeuge mit DSC MK60 sehr wahrscheinlich ebenfalls)
+
+Bei einigen Fahrzeugen - z.B. E46 Facelift - mit DSC MK60 kann durch Codierung eine Reifen-Pannen-Anzeige aktiviert werden. Es handelt sich dabei um eine Funktion des DSC, welche Druckverlust in __einem Reifen während der Fahrt__ erkennt und meldet und funktioniert durch Vergleich der einzelnen Raddrehzahlen. Je nach Fahrzeug und Ausstattung erfolgt die Warnung über eine Kontrollleuchte oder Displaytext. 
+
+Ist RPA als Sonderausstattung ab Werk vorhanden, so befindet sich ein RPA-Resetschalter im Schaltzentrum Mittelkonsole. Dieser wird benötigt um die RPA neu zu initialisieren (ist nach Reifenschaden/Druckverlust und nach dem Reifenwechsel notwendig). 
+
+Rüstet man die RPA nur via Codierung nach, so kann diese Initialisierung nur über geeignete Diagnosesoftware durchgeführt werden. Die Nachrüstung des Tasters selbst ist zwar machbar, aber aufwendig, da die Ansteuerung vom Schaltzentrum über eine eigene Leitung und nicht via Bus erfolgt. Man müsste also eine Leitung von der Mittelkonsole zum DSC-Steuergerät (bei E46 im Motorraum unterhalb des Bremskraftverstärkers, sehr schlecht erreichbar) verlegen und einpinnen. 
+
+Diese DeepOBD-Konfiguration ermöglicht den Reset bequem auf Knopfdruck via Android-Headunit oder Handy und zeigt den Kilometerstand der letzten Initialisierung, Warnung sowie den aktuellen Status an. 
+
+
+
+![](RPA_DSC_MK60.png)

+ 129 - 0
RPA-Reset/RPA_DSC_MK60.ccpage

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<fragment xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
+  <page name="RPA" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="RPA_DSC_MK60.log">
+    <strings>
+      <string name="RPA">RPA</string>
+      <string name="!JOB#STATUS_LESEN_RPA#WARNUNG_AKTUELL"> RPA current warning</string>
+      <string name="!JOB#STATUS_LESEN_RPA#STATUS_KM_RESET"> kilometers last initialisation</string>
+      <string name="!JOB#STATUS_LESEN_RPA#STATUS_KM_WARNUNG"> kilometers last warning</string>
+    </strings>
+	<strings lang="de">
+      <string name="RPA">RPA</string>
+      <string name="!JOB#STATUS_LESEN_RPA#WARNUNG_AKTUELL"> RPA Warnung aktuell</string>
+      <string name="!JOB#STATUS_LESEN_RPA#STATUS_KM_RESET"> Kilometerstand letzte Initialisierung</string>
+      <string name="!JOB#STATUS_LESEN_RPA#STATUS_KM_WARNUNG"> Kilometerstand letzte Warnung</string>
+    </strings>
+    <display name="!JOB#STATUS_LESEN_RPA#WARNUNG_AKTUELL" result="WARNUNG_AKTUELL" format="" display-order="0" grid-type="text" min-value="0" max-value="100" log_tag="WARNUNG_AKTUELL" />
+    <display name="!JOB#STATUS_LESEN_RPA#STATUS_KM_RESET" result="STATUS_KM_RESET" format="" display-order="0" grid-type="text" min-value="0" max-value="100" log_tag="STATUS_KM_RESET" />
+    <display name="!JOB#STATUS_LESEN_RPA#STATUS_KM_WARNUNG" result="STATUS_KM_WARNUNG" format="" display-order="0" grid-type="text" min-value="0" max-value="100" log_tag="STATUS_KM_WARNUNG" />
+    <jobs sgbd="dsc_mk60" />
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {
+        // Button deklarieren
+        private Button buttonRPAReset;
+        
+        // Ablaufvariable deklarieren und initialisieren
+        // diese boolsche Variable wird vom Button auf true gesetzt und in der ExecuteJob Methode ausgewertet
+        // wo dann ggf. der eigentliche Befehl ans Steuergerät ausgeführt wird
+        private bool doRPAReset = false;    
+        
+        // Seitenaufbau: 
+        // <display... tags müssen direkt unter <page... stehen und result="RESULT_NAME" (ohne job name) enthalten
+        // diese werden unterhalb von der Funktion ExecuteJob befüllt
+        // <job... tags wie normalerweise gibt es nicht
+        // Es darf nur ein <jobs> tag in dieser form vorhanden sein: <jobs sgbg="sgbdname" />
+        // Jedenfalls wurde bei meinen Tests die ExecuteJobs Funktion niemals aufgerufen wenn in der ccpage 
+        // jobs im normalen Format enthalten waren. Ob das wirklich so ist oder ich einen anderen Fehler hatte 
+        // muss ich erst noch rausfinden. 
+        
+        public void CreateLayout(ActivityMain activity, JobReader.PageInfo pageInfo, LinearLayout pageLayout)
+        {
+            LinearLayout buttonLayout = new LinearLayout(activity);
+            buttonLayout.Orientation = Orientation.Horizontal;
+
+            LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MatchParent,
+                ViewGroup.LayoutParams.WrapContent);
+            buttonLayoutParams.Weight = 1;
+
+            buttonRPAReset = new Button(activity);
+            buttonRPAReset.Text = "RPA RESET";
+            buttonRPAReset.Click += delegate
+            {
+                // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+                doRPAReset = true;
+                
+                // Benachrichtung anzeigen wenn man will
+                ActivityMain.ShowNotification(activity, 0, 2,
+                    "RPA RESET",
+                    "Reifen Pannen Anzeige am DSC MK60 wird zurückgesetzt...");
+            };
+            buttonLayout.AddView(buttonRPAReset, buttonLayoutParams);
+
+            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MatchParent,
+                ViewGroup.LayoutParams.WrapContent);
+            pageLayout.AddView(buttonLayout, layoutParams);
+        }
+
+        public void DestroyLayout(JobReader.PageInfo pageInfo)
+        {
+            buttonRPAReset = null;
+        }
+        
+        public void UpdateLayout(JobReader.PageInfo pageInfo, bool pageValid, bool threadActive)
+        {
+            if ((buttonRPAReset == null))
+            {
+                return;
+            }
+        }
+
+        public void ExecuteJob(EdiabasNet ediabas, ref MultiMap<string, EdiabasNet.ResultData> resultDict, bool firstCall)
+        {
+            List<Dictionary<string, EdiabasNet.ResultData>> resultSets;  // hier werden die job results zwischengespeichert
+            
+            // unterhalb der/die JOB(s) zur Datenanzeige
+            
+            ediabas.ArgString = string.Empty;
+            ediabas.ArgBinaryStd = null;
+            ediabas.ResultsRequests = string.Empty;
+            
+            ediabas.ExecuteJob("STATUS_LESEN_RPA");
+            
+            resultSets = ediabas.ResultSets;
+            if (resultSets != null && resultSets.Count >= 2)
+            {
+                // results der aktuellen Abfrage mit unveränderten result namen übernehmen
+                EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+            }
+            
+            // ENDE JOBs
+            
+            // Button JOB - wenn der RPA RESET button kürzlich betätigt wurde wird dieser code block ausgeführt
+            if (doRPAReset) {
+                ediabas.ArgString = string.Empty;
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                
+                ediabas.ExecuteJob("RPA_RESET");
+                
+                // JOB RESULT ermitteln (wird derzeit nicht weiter verwendet weil man es anhand der geänderten Daten 
+                // und den blinkenden LEDs im KOMBI eh sofort sieht)
+                //resultSets = ediabas.ResultSets;
+                //if (resultSets != null && resultSets.Count >= 2)
+                //{
+                //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+                //}
+                
+                // Ablaufvariable wieder zurücksetzen, sonst würde dieser Befehl nun bei jedem weiteren Durchlauf ausgeführt werden...
+                doRPAReset = false;
+            }
+        }
+    }
+    ]]>
+    </code>
+  </page>
+</fragment>

BIN
RPA-Reset/RPA_DSC_MK60.png


+ 2 - 2
E39/KOMBI39C_SIA.ccpage → SIA-Reset/KOMBI39C_SIA.ccpage

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <fragment xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
-  <page name="SIA" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="KOMBI_SIA.log">
+  <page name="SIA" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="KOMBI39C_SIA.log">
     <strings lang="de">
       <string name="SIA">SIA</string>
       <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_SERVICE_TEXT"> letzter Service war</string>
@@ -226,7 +226,7 @@
                 doSIAZeitReset = false;
             }
             
-			// KOMBI30_C hat diesen job nicht
+			// KOMBI39_C hat diesen job nicht
             //  // Button 4 - SIA Korrektur
             //  if (doSIAKorrektur) {
             //      ediabas.ArgString = string.Empty;

+ 255 - 0
SIA-Reset/KOMBI46R_SIA.ccpage

@@ -0,0 +1,255 @@
+<?xml version="1.0" encoding="utf-8"?>
+<fragment xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
+  <page name="SIA" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="KOMBI46R_SIA.log">
+    <strings lang="de">
+      <string name="SIA">SIA</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_SERVICE_TEXT"> letzter Service war</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_INSPEKTIONSGRENZE_WERT"> Inspektionsgrenze Kraftstoff [l]</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_KRAFTSTOFFMENGE_WERT"> Kraftstoffmenge seit letztem Service [l]</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_ZEIT_INSP_ZAEHLER_WERT"> Zeitinspektionszähler [Tage]</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_ZEITGRENZE_WERT"> Zeitgrenze [Tage]</string>
+      <string name="!JOB#ZEITINPEKTIONSDATUM_LESEN#ZEITINSPEKTION_MONAT"> nächste Zeitinspektion [Monat]</string>
+      <string name="!JOB#ZEITINPEKTIONSDATUM_LESEN#ZEITINSPEKTION_JAHR"> nächste Zeitinspektion [Jahr]</string>
+    </strings>
+	<strings>
+      <string name="SIA">SIA</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_SERVICE_TEXT"> last service was</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_INSPEKTIONSGRENZE_WERT"> inspection limit fuel [l]</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_KRAFTSTOFFMENGE_WERT"> fuel since last service [l]</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_ZEIT_INSP_ZAEHLER_WERT"> inspection time counter [days]</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_ZEITGRENZE_WERT"> time limit [days]</string>
+      <string name="!JOB#ZEITINPEKTIONSDATUM_LESEN#ZEITINSPEKTION_MONAT"> next time inspection [month]</string>
+      <string name="!JOB#ZEITINPEKTIONSDATUM_LESEN#ZEITINSPEKTION_JAHR"> next time inspection [year]</string>
+    </strings>
+    <display name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_SERVICE_TEXT" result="STAT_SERVICE_TEXT" format="T" log_tag="STAT_SERVICE_TEXT" />
+    <display name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_INSPEKTIONSGRENZE_WERT" result="STAT_INSPEKTIONSGRENZE_WERT" format="L" log_tag="STAT_INSPEKTIONSGRENZE_WERT" />
+    <display name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_KRAFTSTOFFMENGE_WERT" result="STAT_KRAFTSTOFFMENGE_WERT" format="L" log_tag="STAT_KRAFTSTOFFMENGE_WERT" />
+    <display name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_ZEIT_INSP_ZAEHLER_WERT" result="STAT_ZEIT_INSP_ZAEHLER_WERT" format="L" log_tag="STAT_ZEIT_INSP_ZAEHLER_WERT" />
+    <display name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_ZEITGRENZE_WERT" result="STAT_ZEITGRENZE_WERT" format="L" log_tag="STAT_ZEITGRENZE_WERT" />
+    <display name="!JOB#ZEITINPEKTIONSDATUM_LESEN#ZEITINSPEKTION_MONAT" result="ZEITINSPEKTION_MONAT" format="L" log_tag="ZEITINSPEKTION_MONAT" />
+    <display name="!JOB#ZEITINPEKTIONSDATUM_LESEN#ZEITINSPEKTION_JAHR" result="ZEITINSPEKTION_JAHR" format="L" log_tag="ZEITINSPEKTION_JAHR" />
+    
+    <jobs sgbd="kombi46r" />
+    
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {
+        private Button buttonSIAWegReset;
+        //private Button buttonSIAOelReset;
+        private Button buttonSIAZeitReset;
+        private Button buttonSIAKorrektur;
+        private bool doSIAWegReset = false;
+        //private bool doSIAOelReset = false;
+        private bool doSIAZeitReset = false;
+        private bool doSIAKorrektur = false;
+        
+        private int serviceArt;
+        
+        public void CreateLayout(ActivityMain activity, JobReader.PageInfo pageInfo, LinearLayout pageLayout)
+        {
+            LinearLayout buttonLayout = new LinearLayout(activity);
+            buttonLayout.Orientation = Orientation.Horizontal;
+
+            LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MatchParent,
+                ViewGroup.LayoutParams.WrapContent);
+            buttonLayoutParams.Weight = 1;
+            
+            // Button 1
+            buttonSIAWegReset = new Button(activity);
+            buttonSIAWegReset.Text = "RESET INSPEKTION / ÖLSERVICE";
+            buttonSIAWegReset.Click += delegate
+            {
+                // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+                doSIAWegReset = true;  
+                
+                // Benachrichtung anzeigen wenn man will
+                ActivityMain.ShowNotification(activity, 0, 2,
+                    "SIA RESET",
+                    "Weginspektion wird zurückgesetzt...");
+            };
+            buttonLayout.AddView(buttonSIAWegReset, buttonLayoutParams);
+            
+            //// Button 2
+            //buttonSIAOelReset = new Button(activity);
+            //buttonSIAOelReset.Text = "RESET ÖLSERVICE";
+            //buttonSIAOelReset.Click += delegate
+            //{
+            //    // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+            //    doSIAOelReset = true;  
+            //    
+            //    // Benachrichtung anzeigen wenn man will
+            //    ActivityMain.ShowNotification(activity, 0, 2,
+            //        "SIA RESET",
+            //        "Ölservice wird zurückgesetzt...");
+            //};
+            //buttonLayout.AddView(buttonSIAOelReset, buttonLayoutParams);
+            
+            // Button 3
+            buttonSIAZeitReset = new Button(activity);
+            buttonSIAZeitReset.Text = "RESET ZEIT- INSPEKTION";
+            buttonSIAZeitReset.Click += delegate
+            {
+                // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+                doSIAZeitReset = true;  
+                
+                // Benachrichtung anzeigen wenn man will
+                ActivityMain.ShowNotification(activity, 0, 2,
+                    "SIA RESET",
+                    "Zeitinspektion wird zurückgesetzt...");
+            };
+            buttonLayout.AddView(buttonSIAZeitReset, buttonLayoutParams);
+            
+            // Button 4
+            buttonSIAKorrektur = new Button(activity);
+            buttonSIAKorrektur.Text = "KORREKTUR WECHSEL INSPEKTION <> ÖLSERVICE";
+            buttonSIAKorrektur.Click += delegate
+            {
+                // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
+                doSIAKorrektur = true;  
+                
+                // Benachrichtung anzeigen wenn man will
+                ActivityMain.ShowNotification(activity, 0, 2,
+                    "SIA",
+                    "Wechsel zwischen Inspektion <> Ölservice wird durchgeführt...");
+            };
+            buttonLayout.AddView(buttonSIAKorrektur, buttonLayoutParams);
+
+            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
+                ViewGroup.LayoutParams.MatchParent,
+                ViewGroup.LayoutParams.WrapContent);
+            pageLayout.AddView(buttonLayout, layoutParams);
+        }
+
+        public void DestroyLayout(JobReader.PageInfo pageInfo)
+        {
+            buttonSIAWegReset = null;
+            //buttonSIAOelReset = null;
+            buttonSIAZeitReset = null;
+            buttonSIAKorrektur = null;
+        }
+
+        public void ExecuteJob(EdiabasNet ediabas, ref MultiMap<string, EdiabasNet.ResultData> resultDict, bool firstCall)
+        {
+            List<Dictionary<string, EdiabasNet.ResultData>> resultSets;
+            
+            // Job 1
+            ediabas.ArgString = string.Empty;
+            ediabas.ArgBinaryStd = null;
+            ediabas.ResultsRequests = string.Empty;
+            
+            ediabas.ExecuteJob("STATUS_AIF_SIA_DATEN_LESEN");
+            
+            resultSets = ediabas.ResultSets;
+            if (resultSets != null && resultSets.Count >= 2)
+            {
+                EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+            }
+            
+            EdiabasNet.ResultData resultData;
+            if (resultSets[1].TryGetValue("STAT_SERVICE_ART", out resultData))
+                {
+                    if (resultData.OpData is Int64)
+                    {
+                        serviceArt = (int)((Int64)resultData.OpData);
+                    }
+                }
+            
+            
+            // Job 2
+            ediabas.ArgString = string.Empty;
+            ediabas.ArgBinaryStd = null;
+            ediabas.ResultsRequests = string.Empty;
+            
+            ediabas.ExecuteJob("ZEITINSPEKTIONSDATUM_LESEN");
+            
+            resultSets = ediabas.ResultSets;
+            if (resultSets != null && resultSets.Count >= 2)
+            {
+               EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+            }
+            
+            
+            // Button Jobs
+            
+            // Button 1 - SIA RESET Weginspektion/Oelservice
+            if (doSIAWegReset) {
+                
+                if(serviceArt == 0) ediabas.ArgString = "Oel_Reset";
+                if(serviceArt == 1) ediabas.ArgString = "Weg_Reset";
+                
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                
+                ediabas.ExecuteJob("SIA_RESET");
+                
+                //resultSets = ediabas.ResultSets;
+                //if (resultSets != null && resultSets.Count >= 2)
+                //{
+                //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+                //}
+                
+                // ablaufvariable wieder zurücksetzen, sonst würde diese funktion nun bei jedem folgenden durchlauf ausgeführt werden...
+                doSIAWegReset = false;
+            }
+            
+            //// Button 2 - SIA RESET Ölservice
+            //if (doSIAOelReset) {
+            //    ediabas.ArgString = "Oel_Reset";
+            //    ediabas.ArgBinaryStd = null;
+            //    ediabas.ResultsRequests = "JOB_STATUS";
+            //    
+            //    ediabas.ExecuteJob("SIA_RESET");
+            //    
+            //    //resultSets = ediabas.ResultSets;
+            //    //if (resultSets != null && resultSets.Count >= 2)
+            //    //{
+            //    //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+            //    //}
+            //    
+            //    // ablaufvariable wieder zurücksetzen, sonst würde diese funktion nun bei jedem folgenden durchlauf ausgeführt werden...
+            //    doSIAOelReset = false;
+            //}
+            
+            // Button 3 - SIA RESET Zeitinspektion
+            if (doSIAZeitReset) {
+                ediabas.ArgString = "Zeit_Reset";
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                
+                ediabas.ExecuteJob("SIA_RESET");
+                
+                //resultSets = ediabas.ResultSets;
+                //if (resultSets != null && resultSets.Count >= 2)
+                //{
+                //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+                //}
+                
+                // ablaufvariable wieder zurücksetzen, sonst würde diese funktion nun bei jedem folgenden durchlauf ausgeführt werden...
+                doSIAZeitReset = false;
+            }
+            
+            // Button 4 - SIA Korrektur
+            if (doSIAKorrektur) {
+                ediabas.ArgString = string.Empty;
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                
+                ediabas.ExecuteJob("SIA_KORREKTUR_SCHREIBEN");
+                
+                //resultSets = ediabas.ResultSets;
+                //if (resultSets != null && resultSets.Count >= 2)
+                //{
+                //  EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+                //}
+                
+                // ablaufvariable wieder zurücksetzen, sonst würde diese funktion nun bei jedem folgenden durchlauf ausgeführt werden...
+                doSIAKorrektur = false;
+            }
+        }
+    }
+    ]]>
+    </code>
+  </page>
+</fragment>

+ 56 - 0
SIA-Reset/KOMBI46R_SIA.txt

@@ -0,0 +1,56 @@
+
+KOMBI46R SIA
+
+JOB: STATUS_AIF_SIA_DATEN_LESEN
+RESULTS:
+    STAT_SERVICE_ART
+	    Art des letzten Service: 0 = Inspektion, 1 = Ölservice
+		Kombiinstrument zeit bei Zündung an das jeweils andere als nächstes Service an
+    STAT_SERVICE_TEXT
+	    Art des letzten Service (Text)
+		Kombiinstrument zeit bei Zündung an das jeweils andere als nächstes Service an
+    STAT_ZEIT_INSP_ZAEHLER_WERT
+	    Tage seit letztem Zeitservice reset
+    STAT_INSPEKTIONSGRENZE_WERT
+	    Grenzwert für Inspektion/Ölservice
+		in Liter Kraftstoffverbrauch seit letztem Reset
+    STAT_ZEITGRENZE_WERT
+	    maximale Zeit bis das Zeitservice fällig wird, in Tagen
+    STAT_KRAFTSTOFFMENGE_WERT
+	    Kraftstoffmenge seit letztem SIA reset
+	STAT_VORGEZOGENE_ZEITINSPEKTION
+		= 1 wenn vorgezogene Zeitinspektion möglich (unklar wonach das entschieden wird)
+
+Kombiinstrument errechnet die Rest-KM die bei Zündung an gezeigt werden folgendermaßen:
+	(STAT_INSPEKTIONSGRENZE_WERT - STAT_KRAFTSTOFFMENGE_WERT) * 100 / DURCHSCHNITTSVERBRAUCH
+	z.B.: (2400 - 1342) * 100 / 7.8 = 13564 km (wird dann noch auf ganze 50 gerundet)
+	-> leider kann dies in DeepOBD nicht nachgebildet werden, da kein Zugriff auf BC-Daten (Durchschnittsverbrauch) via OBD
+
+JOB: STATUS_SIA_FINISH
+RESULTS:
+    STAT_LITER_WERT
+	    verbrauchte Benzinmenge
+		(identisch zu STATUS_AIF_SIA_DATEN_LESEN -> STAT_KRAFTSTOFFMENGE_WERT)
+    STAT_TAGES_WERT
+	    Zeit (Tage) seit letztem Zeitservice reset
+		(den Wert gibt bei mir im 330d M57N Bj 2004 NICHT)
+		
+
+JOB: ZEITINPEKTIONSDATUM_LESEN
+    ZEITINSPEKTION_MONAT	0x000A = 10
+    ZEITINSPEKTION_JAHR		0x0015 = 21
+	SERVICE_INTERVALL		0x0003 = 3 (Bedeutung unklar, laut job info gibt es 0=US, 1=Japan, 2=ECE)
+		
+Resetfunktionen:
+
+SIA_RESET
+	mögliche Parameter:
+	Oel_Reset
+	Weg_Reset
+	Zeit_Reset
+	Weg_Reset_Werk
+	
+ZEITINSPEKTIONSDATUM_SCHREIBEN
+	2 argumente mit ; getrennt: monat[1-12];jahr[0-99]
+	
+	

+ 28 - 0
SIA-Reset/README.md

@@ -0,0 +1,28 @@
+# DeepOBDConf
+
+## SIA-Reset
+
+Fahrzeuge: E46, E39
+
+Funktionen:
+
+- Anzeige der aktuellen Service Intervall Daten
+- Nur E46: Anzeige nächstes Zeitinspektionsdatum (Monat/Jahr)
+- Reset Inspektion/Ölservice (automatische Erkennung und Reset der als nächstes fälligen Art)
+- Reset Zeitinspektion
+- Nur E46: Korrektur/Wechsel zwischen Inspektion und Ölservice (diese Funktion existiert im E39-Kombiinstrument leider nicht)
+
+
+
+Die Serviceintervallanzeige rechnet intern nicht in Kilometer, sondern in Liter Kraftstoffverbrauch, daher kann auch nur dies angezeigt werden. 
+Das Kombiinstrument errechnet die Rest-KM die bei Zündung an gezeigt werden (E46) folgendermaßen:
+
+```
+(INSPEKTIONSGRENZE_L - KRAFTSTOFFMENGE_L) * 100 / DURCHSCHNITTSVERBRAUCH_L_100km
+```
+
+Da über die Diagnoseschnittstelle die Bordcomputerdaten und somit der Durchschnittsverbrauch nicht zur Verfügung stehen, können in der DeepOBD-Seite leider keine Rest-Kilometer angezeigt werden. 
+
+
+
+![](SIA_E46.png)

BIN
SIA-Reset/SIA_E46.png