Browse Source

- Home.ccpage: AutoLLA - corrections
- DDE_Power.ccpage added, experimental

FloKra 3 years ago
parent
commit
6c43a45cbc

+ 123 - 0
Fahrzeugkonfigurationen/E46 M57N AutoLLA/DDE_Power.ccpage

@@ -0,0 +1,123 @@
+<?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="medium" gauges-portrait="2" gauges-landscape="4" logfile="DME_DDE.log">
+    <strings lang="de">
+      <string name="IBUS_App">LEISTUNG</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_MOTORMOMENT_WUNSCH_WERT"> Leistung [PS]</string>
+	  <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LUFTMASSE_PRO_HUB_WERT"> Leistung [kW]</string>
+    </strings>
+    <strings>
+      <string name="IBUS_App">POWER</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_MOTORMOMENT_WUNSCH_WERT"> power [HP]</string>
+	  <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LUFTMASSE_PRO_HUB_WERT"> power [kW]</string>
+    </strings>
+	
+    <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT" result="STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT" 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="STATUS_MESSWERTBLOCK_LESEN#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_MOTORMOMENT_WUNSCH_WERT" result="STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_WUNSCH_WERT" grid-type="simple-gauge-round" min-value="0" max-value="600" log_tag="STAT_POWER_HP" />
+	<display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_LUFTMASSE_PRO_HUB_WERT" result="STATUS_MESSWERTBLOCK_LESEN#STAT_LUFTMASSE_PRO_HUB_WERT" grid-type="simple-gauge-round" min-value="0" max-value="1500" log_tag="STAT_POWER_KW" />
+	<jobs />
+    <code show_warnings="true">
+    <![CDATA[
+    class PageClass
+    {	
+		private int mom_torque = 0;
+		private int mom_N = 0;
+			
+		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;IMOAK;INMOT;IMWVO;ILMMG";
+            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], "STATUS_MESSWERTBLOCK_LESEN#");
+            }
+			
+			
+			
+			// extract values and save to global variables
+			
+			EdiabasNet.ResultData resultData;
+            if (resultSets[1].TryGetValue("STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORDREHZAHL_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        mom_N = (int)((Double)resultData.OpData);
+                    }
+                }
+			
+            if (resultSets[1].TryGetValue("STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        mom_torque = (int)((Double)resultData.OpData);
+                    }
+                }
+				
+        }
+		
+		
+        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;
+		
+			// List of possible colors: https://docs.microsoft.com/en-us/dotnet/api/android.graphics.color?view=xamarin-android-sdk-9
+			
+            switch (resultName)
+            {
+                case "STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_WUNSCH_WERT":
+                    // value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+					
+					// this is the reading we overwrite with calculated horsepower
+					
+					value = mom_torque * mom_N / 7127;
+                    
+                    // result format: {0,[DIGITS TOTAL INCL COMMA],[0|0.0|0.00|0.000...]}
+                    result = string.Format(ActivityMain.Culture, "{0,1: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_LUFTMASSE_PRO_HUB_WERT":
+                    // value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+					
+					// and this one we will overwrite with power in kW
+					
+					value = mom_torque * mom_N / 7127 / 1.36;
+                    
+                    // result format: {0,[DIGITS TOTAL INCL COMMA],[0|0.0|0.00|0.000...]}
+					result = string.Format(ActivityMain.Culture, "{0,1: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;
+            }
+            return result;
+        }
+    }
+      ]]>
+    </code>
+	
+  </page>
+</fragment>

+ 244 - 89
Fahrzeugkonfigurationen/E46 M57N AutoLLA/Home.ccpage

@@ -1,25 +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="HOME" display-mode="grid" fontsize="medium" gauges-portrait="3" gauges-landscape="5" logfile="DME_DDE.log">
+  <page name="IBUS_App" 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="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_LADEDRUCK_WERT"> Ladedruck Ist [mbar]</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_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_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_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_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_MESSWERTBLOCK_LESEN#STAT_UMGEBUNGSDRUCK_WERT"> Luftdruck [mbar]</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#ABGLEICH_LESEN#STAT_LLA_ABGLEICH_LESEN_WERT"> Anhebung Leerlaufdrehzahl [u/min]</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>
@@ -29,56 +34,69 @@
       <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="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_LADEDRUCK_WERT"> act. boost pressure [mbar]</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_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_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"> Einspritzmenge [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_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_RAILDRUCK_SOLL_WERT"> Raildruck Soll [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_MESSWERTBLOCK_LESEN#STAT_UMGEBUNGSDRUCK_WERT"> air pressure [mbar]</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#ABGLEICH_LESEN#STAT_LLA_ABGLEICH_LESEN_WERT"> increase idle speed [rpm]</string>
+	  
+	  <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUPPLUNGSSCHALTER_ROH_WERT">  Clutch switch</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KLIMAKOMPRESSOR_STATUS_WERT">  AC compressor</string>
+      <string name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_BEREITSCHAFT_KLIMA_WERT">  AC in standby</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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#STAT_MOTORMOMENT_AKTUELL_WERT" 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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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_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_LADEDRUCK_SOLL_WERT" result="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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_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_MESSWERTBLOCK_LESEN#STAT_UMGEBUNGSDRUCK_WERT" result="STATUS_MESSWERTBLOCK_LESEN#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_GENERATORLAST_WERT" result="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#STAT_ZUHEIZER_ANSTEUERUNG_WERT" grid-type="simple-gauge-round" min-value="0" max-value="100" log_tag="STAT_ZUHEIZER_ANSTEUERUNG_WERT" />
+	<display name="!JOB#ABGLEICH_LESEN#STAT_LLA_ABGLEICH_LESEN_WERT" result="ABGLEICH_LESEN#STAT_LLA_ABGLEICH_LESEN_WERT" format="L" display-order="0" grid-type="simple-gauge-round" min-value="0" max-value="250" log_tag="LLA_ABGLEICH_LESEN_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" />
+    <display name="!JOB#STATUS_MESSWERTBLOCK_LESEN#STAT_KUPPLUNGSSCHALTER_ROH_WERT" result="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#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="STATUS_MESSWERTBLOCK_LESEN#STAT_BEREITSCHAFT_KLIMA_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1" log_tag="STAT_BEREITSCHAFT_KLIMA_WERT" />
 	
-	<jobs sgbd="D50M57E1" />
+    <display name="!JOB#STATUS_TOENS_IO#STAT_TOG_HIGH_WERT" result="STATUS_TOENS_IO#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="STATUS_TOENS_IO#STAT_TOG_LOW_WERT" format="L" grid-type="simple-gauge-round" min-value="0" max-value="1000" log_tag="STAT_TOG_LOW_WERT" />
+	
+	<jobs />
     <code show_warnings="true">
     <![CDATA[
     class PageClass
@@ -109,79 +127,109 @@
 		private int conf_LLA_KlimaBereitschaft = 90;
 		private int conf_LLA_Klimakompressor = 120;
 		private int conf_LLA_GeneratorlastHoch = 90;
-		private int conf_LLA_GeneratorlastSehrHoch = 120;
+		private int conf_LLA_GeneratorlastSehrHoch = 150;
 		
 		// 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;
+		// Noch genauer zu ermitteln wie viele Abfragen pro Sekunde bei der DDE5 mit dieser
+		// Konfiguration im Durchschnitt anfallen. 
+		// alle 5 Durchläufe ergibt ca. 1 Sekunde Verzögerung
+		private int conf_countdown_ZuheizerAn_max = 10;
+		private int conf_countdown_Kupplung_max = 10;
+		private int conf_countdown_Generatorlast_max = 10;
 		private int conf_countdown_LLA_aus = 15;
-		private int conf_countdown_Job2_max = 10;
+		
+		// wie häufig sollen zusätzliche Jobs ausgeführt werden?
+		private int conf_counter_Job2_max = 20;        // Job2 = am selben Steuergerät wie der Hauptjob
+		private int conf_counter_JobSgbd2_max = 98;    // JobSgbd2 = auf einem anderen Steuergerät
+
+		// Steuergeräte SGBD files für Multijob definieren
+		public static string[] conf_sgbds = {"D50M57E1", "kombi46r"};
+		
 		
 		// Statusvariablen
 		private bool status_MotorHeiss = false;
+		private bool status_MotorBetriebstemp = 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;
+		private int currSgbd = 0; // momentan aktiv abgefragtes Steuergerät, für switch zwischen mehreren 
 		
 		// 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;
+		private int counter_Job2 = 0;
+		private int counter_JobSgbd2 = 0;
 		
 		// Globale Variablen für Leerlaufanhebung
 		private int LLA_momentan = 0;
 		
-						
+		// Globale Variablen - sonstige
+		private int mom_N = 0;
+		//private int mom_Nm = 0;
+		
+		// result objekte für die zusätzlichen Jobs, die nicht in jedem Durchlauf abgefragt werden
+        // muss global deklariert sein damit trotzdem in jedem Durchlauf die letzten Werte ausgegeben werden können
 		List<Dictionary<string, EdiabasNet.ResultData>> resultSets_Abgleich;
+		List<Dictionary<string, EdiabasNet.ResultData>> resultSets_JobSgbd2;
 			
 		public void ExecuteJob(EdiabasNet ediabas, ref MultiMap<string, EdiabasNet.ResultData> resultDict, bool firstCall)
         {
             List<Dictionary<string, EdiabasNet.ResultData>> resultSets;
+			
+			if(firstCall || currSgbd != 0) {
+				currSgbd = 0;
+				ediabas.ResolveSgbdFile(conf_sgbds[0]);
+				//ediabas.ArgString = string.Empty;
+				//ediabas.ArgBinaryStd = null;
+				//ediabas.ResultsRequests = string.Empty;
+				//ediabas.ExecuteJob("INITIALISIERUNG");
+			}
             
             
 			// 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.ArgString = "JA;ILMMG;IPLAD;IPUMG;IUBAT;IMOAK;INMOT;SPLAD;ITKUM;ITLAL;ITKRS;IPRDR;IAFZG;IVKMH;ITZUH;IGENL;RSKUP;IKLIS;IBKLI;SPRDR;IMEIA;ITAVO";
             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]);
+                EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets[1], "STATUS_MESSWERTBLOCK_LESEN#");
             }
 			
 			
 						
-			// Job 2 - wird nur bei jedem X-ten Durchlauf ausgeführt (definiert von [conf_countdown_Job2_max])
-			if(countdown_Job2 == 0) {
+			// Job 2 - wird nur bei jedem X-ten Durchlauf ausgeführt (definiert von [conf_counter_Job2_max])
+			// Ergebnisse werden in globaler Variable vorgehalten und die letzten Werte in jedem Durchlauf ausgegeben
+			if(counter_Job2 == 0) {
 				ediabas.ArgString = "lla";
 				ediabas.ArgBinaryStd = null;
 				ediabas.ResultsRequests = string.Empty;
 				ediabas.ExecuteJob("ABGLEICH_LESEN");
 				resultSets_Abgleich = ediabas.ResultSets;
+				counter_Job2++;
 			}
-			else if(countdown_Job2 >= conf_countdown_Job2_max) {
-				countdown_Job2 = 0;
+			else if(counter_Job2 >= conf_counter_Job2_max) {
+				counter_Job2 = 0;
 			}
 			else {
-				countdown_Job2++;
+				counter_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_");
+				EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets_Abgleich[1], "ABGLEICH_LESEN#STAT_LLA_");
 			}
 			
 			
 			
-			// Werte für automatische Leerlaufanhebung holen
+			// Eingangswerte für automatische Leerlaufanhebung holen
 			
 			EdiabasNet.ResultData resultData;
 			
@@ -244,7 +292,7 @@
                 }
 			 
 			// Abgleichwert Leerlaufanhebung
-			if (resultSets_Abgleich[1].TryGetValue("LLA_ABGLEICH_LESEN_WERT", out resultData))
+			if (resultSets_Abgleich[1].TryGetValue("ABGLEICH_LESEN_WERT", out resultData))
                 {
                     if (resultData.OpData is Double)
                     {
@@ -253,6 +301,25 @@
 			}
 			
 			
+			// Momentane Drehzahl
+			if (resultSets_Abgleich[1].TryGetValue("STAT_MOTORDREHZAHL_WERT", out resultData))
+                {
+                    if (resultData.OpData is Double)
+                    {
+                        mom_N = (int)((Double)resultData.OpData);
+                    }
+			}
+			
+			// Momentanes Drehmoment
+		 	// if (resultSets_Abgleich[1].TryGetValue("STAT_MOTORMOMENT_AKTUELL_WERT", out resultData))
+            //     {
+            //         if (resultData.OpData is Double)
+            //         {
+            //             mom_Nm = (int)((Double)resultData.OpData);
+            //         }
+			// }
+			
+			
 			// Automatische Leerlaufanhebung
 			
 			int LLA_neu = 0;
@@ -270,7 +337,8 @@
 			if (countdown_Kupplung > 0){
 				countdown_Kupplung--;
 			}
-			else if (countdown_Kupplung == 0){
+			else {
+				countdown_Kupplung = 0;
 				status_Kupplung = false;
 				if(conf_LLA_Basis > LLA_neu) LLA_neu = conf_LLA_Basis;
 			}
@@ -290,7 +358,8 @@
 			if (countdown_ZuheizerAn > 0) {
 				countdown_ZuheizerAn--;
 			}
-			else if (countdown_ZuheizerAn == 0) {
+			else {
+				countdown_ZuheizerAn = 0;
 				status_Zuheizer = false;
 				if(conf_LLA_Basis > LLA_neu) LLA_neu = conf_LLA_Basis;
 			}
@@ -313,7 +382,8 @@
 			if (countdown_Generatorlast > 0) {
 				countdown_Generatorlast--;
 			}
-			else if (countdown_Generatorlast == 0) {
+			else {
+				countdown_Generatorlast = 0;
 				status_GeneratorlastHoch = false;
 				status_GeneratorlastSehrHoch = false;
 				if(conf_LLA_Basis > LLA_neu) LLA_neu = conf_LLA_Basis;
@@ -334,41 +404,47 @@
 			// Drehzahlanhebung je nach Motortemperatur, 
 			if(mom_MotorTemp < conf_Temp_MotorSehrKaltBis) {
 				// Motor ist sehr kalt
+				status_MotorBetriebstemp = false;
 				if(conf_LLA_MotorSehrKalt > LLA_neu) LLA_neu = conf_LLA_MotorSehrKalt;
 			}
 			else if(mom_MotorTemp < conf_Temp_MotorKaltBis) {
 				// Motor ist kalt
+				status_MotorBetriebstemp = false;
 				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
+				status_MotorBetriebstemp = false;
 				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
+				status_MotorBetriebstemp = true;
 				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;
+				status_MotorBetriebstemp = true;
 				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;
+				status_MotorBetriebstemp = false;
 				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) {
+			// Motor auf Betriebstemperatur - reduziere LL auf minimum "conf_LLA_Basis" nach einiger Zeit
+			if(status_MotorBetriebstemp && LLA_neu == conf_LLA_MotorBetriebstemp) {
+				if(countdown_LLA_aus > 0) {
 					countdown_LLA_aus--;
 				}
+				else {
+					LLA_neu = conf_LLA_Basis;
+				}
 			}
 			else {
 				countdown_LLA_aus = conf_countdown_LLA_aus;
@@ -391,9 +467,50 @@
                 
                 // 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;
+				conf_counter_Job2_max = 0;
 			}
 			
+			
+			
+			// Job SGBD 2
+			if(counter_JobSgbd2 == 0) {
+				counter_JobSgbd2++;
+				try {
+					// try/catch, damit nicht der ganze Durchlauf abgebrochen und 
+					// gar keine Daten zurückgeliefert werden, falls das Steuergerät nicht 
+					// antwortet. 
+					
+					currSgbd = 1;
+					ediabas.ResolveSgbdFile(conf_sgbds[currSgbd]);
+					
+					//ediabas.ArgString = string.Empty;
+					//ediabas.ArgBinaryStd = null;
+					//ediabas.ResultsRequests = string.Empty;
+					//ediabas.ExecuteJob("INITIALISIERUNG");
+								
+					ediabas.ArgString = string.Empty;
+					ediabas.ArgBinaryStd = null;
+					ediabas.ResultsRequests = string.Empty;
+					ediabas.ExecuteJob("STATUS_TOENS_IO");
+					resultSets_JobSgbd2 = ediabas.ResultSets;
+				}
+				catch {
+					// dann halt nicht
+				}
+			}
+			else if (counter_JobSgbd2 >= conf_counter_JobSgbd2_max) {
+				counter_JobSgbd2 = 0;
+			}
+			else {
+				counter_JobSgbd2++;
+			}
+			
+			if (resultSets_JobSgbd2 != null && resultSets_JobSgbd2.Count >= 2)
+				{
+					EdiabasThread.MergeResultDictionarys(ref resultDict, resultSets_JobSgbd2[1], "STATUS_TOENS_IO#");
+				}
+			
+			
         }
 		
 		
@@ -403,28 +520,66 @@
             double value;
             bool found;
 		
+			// Liste der möglichen Farbnamen: https://docs.microsoft.com/en-us/dotnet/api/android.graphics.color?view=xamarin-android-sdk-9
+			
             switch (resultName)
             {
-                case "STAT_MOTORDREHZAHL_WERT":
+                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);
+                    result = string.Format(ActivityMain.Culture, "{0,1: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_MOTORMOMENT_AKTUELL_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    
+                    // result format: {0,[DIGITS TOTAL INCL COMMA],[0|0.0|0.00|0.000...]}
+					
+					// DDE5 liefert unplausiblen wert bei nicht laufendem Motor -> überschreibe mit 0
+		       	    // DDE5 reports invalid value with engine off -> overwrite that with 0
+                    if(mom_N < 600) result = "0";
+                    else result = string.Format(ActivityMain.Culture, "{0,1: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_EINSPRITZMENGE_AKTUELL_WERT":
+                    value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
+                    
+                    // result format: {0,[DIGITS TOTAL INCL COMMA],[0|0.0|0.00|0.000...]}
+					
+		       	    // DDE5 liefert unplausiblen wert bei nicht laufendem Motor -> überschreibe mit 0
+		       	    // DDE5 reports invalid value with engine off -> overwrite that with 0
+                    if(mom_N < 600) result = "0";
+                    else result = string.Format(ActivityMain.Culture, "{0,1: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 "STAT_UBATT_WERT":
+                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);
+                    result = string.Format(ActivityMain.Culture, "{0,1:0.0}", value);
                     
                     if (found && value < 10.5) textColor = Android.Graphics.Color.Red;
                     else if (found && value < 11.5) textColor = Android.Graphics.Color.Orange;
@@ -436,11 +591,11 @@
                     
                     break;
 				
-				case "STAT_GENERATORLAST_WERT":
+				case "STATUS_MESSWERTBLOCK_LESEN#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);
+                    result = string.Format(ActivityMain.Culture, "{0,1:0}", value);
                     
                     if (found && value <= 60) textColor = Android.Graphics.Color.White;
                     else if (found && value <= 70) textColor = Android.Graphics.Color.Yellow;
@@ -450,11 +605,11 @@
                     
                     break;
 					
-				case "STAT_ZUHEIZER_ANSTEUERUNG_WERT":
+				case "STATUS_MESSWERTBLOCK_LESEN#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);
+                    result = string.Format(ActivityMain.Culture, "{0,1:0}", value);
                     
                     if (found && value <= 60) textColor = Android.Graphics.Color.White;
                     else if (found && value <= 70) textColor = Android.Graphics.Color.Yellow;
@@ -465,9 +620,9 @@
                     break;
 					
 		
-                case "STAT_KUEHLMITTELTEMPERATUR_WERT":
+                case "STATUS_MESSWERTBLOCK_LESEN#STAT_KUEHLMITTELTEMPERATUR_WERT":
                     value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
-                    result = string.Format(ActivityMain.Culture, "{0,3:0}", value);
+                    result = string.Format(ActivityMain.Culture, "{0,1:0}", value);
                     
                     if (found && value < 75) textColor = Android.Graphics.Color.Blue;
                     else if (found && value <= 105) textColor = Android.Graphics.Color.White;
@@ -478,9 +633,9 @@
                     
                     break;
 					
-				case "STAT_LADELUFTTEMPERATUR_WERT":
+				case "STATUS_MESSWERTBLOCK_LESEN#STAT_LADELUFTTEMPERATUR_WERT":
                     value = ActivityMain.GetResultDouble(resultDict, resultName, 0, out found);
-                    result = string.Format(ActivityMain.Culture, "{0,3:0}", value);
+                    result = string.Format(ActivityMain.Culture, "{0,1:0}", value);
                     
                     if (found && value <= 55) textColor = Android.Graphics.Color.White;
                     else if (found && value <= 65) textColor = Android.Graphics.Color.Yellow;

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

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

@@ -3,6 +3,7 @@
   <pages>
     <include filename="Home.ccpage" />
     <include filename="IBUS_App.ccpage" />
+    <include filename="DDE_Power.ccpage" />
     <include filename="D50M57E1.ccpage" />
     <include filename="Laufunruhe.ccpage" />
     <include filename="DDE_fuel_air.ccpage" />