<?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>