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