Parcourir la source

automatische Leerlaufanhebung hinzugefügt

FloKra il y a 4 ans
Parent
commit
995a4e0ca5
34 fichiers modifiés avec 4863 ajouts et 10 suppressions
  1. 500 0
      DDE-AutoLLA/DDEAutoLLA_D50M57E1.ccpage
  2. 51 0
      DDE-AutoLLA/README.md
  3. 680 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/BmwDeepObd.xsd
  4. 63 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/D50M57E1.ccpage
  5. 30 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/DDEAbgleich.txt
  6. 354 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/DDEAbgleich_D50M57E1.ccpage
  7. 438 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/DDEAbgleich_D50M57E1_noProg.ccpage
  8. 95 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/DDEGenerator.ccpage
  9. 82 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/DDE_fuel_air.ccpage
  10. 44 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/DSC_MK60.ccpage
  11. 40 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/Errors.ccpage
  12. 30 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/Errors_old.ccpage
  13. 500 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/Home.ccpage
  14. 380 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/Home1.ccpage
  15. 133 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/IBUS_App.ccpage
  16. 5 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/IBUS_App_BT.cccfg
  17. 5 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/IBUS_App_USB.cccfg
  18. 71 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/IBUS_App_noCode.ccpage
  19. 69 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/IHKA46_3.ccpage
  20. 125 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/KOMBI46R.ccpage
  21. 255 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/KOMBI46R_SIA.ccpage
  22. 56 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/KOMBI46R_SIA.txt
  23. 234 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/KOMBI46R_SIA_4buttons.ccpage
  24. 160 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/LSZ_2.ccpage
  25. 16 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/LWS5_1B.ccpage
  26. 35 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/Laufunruhe.ccpage
  27. 62 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/Laufunruhe_code.ccpage
  28. 39 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/PDCACT.ccpage
  29. 22 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/Pages.ccpages
  30. 147 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/README.txt
  31. 129 0
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/RPA_DSC_MK60.ccpage
  32. BIN
      Fahrzeugkonfigurationen/E46 M57N AutoLLA/Translation.xml.zip
  33. 6 6
      Fahrzeugkonfigurationen/E46 M57N/DDEAbgleich_D50M57E1.ccpage
  34. 7 4
      Fahrzeugkonfigurationen/E46 M57N/DDEGenerator.ccpage

+ 500 - 0
DDE-AutoLLA/DDEAutoLLA_D50M57E1.ccpage

@@ -0,0 +1,500 @@
+<?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="HOME" display-mode="grid" fontsize="medium" gauges-portrait="3" gauges-landscape="5" logfile="DME_DDE.log">
+    <strings lang="de">
+      <string name="HOME">HOME</string>
+	  <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT"> Kühlmitteltemperatur [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT"> Ladelufttemp. [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> Drehzahl [U/min]</string>
+	  <string name="!JOB#LLA_ABGLEICH_LESEN_WERT"> Anhebung Leerlaufdrehzahl [u/min]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> Drehmoment [Nm]:</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 PWM [%]</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_LUFTMASSE_PRO_HUB_WERT"> Luftmasse [mg/Hub]</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_GESCHWINDIGKEIT_WERT"> Geschwindigkeit [km/h]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_FAHRZEUGBESCHLEUNIGUNG_WERT"> Beschleunigung [m/s²]</string>
+	  
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUPPLUNGSSCHALTER_ROH_WERT">  Kupplungsschalter</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KLIMAKOMPRESSOR_STATUS_WERT">  Klimakompressor</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_BEREITSCHAFT_KLIMA_WERT">  Klima Bereitschaft</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="HOME">HOME</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT"> coolant [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT"> charge air temperature [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> engine speed [U/min]</string>
+	  <string name="!JOB#LLA_ABGLEICH_LESEN_WERT"> increase idle speed [rpm]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> torque [Nm]:</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"> aux heater PWM [%]</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_LUFTMASSE_PRO_HUB_WERT"> air mass [mg/stroke]</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_GESCHWINDIGKEIT_WERT"> speed [km/h]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_FAHRZEUGBESCHLEUNIGUNG_WERT"> acceleration [m/s²]</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>
+	
+    <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_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_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#LLA_ABGLEICH_LESEN_WERT" result="LLA_ABGLEICH_LESEN_WERT" format="L" display-order="0" grid-type="simple-gauge-round" min-value="0" max-value="250" log_tag="LLA" />
+    <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" 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" grid-type="simple-gauge-round" min-value="0" max-value="100" log_tag="STAT_ZUHEIZER_ANSTEUERUNG_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_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_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_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" />    
+    <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_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_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_KUPPLUNGSSCHALTER_ROH_WERT" result="STAT_KUPPLUNGSSCHALTER_ROH_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1" log_tag="STAT_KUPPLUNGSSCHALTER_ROH_WERT" />
+	<display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KLIMAKOMPRESSOR_STATUS_WERT" result="STAT_KLIMAKOMPRESSOR_STATUS_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1" log_tag="STAT_KLIMAKOMPRESSOR_STATUS_WERT" />
+	<display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_BEREITSCHAFT_KLIMA_WERT" result="STAT_BEREITSCHAFT_KLIMA_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1" log_tag="STAT_BEREITSCHAFT_KLIMA_WERT" />
+	
+    <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" />
+	
+	<jobs sgbd="D50M57E1" />
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {	
+		// PWM-Wert Ansteuerung Zuheizer, ab dem dieser als AN erkannt wird
+		private double conf_ZuheizerAnAb = 25;
+		
+		// PWM-Wert Generatorlast, ab dem eine LL-Anhebung erfolgt
+		private double conf_GeneratorlastHochAb = 60;
+		private double conf_GeneratorlastSehrHochAb = 80;
+		
+		// Motortemperaturen
+		private double conf_Temp_MotorSehrKaltBis = 25;
+		private double conf_Temp_MotorKaltBis = 65;
+		private double conf_Temp_MotorBetriebstempAb = 75;
+		private double conf_Temp_MotorBetriebstempBis = 95;
+		private double conf_Temp_MotorHeissAb = 100;
+		
+		// Ziel-Leerlaufanhebungswerte - es "gewinnt" immer der höchste Wert für die aktuellen Betriebsbedingungen
+		private int conf_LLA_Basis = 0;                // wenn die Kupplung nicht betätigt und auch sonst keine höhere Anhebung aktiv ist
+		private int conf_LLA_Kupplung = 150;
+		private int conf_LLA_Zuheizer = 200;
+		private int conf_LLA_MotorSehrKalt = 150;
+		private int conf_LLA_MotorKalt = 100;
+		private int conf_LLA_MotorVorBetriebstemp = 70;
+		private int conf_LLA_MotorBetriebstemp = 50;
+		private int conf_LLA_MotorHeiss = 200;
+		private int conf_LLA_KlimaBereitschaft = 90;
+		private int conf_LLA_Klimakompressor = 120;
+		private int conf_LLA_GeneratorlastHoch = 90;
+		private int conf_LLA_GeneratorlastSehrHoch = 120;
+		
+		// Konfiguration für Zähler (Anzahl Durchläufe bis eine Aktion eintritt)
+		private int conf_countdown_ZuheizerAn_max = 5;
+		private int conf_countdown_Kupplung_max = 5;
+		private int conf_countdown_Generatorlast_max = 5;
+		private int conf_countdown_LLA_aus = 15;
+		private int conf_countdown_Job2_max = 10;
+		
+		// Statusvariablen
+		private bool status_MotorHeiss = false;
+		private bool status_Kupplung = false;
+		private bool status_Zuheizer = false;
+		//private bool status_Klima = false;
+		private bool status_GeneratorlastHoch = false;
+		private bool status_GeneratorlastSehrHoch = false;
+		
+		// Zähler
+		private int countdown_ZuheizerAn = 0;
+		private int countdown_Kupplung = 0;
+		private int countdown_Generatorlast = 0;
+		private int countdown_LLA_aus = 0;
+		private int countdown_Job2 = 0;
+		
+		// Globale Variablen für Leerlaufanhebung
+		private int LLA_momentan = 0;
+		
+						
+		List<Dictionary<string, EdiabasNet.ResultData>> resultSets_Abgleich;
+			
+		public void ExecuteJob(EdiabasNet ediabas, ref MultiMap<string, EdiabasNet.ResultData> resultDict, bool firstCall)
+        {
+            List<Dictionary<string, EdiabasNet.ResultData>> resultSets;
+            
+            
+			// Job 1 - ständig zu aktualisierende Werte
+            ediabas.ArgString = "JA;ILMMG;IPLAD;IPUMG;IUBAT;IMOAK;INMOT;SPLAD;ITKUM;ITLAL;IPRDR;IAFZG;IVKMH;ITZUH;IGENL;RSKUP;IKLIS;IBKLI";
+            ediabas.ArgBinaryStd = null;
+            ediabas.ResultsRequests = string.Empty;
+            ediabas.ExecuteJob("STATUS_MESSWERTBLOCK_LESEN");
+            resultSets = ediabas.ResultSets;
+            if (resultSets != null && resultSets.Count >= 2)
+            {
+                EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+            }
+			
+			
+						
+			// Job 2 - wird nur bei jedem X-ten Durchlauf ausgeführt (definiert von [conf_countdown_Job2_max])
+			if(countdown_Job2 == 0) {
+				ediabas.ArgString = "lla";
+				ediabas.ArgBinaryStd = null;
+				ediabas.ResultsRequests = string.Empty;
+				ediabas.ExecuteJob("ABGLEICH_LESEN");
+				resultSets_Abgleich = ediabas.ResultSets;
+			}
+			else if(countdown_Job2 >= conf_countdown_Job2_max) {
+				countdown_Job2 = 0;
+			}
+			else {
+				countdown_Job2++;
+			}
+			
+			// da diese Werte nicht in jedem Durchlauf vom Steuergerät gelesen werden sind die Ergebnisdaten in einer 
+			// globalen Variablen gespeichert und werden jedesmal übernommen, auch wenn nicht ganz aktuell
+			if (resultSets_Abgleich != null && resultSets_Abgleich.Count >= 2)
+			{
+				EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets_Abgleich[1], "LLA_");
+			}
+			
+			
+			
+			// Werte für automatische Leerlaufanhebung holen
+			
+			EdiabasNet.ResultData resultData;
+			
+			// Kupplungsschalter 
+			bool mom_Kupplung = false;
+            if (resultSets[1].TryGetValue("STAT_KUPPLUNGSSCHALTER_ROH_WERT", out resultData))
+                {
+					if (resultData.OpData is Double) {
+						if(((Double)resultData.OpData) > 0.0) mom_Kupplung = true;
+					}
+                }
+				
+			// Klimakompressor 
+			bool mom_Klimakompressor = false;
+            if (resultSets[1].TryGetValue("STAT_KLIMAKOMPRESSOR_STATUS_WERT", out resultData))
+                {
+					if (resultData.OpData is Double) {
+						if(((Double)resultData.OpData) > 0.0) mom_Klimakompressor = true;
+					}
+                }
+			
+			// Klima-Bereitschaft 
+			bool mom_KlimaBereitschaft = false;
+            if (resultSets[1].TryGetValue("STAT_BEREITSCHAFT_KLIMA_WERT", out resultData))
+                {
+					if (resultData.OpData is Double) {
+						if(((Double)resultData.OpData) > 0.0) mom_KlimaBereitschaft = true;
+					}
+                }
+
+			
+			// Zuheizer-Ansteuerung
+			Double mom_Zuheizer_PWM = 0;
+            if (resultSets[1].TryGetValue("STAT_ZUHEIZER_ANSTEUERUNG_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        mom_Zuheizer_PWM = ((Double)resultData.OpData);
+                    }
+                }
+				
+			// Generatorlast
+			Double mom_Generatorlast_PWM = 0;
+            if (resultSets[1].TryGetValue("STAT_GENERATORLAST_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        mom_Generatorlast_PWM = ((Double)resultData.OpData);
+                    }
+                }
+			
+			// Motortemperatur
+			Double mom_MotorTemp = 0;
+			if (resultSets[1].TryGetValue("STAT_KUEHLMITTELTEMPERATUR_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        mom_MotorTemp = ((Double)resultData.OpData);
+                    }
+                }
+			 
+			// Abgleichwert Leerlaufanhebung
+			if (resultSets_Abgleich[1].TryGetValue("LLA_ABGLEICH_LESEN_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        LLA_momentan = (int)((Double)resultData.OpData);
+                    }
+			}
+			
+			
+			// Automatische Leerlaufanhebung
+			
+			int LLA_neu = 0;
+			
+			// Kupplungsschalter
+			// der countdown dient dazu dass die Leerlaufanhebung erst zurückgenommen wird, 
+			// wenn die Kupplung schon eine Zeit lang nicht betätigt ist
+			
+			if (mom_Kupplung || status_Kupplung) {
+				if(mom_Kupplung) countdown_Kupplung = conf_countdown_Kupplung_max;
+				if(!status_Kupplung) status_Kupplung = true;
+				if(conf_LLA_Kupplung > LLA_neu) LLA_neu = conf_LLA_Kupplung;
+			}
+			
+			if (countdown_Kupplung > 0){
+				countdown_Kupplung--;
+			}
+			else if (countdown_Kupplung == 0){
+				status_Kupplung = false;
+				if(conf_LLA_Basis > LLA_neu) LLA_neu = conf_LLA_Basis;
+			}
+			
+			
+			
+			// Zuheizer
+			// der countdown dient dazu dass die Leerlaufanhebung erst zurückgenommen wird, 
+			// wenn der Zuheizer schon eine Zeit lang inaktiv ist (also z.B. nicht nur kurz wegen zu hoher Generatorlast abgeschaltet wurde)
+			
+			if (mom_Zuheizer_PWM > conf_ZuheizerAnAb || status_Zuheizer) {
+				if(mom_Zuheizer_PWM > conf_ZuheizerAnAb) countdown_ZuheizerAn = conf_countdown_ZuheizerAn_max;
+				if(!status_Zuheizer) status_Zuheizer = true;
+				if(conf_LLA_Zuheizer > LLA_neu) LLA_neu = conf_LLA_Zuheizer;
+			}
+			
+			if (countdown_ZuheizerAn > 0) {
+				countdown_ZuheizerAn--;
+			}
+			else if (countdown_ZuheizerAn == 0) {
+				status_Zuheizer = false;
+				if(conf_LLA_Basis > LLA_neu) LLA_neu = conf_LLA_Basis;
+			}
+			
+			
+			
+			// Generatorlast 
+			
+			if (mom_Generatorlast_PWM > conf_GeneratorlastSehrHochAb || status_GeneratorlastSehrHoch) {
+				if(mom_Generatorlast_PWM > conf_GeneratorlastSehrHochAb) countdown_Generatorlast = conf_countdown_Generatorlast_max;
+				if(!status_GeneratorlastSehrHoch) status_GeneratorlastSehrHoch = true;
+				if(conf_LLA_GeneratorlastSehrHoch > LLA_neu) LLA_neu = conf_LLA_GeneratorlastSehrHoch;
+			}
+			else if (mom_Generatorlast_PWM > conf_GeneratorlastHochAb || status_GeneratorlastHoch) {
+				if(mom_Generatorlast_PWM > conf_GeneratorlastHochAb) countdown_Generatorlast = conf_countdown_Generatorlast_max;
+				if(!status_GeneratorlastHoch) status_GeneratorlastHoch = true;
+				if(conf_LLA_GeneratorlastHoch > LLA_neu) LLA_neu = conf_LLA_GeneratorlastHoch;
+			}
+			
+			if (countdown_Generatorlast > 0) {
+				countdown_Generatorlast--;
+			}
+			else if (countdown_Generatorlast == 0) {
+				status_GeneratorlastHoch = false;
+				status_GeneratorlastSehrHoch = false;
+				if(conf_LLA_Basis > LLA_neu) LLA_neu = conf_LLA_Basis;
+			}
+			
+			
+			
+			// Klimakompressor und Klimabereitschaft
+			if (mom_Klimakompressor) {
+				if(conf_LLA_Klimakompressor > LLA_neu) LLA_neu = conf_LLA_Klimakompressor;
+			}
+			else if (mom_KlimaBereitschaft) {
+				if(conf_LLA_KlimaBereitschaft > LLA_neu) LLA_neu = conf_LLA_KlimaBereitschaft;
+			}
+			
+			
+			
+			// Drehzahlanhebung je nach Motortemperatur, 
+			if(mom_MotorTemp < conf_Temp_MotorSehrKaltBis) {
+				// Motor ist sehr kalt
+				if(conf_LLA_MotorSehrKalt > LLA_neu) LLA_neu = conf_LLA_MotorSehrKalt;
+			}
+			else if(mom_MotorTemp < conf_Temp_MotorKaltBis) {
+				// Motor ist kalt
+				if(conf_LLA_MotorKalt > LLA_neu) LLA_neu = conf_LLA_MotorKalt;
+			}
+			else if(mom_MotorTemp >= conf_Temp_MotorKaltBis && mom_MotorTemp < conf_Temp_MotorBetriebstempAb) {
+				// Motor ist nicht mehr kalt, aber noch nicht auf Betriebstemperatur
+				if(conf_LLA_MotorVorBetriebstemp > LLA_neu) LLA_neu = conf_LLA_MotorVorBetriebstemp;
+			}
+			else if(mom_MotorTemp >= conf_Temp_MotorBetriebstempAb && mom_MotorTemp < conf_Temp_MotorHeissAb && !status_MotorHeiss) {
+				// Motor ist auf Betriebstemperatur
+				if(conf_LLA_MotorBetriebstemp > LLA_neu) LLA_neu = conf_LLA_MotorBetriebstemp;
+			}
+			else if(mom_MotorTemp >= conf_Temp_MotorBetriebstempAb && mom_MotorTemp < conf_Temp_MotorBetriebstempBis && status_MotorHeiss) {
+				// Temperatur ist nachdem Status HEISS wieder weit genug gefallen -> Betriebstemperatur
+				status_MotorHeiss = false;
+				if(conf_LLA_MotorBetriebstemp > LLA_neu) LLA_neu = conf_LLA_MotorBetriebstemp;
+			}
+			else if(mom_MotorTemp >= conf_Temp_MotorHeissAb) {
+				// Motor ist HEISS -> weitere LL Anhebung um die Kühlung zu verbessern aktivieren 
+				// deaktivierung sobald die Temperatur wieder unter [conf_Temp_MotorBetriebstempBis] gefallen ist
+				status_MotorHeiss = true;
+				if(conf_LLA_MotorHeiss > LLA_neu) LLA_neu = conf_LLA_MotorHeiss;
+			}
+			
+			
+			// Motor auf Betriebstemperatur - reduziere LL auf minimum nach einiger Zeit
+			if(LLA_neu == conf_LLA_MotorBetriebstemp) {
+				if(countdown_LLA_aus == 0) {
+					LLA_neu = conf_LLA_Basis;
+				}
+				else if(countdown_LLA_aus > 0) {
+					countdown_LLA_aus--;
+				}
+			}
+			else {
+				countdown_LLA_aus = conf_countdown_LLA_aus;
+			}
+			
+			
+			
+			// wenn der Ziel-LLA-Wert sich vom aktuell eingestellten unterscheidet -> Abgleich verstellen
+			if (LLA_momentan != LLA_neu) {
+				ediabas.ArgString = "lla;" + LLA_neu;
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+                
+                //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...
+                LLA_momentan = LLA_neu;
+				conf_countdown_Job2_max = 0;
+			}
+			
+        }
+		
+		
+        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 "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 "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 "STAT_GENERATORLAST_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,3:0}", value);
+                    
+                    if (found && value <= 60) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 70) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 80) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 80) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+					
+				case "STAT_ZUHEIZER_ANSTEUERUNG_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,3:0}", value);
+                    
+                    if (found && value <= 60) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 70) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 80) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 80) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+					
+		
+                case "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;
+					
+				case "STAT_LADELUFTTEMPERATUR_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    result = string.Format(ActivityMain.Culture, "{0,3:0}", value);
+                    
+                    if (found && value <= 55) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 65) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 75) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 85) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+            }
+            return result;
+        }
+    }
+      ]]>
+    </code>
+	
+  </page>
+</fragment>

+ 51 - 0
DDE-AutoLLA/README.md

@@ -0,0 +1,51 @@
+# DeepOBDConf
+
+## DDE-AutoLLA
+
+**Automatische Leerlaufanhebung** 
+
+Hebt die Leerlaufdrehzahl automatisch per Regelwerk aufgrund verschiedener Parameter an.
+
+#### Funktion
+
+- **Elektrischer Zuheizer**
+
+  wenn der Zuheizer aktiv ist wird die Leerlaufdrehzahl stärker angehoben, um Leerlaufschwankungen zu reduzieren
+
+- **Generatorlastsignal**
+
+  - bei hoher Generatorlast wird die LL-Drehzahl leicht angehoben
+  - bei sehr hoher Generatorlast noch höher
+
+- **Motortemperatur**
+
+  - verschiedene Stufen je nach Motortemperatur
+  - ausgehend von sehr kalt wird bis Betriebstemperatur die Anhebung in Stufen reduziert
+  - bei heißem Motor (> 105°C) wird die Drehzahl für bessere Kühlung um 200 upm erhöht, bis die Temperatur auf 95 °C gesunken ist
+
+- **Kupplungsschalter**
+
+  - bei betätigter Kupplung Anhebung auf 900 upm für angenehmeres Anfahrverhalten
+  - einige Sekunden nachdem die Kupplung nicht mehr getreten ist Reduzierung auf Minimum (wenn keine andere LL-Intervention aktiv) 
+
+- **Klimakompressor und Klimabereitschaft**
+
+  - Klimaanlage an aber Kompressor läuft nicht: moderate Anhebung um Drehzahleinbruch bei Kompressoranlauf zu reduzieren
+  - Klimakompressor läuft: etwas höhere Anhebung
+
+- Reduktion auf Serienwert nur bei Betriebstemperatur, wenn keine andere Intervention aktiv ist, nach einigen Sekunden
+
+- Parameter sind im Code konfigurierbar
+
+
+
+Die Adaption Leerlaufanhebung wird hier **nicht programmiert** sondern nur **verstellt**, was sich rein im RAM der DDE abspielt und somit trotz sehr häufiger Änderung keine Folgeschäden befürchten lässt. Diese Änderungen verschwinden nach Zündung aus wieder. Ohne aktivem DeepOBD ist das ganze somit außer Funktion und der Serienstand aktiv. 
+
+Da dies immer automatisch aktiv sein soll muss die Konfiguration die "Hauptseite" in DeepOBD sein. 
+
+
+
+#### Bekannte Probleme
+
+- Werte für TÖNS wie in der IBUS_APP Konfiguration können derzeit nicht abgerufen werden, da ich noch keinen Weg gefunden habe über benutzerdefinierten Code mehrere ECUs nacheinander abzurufen. 
+

+ 680 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/BmwDeepObd.xsd

@@ -0,0 +1,680 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.holeschak.de/BmwDeepObd"
+    elementFormDefault="qualified"
+    xmlns="http://www.holeschak.de/BmwDeepObd"
+    xmlns:mstns="http://www.holeschak.de/BmwDeepObd"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+>
+
+  <xs:simpleType name="string1-type">
+    <xs:restriction base="xs:string">
+      <xs:minLength value="1"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:complexType name="include-type">
+    <xs:annotation>
+      <xs:documentation>
+        Allows to include page fragments from another file.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:attribute name="filename" type="string1-type" use="required">
+      <xs:annotation>
+        <xs:documentation>
+          File name of xml page fragment to include.
+          File name could be absolute or relative.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:simpleType name="manufacturer-type">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="BMW">
+        <xs:annotation>
+          <xs:documentation>
+            Manufacturer BMW
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="Audi">
+        <xs:annotation>
+          <xs:documentation>
+            Manufacturer Audi
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="Seat">
+        <xs:annotation>
+          <xs:documentation>
+            Manufacturer Seat
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="Skoda">
+        <xs:annotation>
+          <xs:documentation>
+            Manufacturer Skoda
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="VW">
+        <xs:annotation>
+          <xs:documentation>
+            Manufacturer VW
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="interface-type">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="BLUETOOTH">
+        <xs:annotation>
+          <xs:documentation>
+            Bluetooth interface
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="ENET">
+        <xs:annotation>
+          <xs:documentation>
+            Ethernet interface, not allowed for VW
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="ELMWIFI">
+        <xs:annotation>
+          <xs:documentation>
+            ELM 327 WIFI device, not allowed for VW
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="DEEPOBDWIFI">
+        <xs:annotation>
+          <xs:documentation>
+            Deep OBD WIFI device
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="FTDI">
+        <xs:annotation>
+          <xs:documentation>
+            FTDI USB device, not allowed for VW
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="display-mode-type">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="list">
+        <xs:annotation>
+          <xs:documentation>
+            Display text list
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="grid">
+        <xs:annotation>
+          <xs:documentation>
+            Display data elements as grid
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="grid-mode-type">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="hidden">
+        <xs:annotation>
+          <xs:documentation>
+            This entry is not shown
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="simple-gauge-square">
+        <xs:annotation>
+          <xs:documentation>
+            Displays simple gauge square type
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="simple-gauge-round">
+        <xs:annotation>
+          <xs:documentation>
+            Displays simple gauge round type
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="simple-gauge-dot">
+        <xs:annotation>
+          <xs:documentation>
+            Displays simple gauge dot type
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="fontsize-type">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="small">
+        <xs:annotation>
+          <xs:documentation>
+            Small font appearence
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="medium">
+        <xs:annotation>
+          <xs:documentation>
+            Medium font appearence
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+      <xs:enumeration value="large">
+        <xs:annotation>
+          <xs:documentation>
+            Large font appearence
+          </xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:complexType name="global-type">
+    <xs:annotation>
+      <xs:documentation>Global specifications for all pages.</xs:documentation>
+    </xs:annotation>
+    <xs:attribute name="ecu_path" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Relative or absolute path of the ecu files to use. If ommited the standard ecu path will be used (recommended).
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="log_path" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Relative or absolute path for the trace and data log files.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="append_log" type="xs:boolean" default="false" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          If true the log file is appended.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="manufacturer" type="manufacturer-type" default="BMW" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the selected manufacturer
+          If ommited BMW is the default.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="interface" type="interface-type" default="BLUETOOTH" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the selected communication interface.
+          If ommited bluetooth is the default.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+      <xs:attribute name="search_abort_index" type="xs:int" default="-1" use="optional">
+          <xs:annotation>
+              <xs:documentation>
+                  Index of the last search abort (VAG only). A values of -1 specifies no abort.
+                  If ommited -1 is the default.
+              </xs:documentation>
+          </xs:annotation>
+      </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="display-type">
+    <xs:annotation>
+      <xs:documentation>Specifies a result output row.</xs:documentation>
+    </xs:annotation>
+    <xs:attribute name="name" type="string1-type" use="required">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the output list entry.
+          Must be a reference to a string.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="result" type="string1-type" use="required">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the EDIABAS result.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="format" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Format of the output value.
+          The format specifier must have an EDIABAS apiResultText format.
+          If ommited the function FormatResult() will be called.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="grid-type" type="grid-mode-type" default="hidden" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Type of display element in grid mode.
+          If ommited the entry is hidden.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="min-value" type="xs:double" default="0" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Minimum value for gauge display.
+          If ommited the default value is 0.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="max-value" type="xs:double" default="100" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Maximum value for gauge display.
+          If ommited the default value is 100.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="log_tag" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Tag for the data log file.
+          Data is only logged if tag is present.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="string-type" mixed="true">
+    <xs:annotation>
+      <xs:documentation>String translation element.</xs:documentation>
+    </xs:annotation>
+    <xs:attribute name="name" type="string1-type" use="required">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the translation entry.
+          It will be used as reference in page and display elements.
+          Additionally it could be used with the GetPageString() function.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="strings-type">
+    <xs:annotation>
+      <xs:documentation>
+        Group of translation strings for specific language.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:sequence>
+      <xs:element name="string" type="string-type" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="lang" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the language (culture).
+          This could be either the short form e.g. 'de' or the long one 'de-DE'.
+          If omitted this is the default languge if no other language tag matches.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="job-type">
+    <xs:annotation>
+      <xs:documentation>
+        Specifies the EDIABAS job to execute.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:sequence>
+      <xs:element name="display" type="display-type" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="id" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Id for job result identification.
+          If this element is specified the result name will be: [id]#[data set index]#[result],
+          otherwise: [name]#[result].
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="sgbd" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the SGBD file to load.
+          This overrides the SGBD file from the jobs node.
+          It's recommended to combine this with the id attribute.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="name" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the EDIABAS job to execute.
+          If this element is used the function ExecuteJob() will not be called.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="args_first" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          A list of semicolon separated arguments for the first EDIABAS job call.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="args" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          A list of semicolon separated arguments for the EDIABAS job.
+          For the first call args_first will be used if present.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="results" type="xs:string" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          A list of semicolon separated results for the EDIABAS job.
+          If omitted all results will be generated.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="jobs-type">
+    <xs:annotation>
+      <xs:documentation>
+        Specifies all EDIABAS jobs to execute.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:sequence>
+      <xs:element name="job" type="job-type" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="sgbd" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the SGBD file to load.
+          If omitted the SGBD must be specified in the job node or loaded in ExecuteJob().
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="mwtab" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Relative path of the used MwTab file. Only used for VAG configuration generator.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="mwdata" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          MwTab data from ECU. Only used for VAG configuration generator.
+          The format is : [block],[index],[type],[unit base 64 encoded];[block],[index] ...
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="vag_data_file" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Relative path of the used VAG data file. Only used for VAG configuration generator.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="vag_uds_file" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Relative path of the used VAG UDS file. Only used for VAG configuration generator.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="ecu-type">
+    <xs:annotation>
+      <xs:documentation>
+        Specifies ECU to read the error memory from.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:attribute name="name" type="string1-type" use="required">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the ECU.
+          Must be a reference to a string element.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="sgbd" type="string1-type" use="required">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the SGBD file to load.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="vag_data_file" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Relative path of the used VAG data file. Only used for VAG configuration generator.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="vag_uds_file" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Relative path of the used VAG UDS file. Only used for VAG configuration generator.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="results" type="xs:string" use="optional" default="F_UW_KM">
+      <xs:annotation>
+        <xs:documentation>
+          A list of semicolon separated results for the FS_LESEN_DETAIL job.
+          If omitted only F_UW_KM result will be generated.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="read-errors-type">
+    <xs:annotation>
+      <xs:documentation>
+        Groups nodes for error memory reading
+      </xs:documentation>
+    </xs:annotation>
+    <xs:sequence>
+      <xs:element name="ecu" type="ecu-type" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="sgbd_functional" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Functional SGBD for this vehicle type. Used for global error reset.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="code-type" mixed="true">
+    <xs:annotation>
+      <xs:documentation>
+        <![CDATA[
+        This block can contain C# user code that will be compiled after reading the xml.
+        The class for the code must be always named PageClass.
+        The FormatResult() functions are only called, if there is no format property in the display node!
+        It can contain the following pre-defined functions:
+        public void CreateLayout(ActivityMain activity, JobReader.PageInfo pageInfo, LinearLayout pageLayout);
+        public void DestroyLayout(JobReader.PageInfo pageInfo);
+        public void UpdateLayout(JobReader.PageInfo pageInfo, bool pageValid, bool threadActive);
+        public void ExecuteJob(EdiabasNet ediabas, ref Dictionary<string, EdiabasNet.ResultData=""> resultDict, bool firstCall);
+        public void ExecuteJob(EdiabasNet ediabas, ref MultiMap<string, EdiabasNet.ResultData=""> resultDict, bool firstCall);
+        public string FormatResult(JobReader.PageInfo pageInfo, Dictionary<string, EdiabasNet.ResultData> resultDict, string resultName);
+        public string FormatResult(JobReader.PageInfo pageInfo, Dictionary<string, EdiabasNet.ResultData> resultDict, string resultName, ref Android.Graphics.Color? textColor);
+        public string FormatResult(JobReader.PageInfo pageInfo, MultiMap<string, EdiabasNet.ResultData> resultDict, string resultName, ref Android.Graphics.Color? textColor);
+        public void UpdateResultList(JobReader.PageInfo pageInfo, Dictionary<string, EdiabasNet.ResultData> resultDict, List<TableResultItem> resultList);
+        public void UpdateResultList(JobReader.PageInfo pageInfo, MultiMap<string, EdiabasNet.ResultData> resultDict, List<TableResultItem> resultList);
+        ]]>
+      </xs:documentation>
+    </xs:annotation>
+    <xs:attribute name="show_warnings" type="xs:boolean" default="false" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Show warnings during compilation of user code.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="page-type">
+    <xs:annotation>
+      <xs:documentation>
+        Definition of one page.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:sequence>
+      <xs:element name="display" type="display-type" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="strings" type="strings-type" maxOccurs="unbounded"/>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element name="jobs" type="jobs-type" minOccurs="0" maxOccurs="1"/>
+        <xs:element name="read_errors" type="read-errors-type" minOccurs="1" maxOccurs="1"/>
+      </xs:choice>
+      <xs:element name="code" type="code-type" minOccurs="0" maxOccurs="1"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="string1-type" use="required">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the page.
+          Must be a reference to a string element.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="weight" type="xs:float" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Weight to control with width of the result colum.
+          A value of 1 indicates 50% of the page width.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+
+    <xs:attribute name="display-mode" type="display-mode-type" default="list" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Display mode, the default mode is list.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+
+    <xs:attribute name="fontsize" type="fontsize-type" default="small" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Font size appearence, the default size is small.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+
+    <xs:attribute name="gauges-portrait" type="xs:integer" default="2" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Number of gauges per line in portrait mode, default is 2.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+
+    <xs:attribute name="gauges-landscape" type="xs:integer" default="4" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Number of gauges per line in landscape mode, default is 4.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+
+    <xs:attribute name="logfile" type="string1-type" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Name of the data logfile. The symbol {D} will be replaced by the current date and time.
+          Data logging is only available if a log file name has been set.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+
+    <xs:attribute name="activate" type="xs:boolean" default="false" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Specifies if an activation button will be displayed on the page.
+          Use this to prevent automatic job execution on page change.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+
+    <xs:attribute name="no_update" type="xs:boolean" default="false" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          Setting this attribute prevents updating the page from the configuration generator.
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+  </xs:complexType>
+
+  <xs:complexType name="pages-type">
+    <xs:annotation>
+      <xs:documentation>
+        Group of all pages to display.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:sequence>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element name="page" type="page-type"/>
+        <xs:element name="include" type="include-type"/>
+      </xs:choice>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:element name="configuration">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="global" type="global-type"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element name="pages" type="pages-type"/>
+          <xs:element name="include" type="include-type"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="fragment">
+    <xs:annotation>
+      <xs:documentation>
+        Fragment for include elements.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:choice>
+        <xs:element name="page" type="page-type" maxOccurs="unbounded">
+          <xs:annotation>
+            <xs:documentation>
+              Description of one page.
+            </xs:documentation>
+          </xs:annotation>
+        </xs:element>
+        <xs:element name="pages" type="pages-type">
+          <xs:annotation>
+            <xs:documentation>
+              Description of all pages.
+            </xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>

+ 63 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/D50M57E1.ccpage

@@ -0,0 +1,63 @@
+<?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="DME/DDE" fontsize="medium" logfile="DME_DDE.log">
+    <strings lang="de">
+      <string name="DME/DDE">DDE</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>
+    </strings>
+    <strings>
+      <string name="DME/DDE">DDE</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>
+    </strings>	
+    <jobs sgbd="D50M57E1">
+      <job 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"  log_tag="STAT_LUFTMASSE_PRO_HUB_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADEDRUCK_WERT" result="STAT_LADEDRUCK_WERT" format="4.1R"  log_tag="STAT_LADEDRUCK_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UMGEBUNGSDRUCK_WERT" result="STAT_UMGEBUNGSDRUCK_WERT" format="4.1R"  log_tag="STAT_UMGEBUNGSDRUCK_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_UBATT_WERT" result="STAT_UBATT_WERT" format="2.1R"  log_tag="STAT_UBATT_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT" result="STAT_KUEHLMITTELTEMPERATUR_WERT" format="L"  log_tag="STAT_KUEHLMITTELTEMPERATUR_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT" result="STAT_MOTORMOMENT_AKTUELL_WERT" format="L" log_tag="STAT_MOTORMOMENT_AKTUELL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT" result="STAT_MOTORDREHZAHL_WERT" format="L"  log_tag="STAT_MOTORDREHZAHL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KRAFTSTOFFTEMPERATURK_WERT" result="STAT_KRAFTSTOFFTEMPERATURK_WERT" format="2.1R"  log_tag="STAT_KRAFTSTOFFTEMPERATURK_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT" result="STAT_LADELUFTTEMPERATUR_WERT" format=".1R"  log_tag="STAT_LADELUFTTEMPERATUR_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_EINSPRITZMENGE_AKTUELL_WERT" result="STAT_EINSPRITZMENGE_AKTUELL_WERT" format="L" 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"  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"  log_tag="STAT_LADEDRUCK_SOLL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_WERT" result="STAT_RAILDRUCK_WERT" format="L"  log_tag="STAT_RAILDRUCK_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_RAILDRUCK_SOLL_WERT" result="STAT_RAILDRUCK_SOLL_WERT" format="L"  log_tag="STAT_RAILDRUCK_SOLL_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_FAHRZEUGBESCHLEUNIGUNG_WERT" result="STAT_FAHRZEUGBESCHLEUNIGUNG_WERT" format="2.3R"  log_tag="STAT_FAHRZEUGBESCHLEUNIGUNG_WERT" />
+        <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_GESCHWINDIGKEIT_WERT" result="STAT_GESCHWINDIGKEIT_WERT" format="L"  log_tag="STAT_GESCHWINDIGKEIT_WERT" />
+      </job>
+    </jobs>
+  </page>
+</fragment>

+ 30 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/DDEAbgleich.txt

@@ -0,0 +1,30 @@
+
+
+AGR Frischluftrate:
+Job: ABGLEICH_LESEN
+Arg: agr
+--> ABGLEICH_LESEN_WERT: R: 87
+
+
+Leerlaufdrehzahl-Anhebung
+Job: ABGLEICH_LESEN
+Arg: lla
+--> ABGLEICH_LESEN_WERT: R: 50
+
+
+Programmieren:
+zuerst: 
+Job: ABGLEICH_VERSTELLEN
+Arg: agr;87
+
+danach: 
+Job: ABGLEICH_PROG
+Arg: agr;87
+
+zuerst: 
+Job: ABGLEICH_VERSTELLEN
+Arg: lla;50
+
+danach: 
+Job: ABGLEICH_PROG
+Arg: lla;50

+ 354 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/DDEAbgleich_D50M57E1.ccpage

@@ -0,0 +1,354 @@
+<?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="DDE5Abgleich" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="DDE5E1_Abgleich.log">
+    <strings>
+      <string name="DDE5Abgleich">DDE5 adjustment</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="DDE5Abgleich">DDE5 Abgleich</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;
+        
+        // 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;
+        
+        // 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 \nSerie";
+            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 \nmin.";
+            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);
+			
+			
+		
+            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;
+        }
+
+        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;
+            }
+			
+        }
+    }
+    ]]>
+    </code>
+  </page>
+</fragment>

+ 438 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/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>

+ 95 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/DDEGenerator.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>

+ 82 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/DDE_fuel_air.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>

+ 44 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/DSC_MK60.ccpage

@@ -0,0 +1,44 @@
+<?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="DSC" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="DSC_MK60.log">
+    <strings>
+      <string name="DSC">DSC</string>
+      <string name="!JOB#STATUS_RADGESCHWINDIGKEIT#STAT_RAD_GESCHW_VL_WERT">  Raddrehzahl VL [km/h]:</string>
+      <string name="!JOB#STATUS_RADGESCHWINDIGKEIT#STAT_RAD_GESCHW_VR_WERT">  Raddrehzahl VR [km/h]:</string>
+      <string name="!JOB#STATUS_RADGESCHWINDIGKEIT#STAT_RAD_GESCHW_HL_WERT">  Raddrehzahl HL [km/h]:</string>
+      <string name="!JOB#STATUS_RADGESCHWINDIGKEIT#STAT_RAD_GESCHW_HR_WERT">  Raddrehzahl HR [km/h]:</string>
+      <string name="!JOB#STATUS_SCHALTER#STAT_BREMSLICHT_SCHALTER_EIN">  Bremslichtschalter:</string>
+      <string name="!JOB#STATUS_SCHALTER#STAT_HANDBREMSE_SCHALTER_EIN">  Handbremse:</string>
+      <string name="!JOB#STATUS_SCHALTER#STAT_DSC_TASTER_EIN">  DSC-Taster:</string>
+      <string name="!JOB#STATUS_SCHALTER#STAT_BREMSFLUESSIGKEIT_SCHALTER_EIN">  Bremsflüssigkeit:</string>
+      <string name="!JOB#STATUS_SENSOREN#STAT_DREHRATENSENSOR_GESCHW_WERT">  Drehratensensor Geschw. [km/h]:</string>
+      <string name="!JOB#STATUS_SENSOREN#STAT_QUERBESCHLEUNIGUNGSSENSOR_WERT">  Querbeschleunigungssensor:</string>
+      <string name="!JOB#STATUS_SENSOREN#STAT_DRUCKSENSOR_DRUCKSTANGENKREIS_DRUCK_WERT">  Drucksensor:</string>
+      <string name="!JOB#STATUS_SENSOREN#STAT_DRUCKSENSOR_SCHWIMMKREIS_DRUCK_WERT">  Drucksensor Schwimmkreis:</string>
+      <string name="!JOB#STATUS_CAN_LWS_1_LESEN#STAT_LENKWINKEL_WERT">  Lenkwinkel [°]:</string>
+    </strings>
+    <jobs sgbd="dsc_mk60">
+      <job name="STATUS_RADGESCHWINDIGKEIT">
+        <display name="!JOB#STATUS_RADGESCHWINDIGKEIT#STAT_RAD_GESCHW_VL_WERT" result="STAT_RAD_GESCHW_VL_WERT" format="L" log_tag="STAT_RAD_GESCHW_VL_WERT" />
+        <display name="!JOB#STATUS_RADGESCHWINDIGKEIT#STAT_RAD_GESCHW_VR_WERT" result="STAT_RAD_GESCHW_VR_WERT" format="L" log_tag="STAT_RAD_GESCHW_VR_WERT" />
+        <display name="!JOB#STATUS_RADGESCHWINDIGKEIT#STAT_RAD_GESCHW_HL_WERT" result="STAT_RAD_GESCHW_HL_WERT" format="L" log_tag="STAT_RAD_GESCHW_HL_WERT" />
+        <display name="!JOB#STATUS_RADGESCHWINDIGKEIT#STAT_RAD_GESCHW_HR_WERT" result="STAT_RAD_GESCHW_HR_WERT" format="L" log_tag="STAT_RAD_GESCHW_HR_WERT" />
+      </job>
+      <job name="STATUS_SCHALTER">
+        <display name="!JOB#STATUS_SCHALTER#STAT_BREMSLICHT_SCHALTER_EIN" result="STAT_BREMSLICHT_SCHALTER_EIN" format="" log_tag="STAT_BREMSLICHT_SCHALTER_EIN" />
+        <display name="!JOB#STATUS_SCHALTER#STAT_HANDBREMSE_SCHALTER_EIN" result="STAT_HANDBREMSE_SCHALTER_EIN" format="" log_tag="STAT_HANDBREMSE_SCHALTER_EIN" />
+        <display name="!JOB#STATUS_SCHALTER#STAT_DSC_TASTER_EIN" result="STAT_DSC_TASTER_EIN" format="" log_tag="STAT_DSC_TASTER_EIN" />
+        <display name="!JOB#STATUS_SCHALTER#STAT_BREMSFLUESSIGKEIT_SCHALTER_EIN" result="STAT_BREMSFLUESSIGKEIT_SCHALTER_EIN" format="" log_tag="STAT_BREMSFLUESSIGKEIT_SCHALTER_EIN" />
+      </job>
+      <job name="STATUS_SENSOREN">
+        <display name="!JOB#STATUS_SENSOREN#STAT_DREHRATENSENSOR_GESCHW_WERT" result="STAT_DREHRATENSENSOR_GESCHW_WERT" format=".2R" log_tag="STAT_DREHRATENSENSOR_GESCHW_WERT" />
+        <display name="!JOB#STATUS_SENSOREN#STAT_QUERBESCHLEUNIGUNGSSENSOR_WERT" result="STAT_QUERBESCHLEUNIGUNGSSENSOR_WERT" format=".2R" log_tag="STAT_QUERBESCHLEUNIGUNGSSENSOR_WERT" />
+        <display name="!JOB#STATUS_SENSOREN#STAT_DRUCKSENSOR_DRUCKSTANGENKREIS_DRUCK_WERT" result="STAT_DRUCKSENSOR_DRUCKSTANGENKREIS_DRUCK_WERT" format=".2R" log_tag="STAT_DRUCKSENSOR_DRUCKSTANGENKREIS_DRUCK_WERT" />
+        <display name="!JOB#STATUS_SENSOREN#STAT_DRUCKSENSOR_SCHWIMMKREIS_DRUCK_WERT" result="STAT_DRUCKSENSOR_SCHWIMMKREIS_DRUCK_WERT" format=".2R" log_tag="STAT_DRUCKSENSOR_SCHWIMMKREIS_DRUCK_WERT" />
+      </job>
+      <job name="STATUS_CAN_LWS_1_LESEN">
+        <display name="!JOB#STATUS_CAN_LWS_1_LESEN#STAT_LENKWINKEL_WERT" result="STAT_LENKWINKEL_WERT" format=".2R" log_tag="STAT_LENKWINKEL_WERT" />
+      </job>
+    </jobs>
+  </page>
+</fragment>

+ 40 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/Errors.ccpage

@@ -0,0 +1,40 @@
+<?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="!PAGE_NAME">
+    <strings>
+      <string name="!PAGE_NAME">Fehler</string>
+      <string name="!ECU#D50M57E1">DDE 5.0</string>
+      <string name="!ECU#DSC_MK60">DSC MK60</string>
+      <string name="!ECU#EWS3">EWS</string>
+      <string name="!ECU#IHKA46_3">IHKA</string>
+      <string name="!ECU#KOMBI46R">KOMBI</string>
+      <string name="!ECU#LSZ_2">LSZ</string>
+      <string name="!ECU#LWS5_1B">LWS</string>
+      <string name="!ECU#MRS4">MRS (Airbag)</string>
+      <string name="!ECU#PDCACT">PDC</string>
+      <string name="!ECU#ZKE5">ZKE GM5</string>
+<string name="!ECU#SPM46FT">Spiegel Fahrer</string>
+<string name="!ECU#SPM46BT">Spiegel Beifahrer</string>
+<string name="!ECU#SM46C_4">Sitzmemory</string>
+<string name="!ECU#SZM46">Schaltzentrum MK</string>
+<string name="!ECU#RLS_DS2">RLS</string>
+    </strings>
+    <read_errors>
+      <ecu name="!ECU#D50M57E1" sgbd="d50m57e1" />
+      <ecu name="!ECU#DSC_MK60" sgbd="dsc_mk60" />
+      <ecu name="!ECU#EWS3" sgbd="ews3" />
+      <ecu name="!ECU#IHKA46_3" sgbd="ihka46_3" />
+      <ecu name="!ECU#KOMBI46R" sgbd="kombi46r" />
+      <ecu name="!ECU#LSZ_2" sgbd="lsz_2" />
+      <ecu name="!ECU#LWS5_1B" sgbd="lws5_1b" />
+      <ecu name="!ECU#MRS4" sgbd="mrs4" />
+      <ecu name="!ECU#PDCACT" sgbd="pdcact" />
+      <ecu name="!ECU#ZKE5" sgbd="zke5" />
+<ecu name="!ECU#SPM46FT" sgbd="spm46ft" />
+<ecu name="!ECU#SPM46BT" sgbd="spm46bt" />
+<ecu name="!ECU#SM46C_4" sgbd="sm46c_4" />
+<ecu name="!ECU#SZM46" sgbd="szm46" />
+<ecu name="!ECU#RLS_DS2" sgbd="rls_ds2" />
+    </read_errors>
+  </page>
+</fragment>

+ 30 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/Errors_old.ccpage

@@ -0,0 +1,30 @@
+<?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="!PAGE_NAME">
+    <strings>
+      <string name="!PAGE_NAME">Fehler</string>
+      <string name="!ECU#D50M57E1">D50M57E1</string>
+      <string name="!ECU#DSC_MK60">DSC_MK60</string>
+      <string name="!ECU#EWS3">EWS3</string>
+      <string name="!ECU#IHKA46_3">IHKA46_3</string>
+      <string name="!ECU#KOMBI46R">KOMBI46R</string>
+      <string name="!ECU#LSZ_2">LSZ_2</string>
+      <string name="!ECU#LWS5_1B">LWS5_1B</string>
+      <string name="!ECU#MRS4">MRS4</string>
+      <string name="!ECU#PDCACT">PDCACT</string>
+      <string name="!ECU#ZKE5_S12">ZKE5_S12</string>
+    </strings>
+    <read_errors>
+      <ecu name="!ECU#D50M57E1" sgbd="d50m57e1" />
+      <ecu name="!ECU#DSC_MK60" sgbd="dsc_mk60" />
+      <ecu name="!ECU#EWS3" sgbd="ews3" />
+      <ecu name="!ECU#IHKA46_3" sgbd="ihka46_3" />
+      <ecu name="!ECU#KOMBI46R" sgbd="kombi46r" />
+      <ecu name="!ECU#LSZ_2" sgbd="lsz_2" />
+      <ecu name="!ECU#LWS5_1B" sgbd="lws5_1b" />
+      <ecu name="!ECU#MRS4" sgbd="mrs4" />
+      <ecu name="!ECU#PDCACT" sgbd="pdcact" />
+      <ecu name="!ECU#ZKE5_S12" sgbd="zke5_s12" />
+    </read_errors>
+  </page>
+</fragment>

+ 500 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/Home.ccpage

@@ -0,0 +1,500 @@
+<?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="HOME" display-mode="grid" fontsize="medium" gauges-portrait="3" gauges-landscape="5" logfile="DME_DDE.log">
+    <strings lang="de">
+      <string name="HOME">HOME</string>
+	  <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT"> Kühlmitteltemperatur [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT"> Ladelufttemp. [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> Drehzahl [U/min]</string>
+	  <string name="!JOB#LLA_ABGLEICH_LESEN_WERT"> Anhebung Leerlaufdrehzahl [u/min]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> Drehmoment [Nm]:</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 PWM [%]</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_LUFTMASSE_PRO_HUB_WERT"> Luftmasse [mg/Hub]</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_GESCHWINDIGKEIT_WERT"> Geschwindigkeit [km/h]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_FAHRZEUGBESCHLEUNIGUNG_WERT"> Beschleunigung [m/s²]</string>
+	  
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUPPLUNGSSCHALTER_ROH_WERT">  Kupplungsschalter</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KLIMAKOMPRESSOR_STATUS_WERT">  Klimakompressor</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_BEREITSCHAFT_KLIMA_WERT">  Klima Bereitschaft</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="HOME">HOME</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT"> coolant [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT"> charge air temperature [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> engine speed [U/min]</string>
+	  <string name="!JOB#LLA_ABGLEICH_LESEN_WERT"> increase idle speed [rpm]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> torque [Nm]:</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"> aux heater PWM [%]</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_LUFTMASSE_PRO_HUB_WERT"> air mass [mg/stroke]</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_GESCHWINDIGKEIT_WERT"> speed [km/h]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_FAHRZEUGBESCHLEUNIGUNG_WERT"> acceleration [m/s²]</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>
+	
+    <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_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_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#LLA_ABGLEICH_LESEN_WERT" result="LLA_ABGLEICH_LESEN_WERT" format="L" display-order="0" grid-type="simple-gauge-round" min-value="0" max-value="250" log_tag="LLA" />
+    <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" 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" grid-type="simple-gauge-round" min-value="0" max-value="100" log_tag="STAT_ZUHEIZER_ANSTEUERUNG_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_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_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_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" />    
+    <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_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_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_KUPPLUNGSSCHALTER_ROH_WERT" result="STAT_KUPPLUNGSSCHALTER_ROH_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1" log_tag="STAT_KUPPLUNGSSCHALTER_ROH_WERT" />
+	<display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KLIMAKOMPRESSOR_STATUS_WERT" result="STAT_KLIMAKOMPRESSOR_STATUS_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1" log_tag="STAT_KLIMAKOMPRESSOR_STATUS_WERT" />
+	<display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_BEREITSCHAFT_KLIMA_WERT" result="STAT_BEREITSCHAFT_KLIMA_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1" log_tag="STAT_BEREITSCHAFT_KLIMA_WERT" />
+	
+    <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" />
+	
+	<jobs sgbd="D50M57E1" />
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {	
+		// PWM-Wert Ansteuerung Zuheizer, ab dem dieser als AN erkannt wird
+		private double conf_ZuheizerAnAb = 25;
+		
+		// PWM-Wert Generatorlast, ab dem eine LL-Anhebung erfolgt
+		private double conf_GeneratorlastHochAb = 60;
+		private double conf_GeneratorlastSehrHochAb = 80;
+		
+		// Motortemperaturen
+		private double conf_Temp_MotorSehrKaltBis = 25;
+		private double conf_Temp_MotorKaltBis = 65;
+		private double conf_Temp_MotorBetriebstempAb = 75;
+		private double conf_Temp_MotorBetriebstempBis = 95;
+		private double conf_Temp_MotorHeissAb = 100;
+		
+		// Ziel-Leerlaufanhebungswerte - es "gewinnt" immer der höchste Wert für die aktuellen Betriebsbedingungen
+		private int conf_LLA_Basis = 0;                // wenn die Kupplung nicht betätigt und auch sonst keine höhere Anhebung aktiv ist
+		private int conf_LLA_Kupplung = 150;
+		private int conf_LLA_Zuheizer = 200;
+		private int conf_LLA_MotorSehrKalt = 150;
+		private int conf_LLA_MotorKalt = 100;
+		private int conf_LLA_MotorVorBetriebstemp = 70;
+		private int conf_LLA_MotorBetriebstemp = 50;
+		private int conf_LLA_MotorHeiss = 200;
+		private int conf_LLA_KlimaBereitschaft = 90;
+		private int conf_LLA_Klimakompressor = 120;
+		private int conf_LLA_GeneratorlastHoch = 90;
+		private int conf_LLA_GeneratorlastSehrHoch = 120;
+		
+		// Konfiguration für Zähler (Anzahl Durchläufe bis eine Aktion eintritt)
+		private int conf_countdown_ZuheizerAn_max = 5;
+		private int conf_countdown_Kupplung_max = 5;
+		private int conf_countdown_Generatorlast_max = 5;
+		private int conf_countdown_LLA_aus = 15;
+		private int conf_countdown_Job2_max = 10;
+		
+		// Statusvariablen
+		private bool status_MotorHeiss = false;
+		private bool status_Kupplung = false;
+		private bool status_Zuheizer = false;
+		//private bool status_Klima = false;
+		private bool status_GeneratorlastHoch = false;
+		private bool status_GeneratorlastSehrHoch = false;
+		
+		// Zähler
+		private int countdown_ZuheizerAn = 0;
+		private int countdown_Kupplung = 0;
+		private int countdown_Generatorlast = 0;
+		private int countdown_LLA_aus = 0;
+		private int countdown_Job2 = 0;
+		
+		// Globale Variablen für Leerlaufanhebung
+		private int LLA_momentan = 0;
+		
+						
+		List<Dictionary<string, EdiabasNet.ResultData>> resultSets_Abgleich;
+			
+		public void ExecuteJob(EdiabasNet ediabas, ref MultiMap<string, EdiabasNet.ResultData> resultDict, bool firstCall)
+        {
+            List<Dictionary<string, EdiabasNet.ResultData>> resultSets;
+            
+            
+			// Job 1 - ständig zu aktualisierende Werte
+            ediabas.ArgString = "JA;ILMMG;IPLAD;IPUMG;IUBAT;IMOAK;INMOT;SPLAD;ITKUM;ITLAL;IPRDR;IAFZG;IVKMH;ITZUH;IGENL;RSKUP;IKLIS;IBKLI";
+            ediabas.ArgBinaryStd = null;
+            ediabas.ResultsRequests = string.Empty;
+            ediabas.ExecuteJob("STATUS_MESSWERTBLOCK_LESEN");
+            resultSets = ediabas.ResultSets;
+            if (resultSets != null && resultSets.Count >= 2)
+            {
+                EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+            }
+			
+			
+						
+			// Job 2 - wird nur bei jedem X-ten Durchlauf ausgeführt (definiert von [conf_countdown_Job2_max])
+			if(countdown_Job2 == 0) {
+				ediabas.ArgString = "lla";
+				ediabas.ArgBinaryStd = null;
+				ediabas.ResultsRequests = string.Empty;
+				ediabas.ExecuteJob("ABGLEICH_LESEN");
+				resultSets_Abgleich = ediabas.ResultSets;
+			}
+			else if(countdown_Job2 >= conf_countdown_Job2_max) {
+				countdown_Job2 = 0;
+			}
+			else {
+				countdown_Job2++;
+			}
+			
+			// da diese Werte nicht in jedem Durchlauf vom Steuergerät gelesen werden sind die Ergebnisdaten in einer 
+			// globalen Variablen gespeichert und werden jedesmal übernommen, auch wenn nicht ganz aktuell
+			if (resultSets_Abgleich != null && resultSets_Abgleich.Count >= 2)
+			{
+				EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets_Abgleich[1], "LLA_");
+			}
+			
+			
+			
+			// Werte für automatische Leerlaufanhebung holen
+			
+			EdiabasNet.ResultData resultData;
+			
+			// Kupplungsschalter 
+			bool mom_Kupplung = false;
+            if (resultSets[1].TryGetValue("STAT_KUPPLUNGSSCHALTER_ROH_WERT", out resultData))
+                {
+					if (resultData.OpData is Double) {
+						if(((Double)resultData.OpData) > 0.0) mom_Kupplung = true;
+					}
+                }
+				
+			// Klimakompressor 
+			bool mom_Klimakompressor = false;
+            if (resultSets[1].TryGetValue("STAT_KLIMAKOMPRESSOR_STATUS_WERT", out resultData))
+                {
+					if (resultData.OpData is Double) {
+						if(((Double)resultData.OpData) > 0.0) mom_Klimakompressor = true;
+					}
+                }
+			
+			// Klima-Bereitschaft 
+			bool mom_KlimaBereitschaft = false;
+            if (resultSets[1].TryGetValue("STAT_BEREITSCHAFT_KLIMA_WERT", out resultData))
+                {
+					if (resultData.OpData is Double) {
+						if(((Double)resultData.OpData) > 0.0) mom_KlimaBereitschaft = true;
+					}
+                }
+
+			
+			// Zuheizer-Ansteuerung
+			Double mom_Zuheizer_PWM = 0;
+            if (resultSets[1].TryGetValue("STAT_ZUHEIZER_ANSTEUERUNG_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        mom_Zuheizer_PWM = ((Double)resultData.OpData);
+                    }
+                }
+				
+			// Generatorlast
+			Double mom_Generatorlast_PWM = 0;
+            if (resultSets[1].TryGetValue("STAT_GENERATORLAST_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        mom_Generatorlast_PWM = ((Double)resultData.OpData);
+                    }
+                }
+			
+			// Motortemperatur
+			Double mom_MotorTemp = 0;
+			if (resultSets[1].TryGetValue("STAT_KUEHLMITTELTEMPERATUR_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        mom_MotorTemp = ((Double)resultData.OpData);
+                    }
+                }
+			 
+			// Abgleichwert Leerlaufanhebung
+			if (resultSets_Abgleich[1].TryGetValue("LLA_ABGLEICH_LESEN_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        LLA_momentan = (int)((Double)resultData.OpData);
+                    }
+			}
+			
+			
+			// Automatische Leerlaufanhebung
+			
+			int LLA_neu = 0;
+			
+			// Kupplungsschalter
+			// der countdown dient dazu dass die Leerlaufanhebung erst zurückgenommen wird, 
+			// wenn die Kupplung schon eine Zeit lang nicht betätigt ist
+			
+			if (mom_Kupplung || status_Kupplung) {
+				if(mom_Kupplung) countdown_Kupplung = conf_countdown_Kupplung_max;
+				if(!status_Kupplung) status_Kupplung = true;
+				if(conf_LLA_Kupplung > LLA_neu) LLA_neu = conf_LLA_Kupplung;
+			}
+			
+			if (countdown_Kupplung > 0){
+				countdown_Kupplung--;
+			}
+			else if (countdown_Kupplung == 0){
+				status_Kupplung = false;
+				if(conf_LLA_Basis > LLA_neu) LLA_neu = conf_LLA_Basis;
+			}
+			
+			
+			
+			// Zuheizer
+			// der countdown dient dazu dass die Leerlaufanhebung erst zurückgenommen wird, 
+			// wenn der Zuheizer schon eine Zeit lang inaktiv ist (also z.B. nicht nur kurz wegen zu hoher Generatorlast abgeschaltet wurde)
+			
+			if (mom_Zuheizer_PWM > conf_ZuheizerAnAb || status_Zuheizer) {
+				if(mom_Zuheizer_PWM > conf_ZuheizerAnAb) countdown_ZuheizerAn = conf_countdown_ZuheizerAn_max;
+				if(!status_Zuheizer) status_Zuheizer = true;
+				if(conf_LLA_Zuheizer > LLA_neu) LLA_neu = conf_LLA_Zuheizer;
+			}
+			
+			if (countdown_ZuheizerAn > 0) {
+				countdown_ZuheizerAn--;
+			}
+			else if (countdown_ZuheizerAn == 0) {
+				status_Zuheizer = false;
+				if(conf_LLA_Basis > LLA_neu) LLA_neu = conf_LLA_Basis;
+			}
+			
+			
+			
+			// Generatorlast 
+			
+			if (mom_Generatorlast_PWM > conf_GeneratorlastSehrHochAb || status_GeneratorlastSehrHoch) {
+				if(mom_Generatorlast_PWM > conf_GeneratorlastSehrHochAb) countdown_Generatorlast = conf_countdown_Generatorlast_max;
+				if(!status_GeneratorlastSehrHoch) status_GeneratorlastSehrHoch = true;
+				if(conf_LLA_GeneratorlastSehrHoch > LLA_neu) LLA_neu = conf_LLA_GeneratorlastSehrHoch;
+			}
+			else if (mom_Generatorlast_PWM > conf_GeneratorlastHochAb || status_GeneratorlastHoch) {
+				if(mom_Generatorlast_PWM > conf_GeneratorlastHochAb) countdown_Generatorlast = conf_countdown_Generatorlast_max;
+				if(!status_GeneratorlastHoch) status_GeneratorlastHoch = true;
+				if(conf_LLA_GeneratorlastHoch > LLA_neu) LLA_neu = conf_LLA_GeneratorlastHoch;
+			}
+			
+			if (countdown_Generatorlast > 0) {
+				countdown_Generatorlast--;
+			}
+			else if (countdown_Generatorlast == 0) {
+				status_GeneratorlastHoch = false;
+				status_GeneratorlastSehrHoch = false;
+				if(conf_LLA_Basis > LLA_neu) LLA_neu = conf_LLA_Basis;
+			}
+			
+			
+			
+			// Klimakompressor und Klimabereitschaft
+			if (mom_Klimakompressor) {
+				if(conf_LLA_Klimakompressor > LLA_neu) LLA_neu = conf_LLA_Klimakompressor;
+			}
+			else if (mom_KlimaBereitschaft) {
+				if(conf_LLA_KlimaBereitschaft > LLA_neu) LLA_neu = conf_LLA_KlimaBereitschaft;
+			}
+			
+			
+			
+			// Drehzahlanhebung je nach Motortemperatur, 
+			if(mom_MotorTemp < conf_Temp_MotorSehrKaltBis) {
+				// Motor ist sehr kalt
+				if(conf_LLA_MotorSehrKalt > LLA_neu) LLA_neu = conf_LLA_MotorSehrKalt;
+			}
+			else if(mom_MotorTemp < conf_Temp_MotorKaltBis) {
+				// Motor ist kalt
+				if(conf_LLA_MotorKalt > LLA_neu) LLA_neu = conf_LLA_MotorKalt;
+			}
+			else if(mom_MotorTemp >= conf_Temp_MotorKaltBis && mom_MotorTemp < conf_Temp_MotorBetriebstempAb) {
+				// Motor ist nicht mehr kalt, aber noch nicht auf Betriebstemperatur
+				if(conf_LLA_MotorVorBetriebstemp > LLA_neu) LLA_neu = conf_LLA_MotorVorBetriebstemp;
+			}
+			else if(mom_MotorTemp >= conf_Temp_MotorBetriebstempAb && mom_MotorTemp < conf_Temp_MotorHeissAb && !status_MotorHeiss) {
+				// Motor ist auf Betriebstemperatur
+				if(conf_LLA_MotorBetriebstemp > LLA_neu) LLA_neu = conf_LLA_MotorBetriebstemp;
+			}
+			else if(mom_MotorTemp >= conf_Temp_MotorBetriebstempAb && mom_MotorTemp < conf_Temp_MotorBetriebstempBis && status_MotorHeiss) {
+				// Temperatur ist nachdem Status HEISS wieder weit genug gefallen -> Betriebstemperatur
+				status_MotorHeiss = false;
+				if(conf_LLA_MotorBetriebstemp > LLA_neu) LLA_neu = conf_LLA_MotorBetriebstemp;
+			}
+			else if(mom_MotorTemp >= conf_Temp_MotorHeissAb) {
+				// Motor ist HEISS -> weitere LL Anhebung um die Kühlung zu verbessern aktivieren 
+				// deaktivierung sobald die Temperatur wieder unter [conf_Temp_MotorBetriebstempBis] gefallen ist
+				status_MotorHeiss = true;
+				if(conf_LLA_MotorHeiss > LLA_neu) LLA_neu = conf_LLA_MotorHeiss;
+			}
+			
+			
+			// Motor auf Betriebstemperatur - reduziere LL auf minimum nach einiger Zeit
+			if(LLA_neu == conf_LLA_MotorBetriebstemp) {
+				if(countdown_LLA_aus == 0) {
+					LLA_neu = conf_LLA_Basis;
+				}
+				else if(countdown_LLA_aus > 0) {
+					countdown_LLA_aus--;
+				}
+			}
+			else {
+				countdown_LLA_aus = conf_countdown_LLA_aus;
+			}
+			
+			
+			
+			// wenn der Ziel-LLA-Wert sich vom aktuell eingestellten unterscheidet -> Abgleich verstellen
+			if (LLA_momentan != LLA_neu) {
+				ediabas.ArgString = "lla;" + LLA_neu;
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+                
+                //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...
+                LLA_momentan = LLA_neu;
+				conf_countdown_Job2_max = 0;
+			}
+			
+        }
+		
+		
+        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 "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 "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 "STAT_GENERATORLAST_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,3:0}", value);
+                    
+                    if (found && value <= 60) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 70) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 80) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 80) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+					
+				case "STAT_ZUHEIZER_ANSTEUERUNG_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,3:0}", value);
+                    
+                    if (found && value <= 60) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 70) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 80) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 80) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+					
+		
+                case "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;
+					
+				case "STAT_LADELUFTTEMPERATUR_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    result = string.Format(ActivityMain.Culture, "{0,3:0}", value);
+                    
+                    if (found && value <= 55) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 65) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 75) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 85) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+            }
+            return result;
+        }
+    }
+      ]]>
+    </code>
+	
+  </page>
+</fragment>

+ 380 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/Home1.ccpage

@@ -0,0 +1,380 @@
+<?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="HOME" display-mode="grid" fontsize="medium" gauges-portrait="3" gauges-landscape="5" logfile="DME_DDE.log">
+    <strings lang="de">
+      <string name="HOME">HOME</string>
+	  <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT"> Kühlmitteltemperatur [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT"> Ladelufttemp. [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> Drehzahl [U/min]</string>
+	  <string name="!JOB#LLA_ABGLEICH_LESEN_WERT"> Anhebung Leerlaufdrehzahl [u/min]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> Drehmoment [Nm]:</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 PWM [%]</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_LUFTMASSE_PRO_HUB_WERT"> Luftmasse [mg/Hub]</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_GESCHWINDIGKEIT_WERT"> Geschwindigkeit [km/h]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_FAHRZEUGBESCHLEUNIGUNG_WERT"> Beschleunigung [m/s²]</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="HOME">HOME</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT"> coolant [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT"> charge air temperature [°C]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT"> engine speed [U/min]</string>
+	  <string name="!JOB#LLA_ABGLEICH_LESEN_WERT"> increase idle speed [rpm]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT"> torque [Nm]:</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"> aux heater PWM [%]</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_LUFTMASSE_PRO_HUB_WERT"> air mass [mg/stroke]</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_GESCHWINDIGKEIT_WERT"> speed [km/h]</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_FAHRZEUGBESCHLEUNIGUNG_WERT"> acceleration [m/s²]</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>
+	
+    <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_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_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#LLA_ABGLEICH_LESEN_WERT" result="LLA_ABGLEICH_LESEN_WERT" format="L" display-order="0" grid-type="simple-gauge-round" min-value="0" max-value="250" log_tag="LLA" />
+    <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" 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" grid-type="simple-gauge-round" min-value="0" max-value="100" log_tag="STAT_ZUHEIZER_ANSTEUERUNG_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_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_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_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" />    
+    <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_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_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_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" />
+	
+	<jobs sgbd="D50M57E1" />
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {	
+		private double conf_DetectAuxHeatAbove = 25;
+		private double conf_EngineReallyColdBelow = 25.0;
+		private double conf_EngineColdBelow = 75.0;
+		private double conf_EngineWarmAbove = 85.0;
+		private int conf_IncreaseIdle_AuxHeat = 170;
+		private int conf_IncreaseIdle_ReallyColdEngine = 150;
+		private int conf_IncreaseIdle_ColdEngine = 100;
+		private int conf_IncreaseIdle_WarmEngine = 70;
+		//private int conf_IncreaseIdle_Off = 70;
+		
+		
+		private int conf_auxHeat_offCounter_max = 10;
+		
+		private int auxHeat_offCounter = 0;
+		
+		private int increaseIdle_currentValue = 0;
+		private int increaseIdle_newValue = 0;
+		//private bool increaseIdle_sendCmd = false;
+		
+		private bool state_active_AuxHeat = false;
+		private bool state_active_ColdEngine = false;
+		private bool state_active_ReallyColdEngine = false;
+		private bool state_active_WarmEngine = false;
+		
+		//private bool state_IncreaseIdle_ColdEngine = false;
+		//private bool state_active_WarmEngine = false;
+		
+		List<Dictionary<string, EdiabasNet.ResultData>> resultSets_Temps;
+		List<Dictionary<string, EdiabasNet.ResultData>> resultSets_Abgleich;
+			
+		public void ExecuteJob(EdiabasNet ediabas, ref MultiMap<string, EdiabasNet.ResultData> resultDict, bool firstCall)
+        {
+            List<Dictionary<string, EdiabasNet.ResultData>> resultSets;
+            
+            
+			// Job 1 - ständig zu aktualisierende Werte
+            ediabas.ArgString = "JA;ILMMG;IPLAD;IPUMG;IUBAT;IMOAK;INMOT;SPLAD;IPRDR;IAFZG;IVKMH;ITZUH;IGENL";
+            ediabas.ArgBinaryStd = null;
+            ediabas.ResultsRequests = string.Empty;
+            ediabas.ExecuteJob("STATUS_MESSWERTBLOCK_LESEN");
+            resultSets = ediabas.ResultSets;
+            if (resultSets != null && resultSets.Count >= 2)
+            {
+                EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+            }
+			
+			
+			// Job 2 - seltener zu aktualisierende Werte
+			if(jobs2counter == 0) {
+				
+				ediabas.ArgString = "JA;ITKUM;ITLAL";
+				ediabas.ArgBinaryStd = null;
+				ediabas.ResultsRequests = string.Empty;
+				ediabas.ExecuteJob("STATUS_MESSWERTBLOCK_LESEN");
+				resultSets_Temps = ediabas.ResultSets;
+								
+				ediabas.ArgString = "lla";
+				ediabas.ArgBinaryStd = null;
+				ediabas.ResultsRequests = string.Empty;
+				ediabas.ExecuteJob("ABGLEICH_LESEN");
+				resultSets_Abgleich = ediabas.ResultSets;
+			}
+			else if(jobs2counter >= 10) {
+				jobs2counter = 0;
+			}
+			else {
+				jobs2counter++;
+			}
+			
+			if (resultSets_Temps != null && resultSets_Temps.Count >= 2)
+			{
+				EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets_Temps[1]);
+			}
+			
+			if (resultSets_Abgleich != null && resultSets_Abgleich.Count >= 2)
+			{
+				EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets_Abgleich[1], "LLA_");
+			}
+								
+			
+			// 
+			
+            EdiabasNet.ResultData resultData;
+			
+			int curr_auxHeatPWM = 0;
+            if (resultSets[1].TryGetValue("STAT_ZUHEIZER_ANSTEUERUNG_WERT", out resultData))
+                {
+                    if (resultData.OpData is Int64)
+                    {
+                        curr_auxHeatPWM = (double)((Int64)resultData.OpData);
+                    }
+                }
+			
+			int curr_motorTemp = 0;
+			if (resultSets[1].TryGetValue("STAT_KUEHLMITTELTEMPERATUR_WERT", out resultData))
+                {
+                    if (resultData.OpData is Int64)
+                    {
+                        curr_motorTemp = (double)((Int64)resultData.OpData);
+                    }
+                }
+			
+			
+			if (curr_auxHeatPWM > conf_DetectAuxHeatAbove) {
+				auxHeat_offCounter = conf_auxHeat_offCounter_max;
+				if(!state_active_AuxHeat) {
+					state_active_AuxHeat = true;
+					increaseIdle_newValue = conf_IncreaseIdle_AuxHeat;
+					//increaseIdle_sendCmd = true;
+				}
+			}
+			else if (auxHeat_offCounter > 0) {
+				auxHeat_offCounter--;
+			}
+			else if (auxHeat_offCounter == 0) {
+				state_active_AuxHeat = false;
+			}
+						
+			
+			if(!state_active_AuxHeat) {
+				if(curr_motorTemp < conf_EngineReallyColdBelow) {
+					if(!state_active_ReallyColdEngine) {
+						state_active_ReallyColdEngine = true;
+						state_active_ColdEngine = false;
+						state_active_WarmEngine = false;
+						increaseIdle_newValue = conf_IncreaseIdle_ReallyColdEngine;
+					}
+				}
+				else if(curr_motorTemp < conf_EngineColdBelow) {
+					if(!state_active_ColdEngine) {
+						state_active_ReallyColdEngine = false;
+						state_active_ColdEngine = true;
+						state_active_WarmEngine = false;
+						increaseIdle_newValue = conf_IncreaseIdle_ColdEngine;
+						}
+					}
+				else if(curr_motorTemp >= conf_EngineWarmAbove) {
+					state_active_ColdEngine = false;
+					if(!state_active_WarmEngine) {
+						state_active_ReallyColdEngine = false;
+						state_active_WarmEngine = true;
+						state_active_ColdEngine = false;
+						increaseIdle_newValue = conf_IncreaseIdle_WarmEngine;
+					}
+				}
+			}
+			
+			
+			
+			if (increaseIdle_currentValue != increaseIdle_newValue) {
+				ediabas.ArgString = "lla;" + increaseIdle_newValue;
+                ediabas.ArgBinaryStd = null;
+                ediabas.ResultsRequests = "JOB_STATUS";
+                ediabas.ExecuteJob("ABGLEICH_VERSTELLEN");
+                
+                //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...
+                //increaseIdle_sendCmd = false;
+				increaseIdle_currentValue = increaseIdle_newValue;
+			}
+			
+        }
+		
+		
+        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 "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 "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 "STAT_GENERATORLAST_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,3:0}", value);
+                    
+                    if (found && value <= 60) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 70) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 80) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 80) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+					
+				case "STAT_ZUHEIZER_ANSTEUERUNG_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,3:0}", value);
+                    
+                    if (found && value <= 60) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 70) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 80) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 80) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+					
+
+                case "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;
+					
+				case "STAT_LADELUFTTEMPERATUR_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    result = string.Format(ActivityMain.Culture, "{0,3:0}", value);
+                    
+                    if (found && value <= 55) textColor = Android.Graphics.Color.White;
+                    else if (found && value <= 65) textColor = Android.Graphics.Color.Yellow;
+                    else if (found && value <= 75) textColor = Android.Graphics.Color.Orange;
+                    else if (found && value > 85) textColor = Android.Graphics.Color.Red;
+                    else textColor = Android.Graphics.Color.Gray;
+                    
+                    break;
+            }
+            return result;
+        }
+    }
+      ]]>
+    </code>
+	
+	
+	<jobs sgbd="kombi46r" />
+      <!--	name="STATUS_TOENS_IO">-->
+	<code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {
+		private int callCounter = 0;
+		
+		public void ExecuteJob(EdiabasNet ediabas, ref MultiMap<string, EdiabasNet.ResultData> resultDict, bool firstCall)
+        {
+			if(callCounter == 0) {
+				List<Dictionary<string, EdiabasNet.ResultData>> resultSets;
+				
+				// Job - ständig zu aktualisierende Werte
+				ediabas.ArgString = string.Empty;
+				ediabas.ArgBinaryStd = null;
+				ediabas.ResultsRequests = string.Empty;
+				ediabas.ExecuteJob("STATUS_TOENS_IO");
+				resultSets = ediabas.ResultSets;
+				if (resultSets != null && resultSets.Count >= 2)
+				{
+					EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+				}
+			}
+			else {
+				if(callCounter < 15) callCounter++;
+				else callCounter = 0;
+			}
+		}
+    }
+      ]]>
+    </code>
+	
+  </page>
+</fragment>

+ 133 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/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>

+ 5 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/IBUS_App_BT.cccfg

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
+  <global log_path="Log" manufacturer="BMW" interface="BLUETOOTH" />
+  <include filename="Pages.ccpages" />
+</configuration>

+ 5 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/IBUS_App_USB.cccfg

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration xmlns="http://www.holeschak.de/BmwDeepObd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.holeschak.de/BmwDeepObd BmwDeepObd.xsd">
+  <global log_path="Log" manufacturer="BMW" interface="FTDI" />
+  <include filename="Pages.ccpages" />
+</configuration>

+ 71 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/IBUS_App_noCode.ccpage

@@ -0,0 +1,71 @@
+<?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 id="1" 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="1#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="1#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="1#STAT_UBATT_WERT" format="2.1R" 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="1#STAT_KUEHLMITTELTEMPERATUR_WERT" format="L" 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="1#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="1#STAT_MOTORDREHZAHL_WERT" format="L" 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="1#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="1#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="1#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="1#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="1#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="1#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="1#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="1#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="1#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"  log_tag="STAT_UMGEBUNGSDRUCK_WERT" />
+      </job>
+	  <job id="2" sgbd="kombi46r" name="STATUS_TOENS_IO">
+        <display name="!JOB#STATUS_TOENS_IO#STAT_TOG_HIGH_WERT" result="1#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="1#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>
+  </page>
+</fragment>

+ 69 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/IHKA46_3.ccpage

@@ -0,0 +1,69 @@
+<?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="IHKA46" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="IHKA46_3.log">
+    <strings>
+      <string name="IHKA46">IHKA46_3</string>
+      <string name="!JOB#STATUS_ANALOGEINGAENGE#STAT_KLEMME30_WERT"> voltage [V]</string>
+      <string name="!JOB#STATUS_ANALOGEINGAENGE#STAT_AUC_HEIZUNG_WERT"> AUC heating [V]</string>
+      <string name="!JOB#STATUS_ANALOGEINGAENGE#STAT_TINNEN_WERT"> interieur temp. [°C]</string>
+      <string name="!JOB#STATUS_ANALOGEINGAENGE#STAT_SOLARSENSOR_WERT"> solar sensor</string>
+      <string name="!JOB#STATUS_ANALOGEINGAENGE#STAT_DRUCKSENSOR_WERT"> pressure</string>
+      <string name="!JOB#STATUS_REGLERGROESSEN#STAT_SOLL_WERT"> target temp. [°C]</string>
+      <string name="!JOB#STATUS_REGLERGROESSEN#STAT_TAUSSEN_WERT"> ambient temp. [°C]</string>
+      <string name="!JOB#STATUS_REGLERGROESSEN#STAT_GESCHWINDIGKEIT_WERT"> speed [km/h]</string>
+      <string name="!JOB#STATUS_REGLERGROESSEN#STAT_DREHZAHL_WERT"> engine speed [1/min]</string>
+      <string name="!JOB#STATUS_BEDIENTEIL#STAT_GEBLAESESTUFE_WERT"> ventilation level</string>
+      <string name="!JOB#STATUS_IO#STAT_WASSERVENTIL_EIN"> water valve </string>
+      <string name="!JOB#STATUS_IO#STAT_ZUSATZWASSERPUMPE_EIN"> aux water pump</string>
+      <string name="!JOB#STATUS_IO#STAT_ZUHEIZER_EIN"> additional heater</string>
+      <string name="!JOB#STATUS_IO#STAT_RELAIS_HECKSCHEIBE_EIN"> heating rear window</string>
+      <string name="!JOB#STATUS_MOTOR_KLAPPENPOSITION#STAT_ENTFROSTUNG_WERT"> defrost</string>
+    </strings>
+	<strings lang="de">
+      <string name="IHKA46">IHKA46_3</string>
+      <string name="!JOB#STATUS_ANALOGEINGAENGE#STAT_KLEMME30_WERT"> Spannung [V]</string>
+      <string name="!JOB#STATUS_ANALOGEINGAENGE#STAT_AUC_HEIZUNG_WERT"> AUC Heizung [V]</string>
+      <string name="!JOB#STATUS_ANALOGEINGAENGE#STAT_TINNEN_WERT"> Innenraumtemp. [°C]</string>
+      <string name="!JOB#STATUS_ANALOGEINGAENGE#STAT_SOLARSENSOR_WERT"> Solarsensor</string>
+      <string name="!JOB#STATUS_ANALOGEINGAENGE#STAT_DRUCKSENSOR_WERT"> Druck</string>
+      <string name="!JOB#STATUS_REGLERGROESSEN#STAT_SOLL_WERT"> Zieltemperatur [°C]</string>
+      <string name="!JOB#STATUS_REGLERGROESSEN#STAT_TAUSSEN_WERT"> Außentemp. [°C]</string>
+      <string name="!JOB#STATUS_REGLERGROESSEN#STAT_GESCHWINDIGKEIT_WERT"> Geschwindigkeit [km/h]</string>
+      <string name="!JOB#STATUS_REGLERGROESSEN#STAT_DREHZAHL_WERT"> Drehzahl [1/min]</string>
+      <string name="!JOB#STATUS_BEDIENTEIL#STAT_GEBLAESESTUFE_WERT"> Gebläsestufe</string>
+      <string name="!JOB#STATUS_IO#STAT_WASSERVENTIL_EIN"> Wasserventil </string>
+      <string name="!JOB#STATUS_IO#STAT_ZUSATZWASSERPUMPE_EIN"> Zusatzwasserpumpe</string>
+      <string name="!JOB#STATUS_IO#STAT_ZUHEIZER_EIN"> Zuheizer</string>
+      <string name="!JOB#STATUS_IO#STAT_RELAIS_HECKSCHEIBE_EIN"> Heckscheibenheizung</string>
+      <string name="!JOB#STATUS_MOTOR_KLAPPENPOSITION#STAT_ENTFROSTUNG_WERT"> Defrost</string>
+    </strings>
+    <jobs sgbd="ihka46_3">
+      <job name="FS_LESEN" />
+      <job name="STATUS_ANALOGEINGAENGE">
+        <display name="!JOB#STATUS_ANALOGEINGAENGE#STAT_KLEMME30_WERT" result="STAT_KLEMME30_WERT" format="2.1R" log_tag="STAT_KLEMME30_WERT" />
+        <display name="!JOB#STATUS_ANALOGEINGAENGE#STAT_AUC_HEIZUNG_WERT" result="STAT_AUC_HEIZUNG_WERT" format="2.1R" log_tag="STAT_AUC_HEIZUNG_WERT" />
+        <display name="!JOB#STATUS_ANALOGEINGAENGE#STAT_TINNEN_WERT" result="STAT_TINNEN_WERT" format="2.1R" log_tag="STAT_TINNEN_WERT" />
+        <display name="!JOB#STATUS_ANALOGEINGAENGE#STAT_SOLARSENSOR_WERT" result="STAT_SOLARSENSOR_WERT" format="2.1R" log_tag="STAT_SOLARSENSOR_WERT" />
+        <display name="!JOB#STATUS_ANALOGEINGAENGE#STAT_DRUCKSENSOR_WERT" result="STAT_DRUCKSENSOR_WERT" format="2.1R" log_tag="STAT_DRUCKSENSOR_WERT" />
+      </job>
+      <job name="STATUS_REGLERGROESSEN">
+        <display name="!JOB#STATUS_REGLERGROESSEN#STAT_SOLL_WERT" result="STAT_SOLL_WERT" format="2.1R" log_tag="STAT_SOLL_WERT" />
+        <display name="!JOB#STATUS_REGLERGROESSEN#STAT_TAUSSEN_WERT" result="STAT_TAUSSEN_WERT" format="2.1R" log_tag="STAT_TAUSSEN_WERT" />
+        <display name="!JOB#STATUS_REGLERGROESSEN#STAT_GESCHWINDIGKEIT_WERT" result="STAT_GESCHWINDIGKEIT_WERT" format="3.1R" log_tag="STAT_GESCHWINDIGKEIT_WERT" />
+        <display name="!JOB#STATUS_REGLERGROESSEN#STAT_DREHZAHL_WERT" result="STAT_DREHZAHL_WERT" format="4.0R" log_tag="STAT_DREHZAHL_WERT" />
+      </job>
+      <job name="STATUS_BEDIENTEIL">
+        <display name="!JOB#STATUS_BEDIENTEIL#STAT_GEBLAESESTUFE_WERT" result="STAT_GEBLAESESTUFE_WERT" format="1.0R" log_tag="STAT_GEBLAESESTUFE_WERT" />
+      </job>
+      <job name="STATUS_IO">
+        <display name="!JOB#STATUS_IO#STAT_WASSERVENTIL_EIN" result="STAT_WASSERVENTIL_EIN" format="" log_tag="STAT_WASSERVENTIL_EIN" />
+        <display name="!JOB#STATUS_IO#STAT_ZUSATZWASSERPUMPE_EIN" result="STAT_ZUSATZWASSERPUMPE_EIN" format="" log_tag="STAT_ZUSATZWASSERPUMPE_EIN" />
+        <display name="!JOB#STATUS_IO#STAT_ZUHEIZER_EIN" result="STAT_ZUHEIZER_EIN" format="" log_tag="STAT_ZUHEIZER_EIN" />
+        <display name="!JOB#STATUS_IO#STAT_RELAIS_HECKSCHEIBE_EIN" result="STAT_RELAIS_HECKSCHEIBE_EIN" format="" log_tag="STAT_RELAIS_HECKSCHEIBE_EIN" />
+      </job>
+      <job name="STATUS_MOTOR_KLAPPENPOSITION">
+        <display name="!JOB#STATUS_MOTOR_KLAPPENPOSITION#STAT_ENTFROSTUNG_WERT" result="STAT_ENTFROSTUNG_WERT" format="" log_tag="STAT_ENTFROSTUNG_WERT" />
+      </job>
+    </jobs>
+  </page>
+</fragment>

+ 125 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/KOMBI46R.ccpage

@@ -0,0 +1,125 @@
+<?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="KOMBI46R" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="KOMBI46R.log">
+    <strings>
+      <string name="KOMBI46R">KOMBI</string>
+      <string name="!JOB#STATUS_AIF_FG_NR_LESEN#STAT_AIF_FG_NR"> VIN</string>
+	  <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_SERVICE_TEXT"> SIA last service type</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_INSPEKTIONSGRENZE_WERT"> SIA inspection way target</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_ZEITGRENZE_WERT"> SIA inspection time target</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_KRAFTSTOFFMENGE_WERT"> SIA fuel target</string>
+      <string name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_HEBEL1_WERT"> fuel level 1</string>
+      <string name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_HEBEL2_WERT"> fuel level 2</string>
+      <string name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_GEF_WERT"> fuel level</string>
+      <string name="!JOB#STATUS_AIF_AUSSENTEMP_LESEN#STAT_AUSSENTEMP_GEF_WERT"> ambient temperature</string>
+	  <string name="!JOB#STATUS_ANALOG_LESEN#STAT_BREMSVERSCHLEISS1_WERT"> brake wear contact</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_BREMSFLUESSIGKEIT_EIN"> brake fluid level</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_KUEHLMITTELSTAND_EIN"> coolant level</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_LSS_EIN"> LSS ??</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_OELDRUCK_EIN"> oil pressure switch</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_HANDBREMSE_EIN"> handbrake</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_GURTKONTAKT_EIN"> seat belt contact</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_KL15_EIN"> signal 15</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_KL30_EIN"> signal 30</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_KL50_EIN"> signal 50</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_KLR_EIN"> signal R</string>
+      <string name="!JOB#STATUS_CAN_MOTORDREHZAHL_LESEN#STAT_MOTORDREHZAHL_WERT"> engine speed</string>
+      <string name="!JOB#STATUS_CAN_KUEHLMITTELTEMP_LESEN#STAT_KUEHLMITTELTEMP_WERT"> coolant</string>
+      <string name="!JOB#STATUS_CAN_GETRIEBEINFO_LESEN#STAT_GANG_INFO_WERT"> gear</string>
+      <string name="!JOB#STATUS_CAN_EINSPRITZMENGE_LESEN#STAT_EINSPRITZMENGE_WERT"> injection mass</string>
+      <string name="!JOB#STATUS_SIA_FINISH#STAT_LITER_WERT"> SIA used fuel (l)</string>
+      <string name="!JOB#STATUS_SIA_FINISH#STAT_TAGES_WERT"> SIA used days</string>
+	  <string name="!JOB#STATUS_TOENS_IO#STAT_TOG_HIGH_WERT"> TÖNS heating time [s]</string>
+      <string name="!JOB#STATUS_TOENS_IO#STAT_TOG_LOW_WERT"> TÖNS cooling time [s]</string>
+    </strings>
+	<strings lang="de">
+      <string name="KOMBI46R">KOMBI</string>
+      <string name="!JOB#STATUS_AIF_FG_NR_LESEN#STAT_AIF_FG_NR"> VIN</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_SERVICE_TEXT"> SIA letztes Service Art</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_ZEIT_INSP_ZAEHLER_WERT"> SIA Zeitinspektionszähler [d]</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_ZEITGRENZE_WERT"> SIA Zeitgrenze</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_INSPEKTIONSGRENZE_WERT"> SIA Inspektionsgrenze [l]</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_KRAFTSTOFFMENGE_WERT"> SIA Kraftstoffmenge [l]</string>
+      <string name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_HEBEL1_WERT"> Tankgeber 1</string>
+      <string name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_HEBEL2_WERT"> Tankgeber 2</string>
+      <string name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_GEF_WERT"> Tankfüllstand [l]</string>
+      <string name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_UNGEF_WERT"> Tankfüllstand (ungefiltert) [l]</string>
+      <string name="!JOB#STATUS_AIF_AUSSENTEMP_LESEN#STAT_AUSSENTEMP_GEF_WERT"> Außentemperatur [°C]</string>
+      <string name="!JOB#STATUS_ANALOG_LESEN#STAT_BREMSVERSCHLEISS1_WERT"> Bremsverschleisskontakt</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_BREMSFLUESSIGKEIT_EIN"> Bremsflüssigkeitsstand</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_KUEHLMITTELSTAND_EIN"> Kühlmittelstand</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_LSS_EIN"> LSS ??</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_OELDRUCK_EIN"> Öldruckschalter</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_HANDBREMSE_EIN"> Handbremse gezogen</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_GURTKONTAKT_EIN"> Gurtkontakt</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_KL15_EIN"> Klemme 15</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_KL30_EIN"> Klemme 30</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_KL50_EIN"> Klemme 50</string>
+      <string name="!JOB#STATUS_IO_LESEN#STAT_KLR_EIN"> Klemme R</string>
+      <string name="!JOB#STATUS_CAN_MOTORDREHZAHL_LESEN#STAT_MOTORDREHZAHL_WERT"> Drehzahl [1/min]</string>
+      <string name="!JOB#STATUS_CAN_KUEHLMITTELTEMP_LESEN#STAT_KUEHLMITTELTEMP_WERT"> Kühlmitteltemperatur [°C]</string>
+      <string name="!JOB#STATUS_CAN_GETRIEBEINFO_LESEN#STAT_GANG_INFO_WERT"> Fahrstufe</string>
+      <string name="!JOB#STATUS_CAN_EINSPRITZMENGE_LESEN#STAT_EINSPRITZMENGE_WERT"> Einspritzmenge</string>
+      <string name="!JOB#STATUS_SIA_FINISH#STAT_LITER_WERT"> Kraftstoffmenge seit Service</string>
+      <string name="!JOB#STATUS_SIA_FINISH#STAT_TAGES_WERT"> Tage seit Service</string>
+	  <string name="!JOB#STATUS_TOENS_IO#STAT_TOG_HIGH_WERT"> TÖNS Heizzeit [s]</string>
+      <string name="!JOB#STATUS_TOENS_IO#STAT_TOG_LOW_WERT"> TÖNS Kühlzeit [s]</string>
+    </strings>
+    <jobs sgbd="kombi46r">
+      <job name="STATUS_AIF_FG_NR_LESEN">
+        <display name="!JOB#STATUS_AIF_FG_NR_LESEN#STAT_AIF_FG_NR" result="STAT_AIF_FG_NR" format="" log_tag="STAT_AIF_FG_NR" />
+      </job>
+      <job name="STATUS_AIF_SIA_DATEN_LESEN">
+        <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_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_INSPEKTIONSGRENZE_WERT" result="STAT_INSPEKTIONSGRENZE_WERT" format="L" log_tag="STAT_INSPEKTIONSGRENZE_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#STATUS_AIF_SIA_DATEN_LESEN#STAT_KRAFTSTOFFMENGE_WERT" result="STAT_KRAFTSTOFFMENGE_WERT" format="L" log_tag="STAT_KRAFTSTOFFMENGE_WERT" />
+      </job>
+	  <job name="STATUS_SIA_FINISH">
+        <display name="!JOB#STATUS_SIA_FINISH#STAT_LITER_WERT" result="STAT_LITER_WERT" format="3.1R" log_tag="STAT_LITER_WERT" />
+        <display name="!JOB#STATUS_SIA_FINISH#STAT_TAGES_WERT" result="STAT_TAGES_WERT" format="4.0R" log_tag="STAT_TAGES_WERT" />
+      </job>
+      <job name="STATUS_AIF_TANKDATEN_LESEN">
+        <display name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_HEBEL1_WERT" result="STAT_TANKINHALT_HEBEL1_WERT" format="3.1R" log_tag="STAT_TANKINHALT_HEBEL1_WERT" />
+        <display name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_HEBEL2_WERT" result="STAT_TANKINHALT_HEBEL2_WERT" format="3.1R" log_tag="STAT_TANKINHALT_HEBEL2_WERT" />
+        <display name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_GEF_WERT" result="STAT_TANKINHALT_GEF_WERT" format="3.1R" log_tag="STAT_TANKINHALT_GEF_WERT" />
+        <display name="!JOB#STATUS_AIF_TANKDATEN_LESEN#STAT_TANKINHALT_UNGEF_WERT" result="STAT_TANKINHALT_UNGEF_WERT" format="3.1R" log_tag="STAT_TANKINHALT_UNGEF_WERT" />
+      </job>
+      <job name="STATUS_AIF_AUSSENTEMP_LESEN">
+        <display name="!JOB#STATUS_AIF_AUSSENTEMP_LESEN#STAT_AUSSENTEMP_GEF_WERT" result="STAT_AUSSENTEMP_GEF_WERT" format="3.1R" log_tag="STAT_AUSSENTEMP_GEF_WERT" />
+      </job>
+	  <job name="STATUS_ANALOG_LESEN">
+        <display name="!JOB#STATUS_ANALOG_LESEN#STAT_BREMSVERSCHLEISS1_WERT" result="STAT_BREMSVERSCHLEISS1_WERT" format="3.1R" log_tag="STAT_BREMSVERSCHLEISS1_WERT" />
+      </job>
+	  <job name="STATUS_IO_LESEN">
+        <display name="!JOB#STATUS_IO_LESEN#STAT_BREMSFLUESSIGKEIT_EIN" result="STAT_BREMSFLUESSIGKEIT_EIN" format="L" log_tag="STAT_BREMSFLUESSIGKEIT_EIN" />
+        <display name="!JOB#STATUS_IO_LESEN#STAT_KUEHLMITTELSTAND_EIN" result="STAT_KUEHLMITTELSTAND_EIN" format="L" log_tag="STAT_KUEHLMITTELSTAND_EIN" />
+        <display name="!JOB#STATUS_IO_LESEN#STAT_LSS_EIN" result="STAT_LSS_EIN" format="L" log_tag="STAT_LSS_EIN" />
+        <display name="!JOB#STATUS_IO_LESEN#STAT_OELDRUCK_EIN" result="STAT_OELDRUCK_EIN" format="L" log_tag="STAT_OELDRUCK_EIN" />
+        <display name="!JOB#STATUS_IO_LESEN#STAT_HANDBREMSE_EIN" result="STAT_HANDBREMSE_EIN" format="L" log_tag="STAT_HANDBREMSE_EIN" />
+        <display name="!JOB#STATUS_IO_LESEN#STAT_GURTKONTAKT_EIN" result="STAT_GURTKONTAKT_EIN" format="L" log_tag="STAT_GURTKONTAKT_EIN" />
+        <display name="!JOB#STATUS_IO_LESEN#STAT_KL15_EIN" result="STAT_KL15_EIN" format="L" log_tag="STAT_KL15_EIN" />
+        <display name="!JOB#STATUS_IO_LESEN#STAT_KL30_EIN" result="STAT_KL30_EIN" format="L" log_tag="STAT_KL30_EIN" />
+        <display name="!JOB#STATUS_IO_LESEN#STAT_KL50_EIN" result="STAT_KL50_EIN" format="L" log_tag="STAT_KL50_EIN" />
+        <display name="!JOB#STATUS_IO_LESEN#STAT_KLR_EIN" result="STAT_KLR_EIN" format="L" log_tag="STAT_KLR_EIN" />
+      </job>
+      <job name="STATUS_CAN_MOTORDREHZAHL_LESEN">
+        <display name="!JOB#STATUS_CAN_MOTORDREHZAHL_LESEN#STAT_MOTORDREHZAHL_WERT" result="STAT_MOTORDREHZAHL_WERT" format="4.0R" log_tag="STAT_MOTORDREHZAHL_WERT" />
+      </job>
+      <job name="STATUS_CAN_KUEHLMITTELTEMP_LESEN">
+        <display name="!JOB#STATUS_CAN_KUEHLMITTELTEMP_LESEN#STAT_KUEHLMITTELTEMP_WERT" result="STAT_KUEHLMITTELTEMP_WERT" format="3.1R" log_tag="STAT_KUEHLMITTELTEMP_WERT" />
+      </job>
+      <job name="STATUS_CAN_GETRIEBEINFO_LESEN">
+        <display name="!JOB#STATUS_CAN_GETRIEBEINFO_LESEN#STAT_GANG_INFO_WERT" result="STAT_GANG_INFO_WERT" format="" log_tag="STAT_GANG_INFO_WERT" />
+      </job>
+      <job name="STATUS_CAN_EINSPRITZMENGE_LESEN">
+        <display name="!JOB#STATUS_CAN_EINSPRITZMENGE_LESEN#STAT_EINSPRITZMENGE_WERT" result="STAT_EINSPRITZMENGE_WERT" format="3.1R" log_tag="STAT_EINSPRITZMENGE_WERT" />
+      </job>
+	  <job name="STATUS_TOENS_IO">
+        <display name="!JOB#STATUS_TOENS_IO#STAT_TOG_HIGH_WERT" result="STAT_TOG_HIGH_WERT" format="L" log_tag="STAT_TOG_HIGH_WERT" />
+        <display name="!JOB#STATUS_TOENS_IO#STAT_TOG_LOW_WERT" result="STAT_TOG_LOW_WERT" format="L" log_tag="STAT_TOG_LOW_WERT" />
+      </job>
+    </jobs>
+  </page>
+</fragment>

+ 255 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/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
Fahrzeugkonfigurationen/E46 M57N AutoLLA/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]
+	
+	

+ 234 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/KOMBI46R_SIA_4buttons.ccpage

@@ -0,0 +1,234 @@
+<?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="!PAGE_NAME" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="RPA_DSC_MK60.log">
+    <strings>
+      <string name="!PAGE_NAME">SIA</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_SERVICE_TEXT"> letztes Service war</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_INSPEKTIONSGRENZE_WERT"> Inspektionsgrenze [l Kraftstoff]</string>
+      <string name="!JOB#STATUS_AIF_SIA_DATEN_LESEN#STAT_KRAFTSTOFFMENGE_WERT"> Kraftstoffmenge seit letztem Service</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>
+    <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;
+        
+        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 = "SIA RESET WEG- INSPEKTION";
+            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 = "SIA 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 = "SIA 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 = "SIA Korrektur 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]);
+            }
+            
+            // Job 2
+           // ediabas.ArgString = string.Empty;
+           // ediabas.ArgBinaryStd = null;
+           // ediabas.ResultsRequests = string.Empty;
+            
+           // ediabas.ExecuteJob("ZEITINPEKTIONSDATUM_LESEN");
+            
+            //resultSets = ediabas.ResultSets;
+            //if (resultSets != null && resultSets.Count >= 2)
+           // {
+               // EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1]);
+          //  }
+            
+            
+            // Button Jobs
+            
+        
+        
+        
+            
+            // Button 1 - SIA RESET Weginspektion
+            if (doSIAWegReset) {
+                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>

+ 160 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/LSZ_2.ccpage

@@ -0,0 +1,160 @@
+<?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="LSZ_2" display-mode="list" fontsize="small" gauges-portrait="2" gauges-landscape="4" logfile="LSZ_2.log">
+    <strings>
+      <string name="LSZ_2">LSZ</string>
+      <string name="!JOB#STATUS_LESEN#STAT_SCHALTER_FL_LH_WERT"> Input volt. Switch Highbeam [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_SCHALTER_BLK_WERT"> Input volt. Schalter Blinker [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_SPANNUNG_BELADUNGSSENSOR_VORN_WERT"> Input volt. axis sensor F [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_SPANNUNG_BELADUNGSSENSOR_HINTEN_WERT"> Input volt. axis sensor R [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_E-Spannung_DIMMER_WERT"> Input volt. dimmer [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_E-Spannung_LWR_POTI_WERT"> Input volt. LWR-Pot [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_E-Spannung_FOTOZELLE_WERT"> Input volt. photoresistor [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_U_BATT_WERT"> battery voltage [V]</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_AL_LINKS_DEFEKT"> CheckControl low beam L DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_AL_RECHTS_DEFEKT"> CheckControl low beam R DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BL_LINKS_DEFEKT"> CheckControl brake light L DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BL_RECHTS_DEFEKT"> CheckControl brake light R DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_LINKS_HINTEN_DEFEKT"> CheckControl blinker RL DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_LINKS_VORN_DEFEKT"> CheckControl blinker FL DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_RECHTS_HINTEN_DEFEKT"> CheckControl blinker RR DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_RECHTS_VORN_DEFEKT"> CheckControl blinker FR DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_ZUSATZ_LINKS_DEFEKT"> CheckControl side blinker L DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_ZUSATZ_RECHTS_DEFEKT"> CheckControl side blinker R DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_FL_LINKS_DEFEKT"> CheckControl high beam L DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_FL_RECHTS_DEFEKT"> CheckControl high beam R DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_KZL_DEFEKT"> CheckControl license plate light DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_NSL_DEFEKT"> CheckControl fog rear light DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL_LINKS_HINTEN_DEFEKT"> CheckControl tail light RL DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL_RECHTS_HINTEN_DEFEKT"> CheckControl tail light RR DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL2_LINKS_HINTEN_DEFEKT"> CheckControl tail light 2 RL DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL2_RECHTS_HINTEN_DEFEKT"> CheckControl tail light 2 RR DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL3_LINKS_HINTEN_DEFEKT"> CheckControl tail light 3 RL DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL3_RECHTS_HINTEN_DEFEKT"> CheckControl tail light 3 RR DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL_LINKS_VORN_DEFEKT"> CheckControl side marker FL DEFECTIVE</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL_RECHTS_VORN_DEFEKT"> CheckControl side marker FR DEFECTIVE</string>
+      <string name="!JOB#SIA_LESEN#GESAMTWEGSTRECKE_WERT"> total distance [*100 km]</string>
+      <string name="!JOB#SIA_LESEN#SI_WEGZAEHLER_WERT"> SIA counter distance [km]</string>
+      <string name="!JOB#SIA_LESEN#SI_LITERZAEHLER_WERT"> SIA counter liters</string>
+      <string name="!JOB#SIA_LESEN#SI_WEGSTRECKE_LETZTER_OELSERVICE_WERT"> SIA distance since last oil change [km]</string>
+      <string name="!JOB#SIA_LESEN#SI_ZEITINSPEKTIONSZAEHLER_WERT"> SIA counter timeinspection</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_LSZ_WERT"> operation time LSZ</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_AL_LINKS_WERT"> operation time low beam L</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_AL_RECHTS_WERT"> operation time low beam R</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BL_L_WERT"> operation time brake light L</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BL_R_WERT"> operation time brake light R</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_SL_LH_WERT"> operation time tail light RL</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_SL_RH_WERT"> operation time tail light RR</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BLK_L_WERT"> operation time blinker L</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BLK_R_WERT"> operation time blinker R</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_NSL_WERT"> operation time rear fog light</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_NSW_RELAIS_WERT"> operation time front fog light</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#ANZAHL_BETAETIGUNGEN_BLS_WERT"> count actuations brake light</string>
+    </strings>
+	<strings lang="de">
+      <string name="LSZ_2">LSZ</string>
+      <string name="!JOB#STATUS_LESEN#STAT_SCHALTER_FL_LH_WERT"> Eingangsspannung Schalter Fernlicht [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_SCHALTER_BLK_WERT"> Eingangsspannung Schalter Blinker [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_SPANNUNG_BELADUNGSSENSOR_VORN_WERT"> Eingangsspannung Beladungssensor V [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_SPANNUNG_BELADUNGSSENSOR_HINTEN_WERT"> Eingangsspannung Beladungssensor H [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_E-Spannung_DIMMER_WERT"> Eingangsspannung Dimmer [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_E-Spannung_LWR_POTI_WERT"> Eingangsspannung LWR-Poti [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_E-Spannung_FOTOZELLE_WERT"> Eingangsspannung Fotozelle [V]</string>
+      <string name="!JOB#STATUS_LESEN#STAT_U_BATT_WERT"> Bordspannung [V]</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_AL_LINKS_DEFEKT"> CheckControl Abblendlinks L DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_AL_RECHTS_DEFEKT"> CheckControl Abblendlicht R DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BL_LINKS_DEFEKT"> CheckControl Bremslicht L DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BL_RECHTS_DEFEKT"> CheckControl Bremslicht R DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_LINKS_HINTEN_DEFEKT"> CheckControl Blinker LH DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_LINKS_VORN_DEFEKT"> CheckControl Blinker LV DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_RECHTS_HINTEN_DEFEKT"> CheckControl Blinker RH DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_RECHTS_VORN_DEFEKT"> CheckControl Blinker RV DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_ZUSATZ_LINKS_DEFEKT"> CheckControl Zusatzblinker L DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_BLK_ZUSATZ_RECHTS_DEFEKT"> CheckControl Zusatzblinker R DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_FL_LINKS_DEFEKT"> CheckControl Fernlicht L DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_FL_RECHTS_DEFEKT"> CheckControl Fernlicht R DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_KZL_DEFEKT"> CheckControl Kennzeichenbel. DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_NSL_DEFEKT"> CheckControl Nebelschlussleuchte DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL_LINKS_HINTEN_DEFEKT"> CheckControl Standlicht LH DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL_RECHTS_HINTEN_DEFEKT"> CheckControl Standlicht RH DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL2_LINKS_HINTEN_DEFEKT"> CheckControl Standlicht 2 LH DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL2_RECHTS_HINTEN_DEFEKT"> CheckControl Standlicht 2 RH DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL3_LINKS_HINTEN_DEFEKT"> CheckControl Standlicht 3 LH DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL3_RECHTS_HINTEN_DEFEKT"> CheckControl Standlicht 3 RH DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL_LINKS_VORN_DEFEKT"> CheckControl Standlicht LV DEFEKT</string>
+	  <string name="!JOB#STATUS_LESEN#STAT_SL_RECHTS_VORN_DEFEKT"> CheckControl Standlicht RV DEFEKT</string>
+      <string name="!JOB#SIA_LESEN#GESAMTWEGSTRECKE_WERT"> Gesamtwegstrecke [*100 km]</string>
+      <string name="!JOB#SIA_LESEN#SI_WEGZAEHLER_WERT"> SIA Wegzähler [km]</string>
+      <string name="!JOB#SIA_LESEN#SI_LITERZAEHLER_WERT"> SIA Literzähler</string>
+      <string name="!JOB#SIA_LESEN#SI_WEGSTRECKE_LETZTER_OELSERVICE_WERT"> SIA Wegstrecke letzter Ölservice [km]</string>
+      <string name="!JOB#SIA_LESEN#SI_ZEITINSPEKTIONSZAEHLER_WERT"> SIA Zeitinspektionszähler</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_LSZ_WERT"> Betriebsstunden LSZ</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_AL_LINKS_WERT"> Betriebsstunden Ablendlicht L</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_AL_RECHTS_WERT"> Betriebsstunden Ablendlicht R</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BL_L_WERT"> Betriebsstunden Bremslicht L</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BL_R_WERT"> Betriebsstunden Bremslicht R</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_SL_LH_WERT"> Betriebsstunden Standlicht LH</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_SL_RH_WERT"> Betriebsstunden Standlicht RH</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BLK_L_WERT"> Betriebsstunden Blinker L</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BLK_R_WERT"> Betriebsstunden Blinker R</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_NSL_WERT"> Betriebsstunden Nebelschlussleuchte</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_NSW_RELAIS_WERT"> Betriebsstunden Nebelscheinwerfer</string>
+      <string name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#ANZAHL_BETAETIGUNGEN_BLS_WERT"> Anz. Betätigungen Bremslicht</string>
+    </strings>
+    <jobs sgbd="lsz_2">
+      <job name="STATUS_LESEN">
+        <display name="!JOB#STATUS_LESEN#STAT_U_BATT_WERT" result="STAT_U_BATT_WERT" format="L" log_tag="STAT_U_BATT_WERT" />
+        <display name="!JOB#STATUS_LESEN#STAT_SCHALTER_FL_LH_WERT" result="STAT_SCHALTER_FL_LH_WERT" format="L" log_tag="STAT_SCHALTER_FL_LH_WERT" />
+        <display name="!JOB#STATUS_LESEN#STAT_SCHALTER_BLK_WERT" result="STAT_SCHALTER_BLK_WERT" format="L" log_tag="STAT_SCHALTER_BLK_WERT" />
+        <display name="!JOB#STATUS_LESEN#STAT_SPANNUNG_BELADUNGSSENSOR_VORN_WERT" result="STAT_SPANNUNG_BELADUNGSSENSOR_VORN_WERT" format="L" log_tag="STAT_SPANNUNG_BELADUNGSSENSOR_VORN_WERT" />
+        <display name="!JOB#STATUS_LESEN#STAT_SPANNUNG_BELADUNGSSENSOR_HINTEN_WERT" result="STAT_SPANNUNG_BELADUNGSSENSOR_HINTEN_WERT" format="L" log_tag="STAT_SPANNUNG_BELADUNGSSENSOR_HINTEN_WERT" />
+        <display name="!JOB#STATUS_LESEN#STAT_E-Spannung_DIMMER_WERT" result="STAT_E-Spannung_DIMMER_WERT" format="L" log_tag="STAT_E-Spannung_DIMMER_WERT" />
+        <display name="!JOB#STATUS_LESEN#STAT_E-Spannung_LWR_POTI_WERT" result="STAT_E-Spannung_LWR_POTI_WERT" format="L" log_tag="STAT_E-Spannung_LWR_POTI_WERT" />
+        <display name="!JOB#STATUS_LESEN#STAT_E-Spannung_FOTOZELLE_WERT" result="STAT_E-Spannung_FOTOZELLE_WERT" format="L" log_tag="STAT_E-Spannung_FOTOZELLE_WERT" />
+		<display name="!JOB#STATUS_LESEN#STAT_AL_LINKS_DEFEKT" result="STAT_AL_LINKS_DEFEKT" format="L" log_tag="STAT_AL_LINKS_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_AL_RECHTS_DEFEKT" result="STAT_AL_RECHTS_DEFEKT" format="L" log_tag="STAT_AL_RECHTS_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_BL_LINKS_DEFEKT" result="STAT_BL_LINKS_DEFEKT" format="L" log_tag="STAT_BL_LINKS_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_BL_RECHTS_DEFEKT" result="STAT_BL_RECHTS_DEFEKT" format="L" log_tag="STAT_BL_RECHTS_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_BLK_LINKS_HINTEN_DEFEKT" result="STAT_BLK_LINKS_HINTEN_DEFEKT" format="L" log_tag="STAT_BLK_LINKS_HINTEN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_BLK_LINKS_VORN_DEFEKT" result="STAT_BLK_LINKS_VORN_DEFEKT" format="L" log_tag="STAT_BLK_LINKS_VORN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_BLK_RECHTS_HINTEN_DEFEKT" result="STAT_BLK_RECHTS_HINTEN_DEFEKT" format="L" log_tag="STAT_BLK_RECHTS_HINTEN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_BLK_RECHTS_VORN_DEFEKT" result="STAT_BLK_RECHTS_VORN_DEFEKT" format="L" log_tag="STAT_BLK_RECHTS_VORN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_BLK_ZUSATZ_LINKS_DEFEKT" result="STAT_BLK_ZUSATZ_LINKS_DEFEKT" format="L" log_tag="STAT_BLK_ZUSATZ_LINKS_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_BLK_ZUSATZ_RECHTS_DEFEKT" result="STAT_BLK_ZUSATZ_RECHTS_DEFEKT" format="L" log_tag="STAT_BLK_ZUSATZ_RECHTS_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_FL_LINKS_DEFEKT" result="STAT_FL_LINKS_DEFEKT" format="L" log_tag="STAT_FL_LINKS_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_FL_RECHTS_DEFEKT" result="STAT_FL_RECHTS_DEFEKT" format="L" log_tag="STAT_FL_RECHTS_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_KZL_DEFEKT" result="STAT_KZL_DEFEKT" format="L" log_tag="STAT_KZL_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_NSL_DEFEKT" result="STAT_NSL_DEFEKT" format="L" log_tag="STAT_NSL_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_SL_LINKS_HINTEN_DEFEKT" result="STAT_SL_LINKS_HINTEN_DEFEKT" format="L" log_tag="STAT_SL_LINKS_HINTEN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_SL_RECHTS_HINTEN_DEFEKT" result="STAT_SL_RECHTS_HINTEN_DEFEKT" format="L" log_tag="STAT_SL_RECHTS_HINTEN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_SL2_LINKS_HINTEN_DEFEKT" result="STAT_SL2_LINKS_HINTEN_DEFEKT" format="L" log_tag="STAT_SL2_LINKS_HINTEN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_SL2_RECHTS_HINTEN_DEFEKT" result="STAT_SL2_RECHTS_HINTEN_DEFEKT" format="L" log_tag="STAT_SL2_RECHTS_HINTEN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_SL3_LINKS_HINTEN_DEFEKT" result="STAT_SL3_LINKS_HINTEN_DEFEKT" format="L" log_tag="STAT_SL3_LINKS_HINTEN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_SL3_RECHTS_HINTEN_DEFEKT" result="STAT_SL3_RECHTS_HINTEN_DEFEKT" format="L" log_tag="STAT_SL3_RECHTS_HINTEN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_SL_LINKS_VORN_DEFEKT" result="STAT_SL_LINKS_VORN_DEFEKT" format="L" log_tag="STAT_SL_LINKS_VORN_DEFEKT" />
+		<display name="!JOB#STATUS_LESEN#STAT_SL_RECHTS_VORN_DEFEKT" result="STAT_SL_RECHTS_VORN_DEFEKT" format="L" log_tag="STAT_SL_RECHTS_VORN_DEFEKT" />
+      </job>
+      <job name="SIA_LESEN">
+        <display name="!JOB#SIA_LESEN#GESAMTWEGSTRECKE_WERT" result="GESAMTWEGSTRECKE_WERT" format="L" log_tag="GESAMTWEGSTRECKE_WERT" />
+        <display name="!JOB#SIA_LESEN#SI_WEGZAEHLER_WERT" result="SI_WEGZAEHLER_WERT" format="L" log_tag="SI_WEGZAEHLER_WERT" />
+        <display name="!JOB#SIA_LESEN#SI_LITERZAEHLER_WERT" result="SI_LITERZAEHLER_WERT" format="L" log_tag="SI_LITERZAEHLER_WERT" />
+        <display name="!JOB#SIA_LESEN#SI_WEGSTRECKE_LETZTER_OELSERVICE_WERT" result="SI_WEGSTRECKE_LETZTER_OELSERVICE_WERT" format="L" log_tag="SI_WEGSTRECKE_LETZTER_OELSERVICE_WERT" />
+        <display name="!JOB#SIA_LESEN#SI_ZEITINSPEKTIONSZAEHLER_WERT" result="SI_ZEITINSPEKTIONSZAEHLER_WERT" format="L" log_tag="SI_ZEITINSPEKTIONSZAEHLER_WERT" />
+      </job>
+      <job name="BETRIEBSSTUNDENZAEHLER_LESEN">
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_LSZ_WERT" result="BETRIEBSZEIT_LSZ_WERT" format="L" log_tag="BETRIEBSZEIT_LSZ_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_AL_LINKS_WERT" result="BETRIEBSZEIT_AL_LINKS_WERT" format="L" log_tag="BETRIEBSZEIT_AL_LINKS_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_AL_RECHTS_WERT" result="BETRIEBSZEIT_AL_RECHTS_WERT" format="L" log_tag="BETRIEBSZEIT_AL_RECHTS_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BL_L_WERT" result="BETRIEBSZEIT_BL_L_WERT" format="L" log_tag="BETRIEBSZEIT_BL_L_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BL_R_WERT" result="BETRIEBSZEIT_BL_R_WERT" format="L" log_tag="BETRIEBSZEIT_BL_R_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_SL_LH_WERT" result="BETRIEBSZEIT_SL_LH_WERT" format="L" log_tag="BETRIEBSZEIT_SL_LH_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_SL_RH_WERT" result="BETRIEBSZEIT_SL_RH_WERT" format="L" log_tag="BETRIEBSZEIT_SL_RH_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BLK_L_WERT" result="BETRIEBSZEIT_BLK_L_WERT" format="L" log_tag="BETRIEBSZEIT_BLK_L_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_BLK_R_WERT" result="BETRIEBSZEIT_BLK_R_WERT" format="L" log_tag="BETRIEBSZEIT_BLK_R_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_NSL_WERT" result="BETRIEBSZEIT_NSL_WERT" format="L" log_tag="BETRIEBSZEIT_NSL_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#BETRIEBSZEIT_NSW_RELAIS_WERT" result="BETRIEBSZEIT_NSW_RELAIS_WERT" format="L" log_tag="BETRIEBSZEIT_NSW_RELAIS_WERT" />
+        <display name="!JOB#BETRIEBSSTUNDENZAEHLER_LESEN#ANZAHL_BETAETIGUNGEN_BLS_WERT" result="ANZAHL_BETAETIGUNGEN_BLS_WERT" format="L" log_tag="ANZAHL_BETAETIGUNGEN_BLS_WERT" />
+      </job>
+    </jobs>
+  </page>
+</fragment>

+ 16 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/LWS5_1B.ccpage

@@ -0,0 +1,16 @@
+<?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="LWS5" display-mode="list" fontsize="medium" gauges-portrait="2" gauges-landscape="4" logfile="LWS5_1B.log">
+    <strings>
+      <string name="LWS5">LWS5</string>
+      <string name="!JOB#STATUS_SG_ONLINE#STAT_INLRW_G_WERT">Lenkwinkel</string>
+      <string name="!JOB#STATUS_SG_ONLINE#STAT_INLRWPKT_G_WERT">Lenkwinkelgeschwindigkeit</string>
+    </strings>
+    <jobs sgbd="lws5_1b">
+      <job name="STATUS_SG_ONLINE">
+        <display name="!JOB#STATUS_SG_ONLINE#STAT_INLRW_G_WERT" result="STAT_INLRW_G_WERT" format=".2R" log_tag="STAT_INLRW_G_WERT" />
+        <display name="!JOB#STATUS_SG_ONLINE#STAT_INLRWPKT_G_WERT" result="STAT_INLRWPKT_G_WERT" format=".2R" log_tag="STAT_INLRWPKT_G_WERT" />
+      </job>
+    </jobs>
+  </page>
+</fragment>

+ 35 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/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 AutoLLA/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>

+ 39 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/PDCACT.ccpage

@@ -0,0 +1,39 @@
+<?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="PDC" fontsize="medium" logfile="PDCACT.log">
+    <strings>
+      <string name="PDC">PDC</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HL_WERT">  back left [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HML_WERT">  back left middle [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HMR_WERT">  back right middle [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HR_WERT">  back right [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VL_WERT">  front left [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VML_WERT">  front left middle [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VMR_WERT">  front right middle [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VR_WERT">  front right [cm]</string>
+    </strings>
+	<strings lang="de">
+      <string name="PDC">PDC</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HL_WERT">  Hinten Links [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HML_WERT">  Hinten Links Mitte [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HMR_WERT">  Hinten Rechts Mitte [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HR_WERT">  Hinten Rechts [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VL_WERT">  Vorn Links [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VML_WERT">  Vorn Links Mitte [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VMR_WERT">  Vorn Rechts Mitte [cm]</string>
+      <string name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VR_WERT">  Vorn Rechts [cm]</string>
+    </strings>
+    <jobs sgbd="pdcact">
+      <job name="STATUS_MESSWERTE_LESEN">
+        <display name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VL_WERT" result="STAT_WEG_VL_WERT" format="3.0R" log_tag="STAT_WEG_VL_WERT" />
+		<display name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VML_WERT" result="STAT_WEG_VML_WERT" format="3.0R" log_tag="STAT_WEG_VML_WERT" />
+        <display name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VMR_WERT" result="STAT_WEG_VMR_WERT" format="3.0R" log_tag="STAT_WEG_VMR_WERT" />
+		<display name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_VR_WERT" result="STAT_WEG_VR_WERT" format="3.0R" log_tag="STAT_WEG_VR_WERT" />
+	    <display name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HL_WERT" result="STAT_WEG_HL_WERT" format="3.0R" log_tag="STAT_WEG_HL_WERT" />
+		<display name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HML_WERT" result="STAT_WEG_HML_WERT" format="3.0R" log_tag="STAT_WEG_HML_WERT" />
+        <display name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HMR_WERT" result="STAT_WEG_HMR_WERT" format="3.0R" log_tag="STAT_WEG_HMR_WERT" />
+		<display name="!JOB#STATUS_MESSWERTE_LESEN#STAT_WEG_HR_WERT" result="STAT_WEG_HR_WERT" format="3.0R" log_tag="STAT_WEG_HR_WERT" />
+      </job>
+    </jobs>
+  </page>
+</fragment>

+ 22 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/Pages.ccpages

@@ -0,0 +1,22 @@
+<?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">
+  <pages>
+    <include filename="Home.ccpage" />
+    <include filename="IBUS_App.ccpage" />
+    <include filename="D50M57E1.ccpage" />
+    <include filename="Laufunruhe.ccpage" />
+    <include filename="DDE_fuel_air.ccpage" />
+    <include filename="DDEGenerator.ccpage" />
+    <include filename="RPA_DSC_MK60.ccpage" />
+    <include filename="DSC_MK60.ccpage" />
+    <include filename="LWS5_1B.ccpage" />
+    <include filename="KOMBI46R.ccpage" />
+    <include filename="KOMBI46R_SIA.ccpage" />
+    <include filename="LSZ_2.ccpage" />
+    <include filename="PDCACT.ccpage" />
+    <include filename="IHKA46_3.ccpage" />
+    <include filename="DDEAbgleich_D50M57E1_noProg.ccpage" />
+    <include filename="DDEAbgleich_D50M57E1.ccpage" />
+    <include filename="Errors.ccpage" />
+  </pages>
+</fragment>

+ 147 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/README.txt

@@ -0,0 +1,147 @@
+DeepOBD Konfiguration für M57TÜ mit automatischer Leerlaufanpassung
+
+Ziel: Verbesserung des Motorlaufs in der Warmlaufphase, insbesondere mit aktivem el. Zuheizer
+
+## Funktionsweise
+
+Der M57TÜ mit DDE5 hat - wie schon der Vorgänger M57 mit DDE4 im E46 - einen elektrischen Zuheizer, um 
+das Kühlmittel schneller auf Temperatur zu bringen bzw. wesentlich früher die Beheizung des Innenraums zu ermöglichen. 
+
+Der Zuheizer wird vom DDE Motorsteuergerät angesteuert, wenn eine Heizleistungsanforderung vorliegt. 
+Die Heizleistungsanforderung erhält die DDE von der IHKA (Klimaautomatik) bzw. Heiz/Klima-Bedienteil, abhängig von 
+Parametern die hier nicht relevant sind (Zieltemperatur, Außentemperatur, Gebläsestufe). Ist z.B. das Gebläse auf Stufe 0 gestellt 
+erfolgt diese Anforderung NICHT. 
+
+Da der elektrische Zuheizer ein sehr starker Verbraucher ist wird dieser entsprechend der elektrischen Leistungsreserven gesteuert. 
+Die DDE erhält von der Lichtmaschine über eine bitserielle Schnittstelle die aktuelle Generatorlast (in %) und regelt danach die 
+Leistung des Zuheizers über PWM (5 - 95 % Pulsweite). 
+
+Der Zuheizer wird abgeschaltet bei: 
+- Anfahren
+- Bordspannung < 12.0V (Wiedereinschaltung > 12.8V)
+- Drehzahl < 780 u/min (Wiedereinschaltung > 790 u/min)
+- bis 10s nach dem Motorstart
+- Überschreitung bestimmter Kühlmitteltemperatur in Abhängigkeit von der Ansauglufttemperatur (Kennfeld):
+  86 °C (< -5°C Ansaugluft)
+  50 °C (< 10°C Ansaugluft)
+  17 °C (< 20°C Ansaugluft)
+
+Außerdem kein Zuheizbetrieb bei folgenden Fehlerspeichereinträgen:
+- Kühlmitteltemperaturfühler
+- Ansauglufttemperaturfühler
+- Generatorlastsignal (= Lastsignal <=5% oder >= 100%)
+
+Um die Leistung der Lichtmaschine zu erhöhen und den Motorlauf zu verbessern wird während des Zuheizbetriebs die Leerlaufdrehzahl angehoben:
+	M57 - DDE4: auf 850 u/min (meiner Erfahrung mit diesem Modell eher auf 900 laut Drehzahlmesser)
+	M57TÜ - DDE5: um 50 u/min (auf 800 u/min - keine merkliche Anhebung)
+
+
+## Problem
+
+- erhebliche Leerlaufschwankungen im Warmlauf (nur bei niedrigen Außentemperaturen)
+- Motor geht beim Auskuppeln während des Warmlaufs fast aus (Drehzahl sinkt schnell und stark ab)
+
+
+## Lösungsversuche
+
+### Fehlersuche
+
+- Fehler tritt nicht auf, wenn das Heizungsgebläse auf Stufe 0 gestellt oder die Ansteuerleitung am Zuheizer abgesteckt wird 
+  --> Verhalten wird klar durch den Zuheizer verursacht
+
+- Beobachtung der Live-Daten für Spannung, Generatorlast, Ansteuerung Zuheizer: 
+ 1. Zuheizer wird auf Volllast angesteuert
+ 2. Drehzahl sinkt aufgrund der Belastung, Bordspannung sinkt auf < 13V, Generatorlastsignal erreicht > 90%
+ 3. DDE regelt Zuheizer zurück
+ 4. Drehzahl u Bordspannung steigen an, Generatorlast sinkt -> der Kreislauf beginnt erneut
+
+--> Ursache scheint die beim M57TÜ sehr niedrig gewählte Anhebung der Leerlaufdrehzahl, beim vorigen Auto 330d M57 aus 2001 (DDE4) hatte ich dieses Problem nie
+
+- 
+- Lichtmaschine in Ordnung, kein Fehler ersichtlich
+- Zuheizer soweit messbar in Ordnung (Messung mit Zangenamperemeter ergibt >120A bei manueller Ansteuerung über Diagnose)
+- Motorlauf nach Warmlauf sehr gut, keine Drehzahlschwankungen, keine Leistungslöcher, Rundlaufkorrekturwerte der einzelnen Injektoren in Ordnung (innerhalb +/- 1)
+
+
+### Lösungsversuch durch permanente Anhebung der Leerlaufdrehzahl
+
+- Abgleich Leerlaufdrehzahl - permanente Anhebung um 50 u/min: 
+  - Motor geht beim Auskuppeln nicht mehr fast aus
+  - Drehzahlschwankungen kaum besser
+  
+- Abgleich Leerlaufdrehzahl - permanente Anhebung um 70 u/min: 
+  - Motor geht beim Auskuppeln nicht mehr fast aus
+  - Drehzahlschwankungen etwas besser aber weiterhin vorhanden
+
+- Abgleich Leerlaufdrehzahl - permanente Anhebung um 100 u/min: 
+  - Motor geht beim Auskuppeln nicht mehr fast aus
+  - Drehzahlschwankungen besser, aber weiterhin vorhanden
+  - Leerlaufdrehzahl im Normalbetrieb hoch
+  
+- Abgleich Leerlaufdrehzahl - permanente Anhebung um 150 u/min: 
+  - Motor geht beim Auskuppeln nicht mehr fast aus
+  - Drehzahlschwankungen sehr viel besser
+  - Leerlaufdrehzahl im Normalbetrieb ZU hoch
+  
+--> permanente Anhebung um 50-70 upm ist OK, besser wäre NUR IM WARMLAUFBETRIEB Anhebung auf 900 upm und im Normalbetrieb um 50 upm (etwas besserer Leerlauf)
+
+
+### Lösungsversuch durch variable Anhebung der Leerlaufdrehzahl mittels DeepOBD
+
+Voraussetzung/Annahme: DeepOBD läuft sowieso ab Zündung AN im Hintergrund am Android Head Unit (Broadcast -> IBUS-App)
+
+DeepOBD-Seite mit Code für folgende Funktionen:
+ - Auslesen aller Live-Werte, die für IBUS-App benötigt werden
+ - für variable Leerlaufanhebung benötigt: 
+   - Ansteuerungssignal Zuheizer
+   - ##Generatorlastsignal
+   - Kühlmitteltemperatur
+   - ##Ansauglufttemperatur
+   
+   Funktion: 
+   - wenn Ansteuerung Zuheizer > 20 %: 
+     --> Anhebung Leerlaufdrehzahl um 150 (ABGLEICH_VERSTELLEN aber NICHT ABGLEICH_PROG)
+   - Ansteuerung Zuheizer < 20 % für 10 Durchläufe: 
+     --> Anhebung Leerlaufdrehzahl um 50 (ABGLEICH_VERSTELLEN aber NICHT ABGLEICH_PROG)
+   - Kühlmitteltemperatur > 86
+     Anhebung Leerlaufdrehzahl auf 0 (ABGLEICH_VERSTELLEN aber NICHT ABGLEICH_PROG)
+	 
+	 
+	 
+	 
+	 
+
+
+SBGD=D50M57E1
+JOB=STATUS_MESSWERTBLOCK_LESEN
+args="JA;....
+
+häufig zu aktualisierende Werte:
+ILMMG	STAT_LUFTMASSE_PRO_HUB_WERT			mg/Hub
+IPLAD	STAT_LADEDRUCK_WERT					hPa
+IPUMG	STAT_UMGEBUNGSDRUCK_WERT			hPa
+IUBAT	STAT_UBATT_WERT						V
+IMOAK	STAT_MOTORMOMENT_AKTUELL_WERT		Nm
+INMOT	STAT_MOTORDREHZAHL_WERT				rpm
+SPLAD	STAT_LADEDRUCK_SOLL_WERT			hPa
+IPRDR	STAT_RAILDRUCK_WERT					bar
+IAFZG	STAT_FAHRZEUGBESCHLEUNIGUNG_WERT	m/s^2
+IVKMH	STAT_GESCHWINDIGKEIT_WERT			km/h
+ITZUH	STAT_ZUHEIZER_ANSTEUERUNG_WERT		%
+IGENL	STAT_GENERATORLAST_WERT				%
+
+RSKUP	STAT_KUPPLUNGSSCHALTER_ROH_WERT		bool
+IKLIS	STAT_KLIMAKOMPRESSOR_STATUS_WERT	bool
+IBKLI	STAT_BEREITSCHAFT_KLIMA_WERT		bool
+ISKLI	STAT_KLIMA_EIN_WERT					bool
+
+seltener aktualisierte Werte:
+ITKUM	STAT_KUEHLMITTELTEMPERATUR_WERT		deg C
+ITKRS	STAT_KRAFTSTOFFTEMPERATURK_WERT		deg C
+ITLAL	STAT_LADELUFTTEMPERATUR_WERT		deg C
+
+gar nicht auf Seite 1 benötigte Werte:
+SPRDR	STAT_RAILDRUCK_SOLL_WERT			bar
+IMEIA	STAT_EINSPRITZMENGE_AKTUELL_WERT	mg/cyc
+ITAVO	STAT_ABGASTEMPERATUR_VOR_KATALYSATOR_WERT	deg C
+

+ 129 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/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
Fahrzeugkonfigurationen/E46 M57N AutoLLA/Translation.xml.zip


+ 6 - 6
Fahrzeugkonfigurationen/E46 M57N/DDEAbgleich_D50M57E1.ccpage

@@ -58,7 +58,7 @@
 			
 			// Button AGR Serie
             buttonAGRserie = new Button(activity);
-            buttonAGRserie.Text = "AGR Serie";
+            buttonAGRserie.Text = "AGR \nSerie";
             buttonAGRserie.Click += delegate
             {
                 // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
@@ -74,7 +74,7 @@
 			
 			// Button AGR Reduziert
             buttonAGRred = new Button(activity);
-            buttonAGRred.Text = "AGR min.";
+            buttonAGRred.Text = "AGR \nmin.";
             buttonAGRred.Click += delegate
             {
                 // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
@@ -90,7 +90,7 @@
 			
 			// Button Leerlauf Serie
             buttonLLA0 = new Button(activity);
-            buttonLLA0.Text = "LL +0";
+            buttonLLA0.Text = "LL \n+0";
             buttonLLA0.Click += delegate
             {
                 // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
@@ -106,7 +106,7 @@
 			
 			// Button Leerlauf +50
             buttonLLA50 = new Button(activity);
-            buttonLLA50.Text = "LL +50";
+            buttonLLA50.Text = "LL \n+50";
             buttonLLA50.Click += delegate
             {
                 // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
@@ -122,7 +122,7 @@
 			
 			// Button Leerlauf +70
             buttonLLA70 = new Button(activity);
-            buttonLLA70.Text = "LL +70";
+            buttonLLA70.Text = "LL \n+70";
             buttonLLA70.Click += delegate
             {
                 // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet
@@ -138,7 +138,7 @@
 			
 			// Button Leerlauf +100
             buttonLLA100 = new Button(activity);
-            buttonLLA100.Text = "LL +100";
+            buttonLLA100.Text = "LL \n+100";
             buttonLLA100.Click += delegate
             {
                 // button setzt klassenweite variable auf true, diese wird beim durchlauf von ExecuteJob ausgewertet

+ 7 - 4
Fahrzeugkonfigurationen/E46 M57N/DDEGenerator.ccpage

@@ -1,11 +1,12 @@
 <?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="5" logfile="DME_DDE.log">
+  <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>
 
@@ -15,16 +16,18 @@
       <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">
+      <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_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_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">