Dauerhaft Daten senden & LCD Abfrage gleichzeitig

Ich möchte dauerhaft CAN Bus Daten senden und diese ändern aufgrund von verschiedenen “Tastendrücken” auf dem LCD Touchscreen.

Die Schwierigkeit besteht gerade darin, dass die Daten kontinuierlich gesendet werden sollen und nicht abbrechen dürfen. Gleichzeitig muss ja die Abfrage geschehen, wo und ob der Touchscreen gerade betätigt wurde.

Es gibt insgesamt 3 Button die betätigt werden können, welche dann bestimmte Bits in der Nachricht verändert.

Um nicht zu viel Erklären zu müssen hier ein Auszug aus dem Pgr.

void loop(){

while (true)
  {
    if (myTouch.dataAvailable())
    {
      myTouch.read();
      x = myTouch.getX();
      y = myTouch.getY();

      if ((y >= 6) && (y <= 262)) // Upper row
      {
        if ((x >= 6) && (x <= 262)) // Button: Comfort
        {
          Status_Button_1=true; }
          
          while (Status_Button_1==true){
          //tue jenes: 
          Status_Button_2==false;
          Status_Button_3==false;
          myGLCD.setColor(VGA_WHITE);
          myGLCD.print("Comfort", 310, 350);
          charisma_mode = 1;//Änderung des Bytes im Can BUs
          Charisma_01(); //sende die Can-Daten

        }



        if ((y >= 6) && (y <= 262)) // Upper row
        {
          if ((x >= 271) && (x <= 527)) // Button: Normal
          {Status_Button_2==true; }
          
          while(Status_Button_2==true){
            //tue jenes:
            Status_Button_1==false;
            Status_Button_3==false;
            myGLCD.setColor(VGA_WHITE);
            myGLCD.print(" Normal", 310, 350);
            charisma_mode = 2;//Änderung des Bytes im Can BUs
            Charisma_01();
          }



          if ((y >= 6) && (y <= 262)) // Upper row
          {
            if ((x >= 536) && (x <= 792)) // Button: Sport
            {Status_Button_3==true;}
            
            while(Status_Button_3==true){
              //tue jenes:
              Status_Button_1==false;
              Status_Button_2==false;
              myGLCD.setColor(VGA_WHITE);
              myGLCD.print("  Sport", 310, 350);
              charisma_mode = 3; //Änderung des Bytes im Can BUs
              Charisma_01();
            }

Ich hoffe es ist ersichtlich wie ich das Problem angegangen bin. Nur stecke ich jetzt leider in der ersten “Schleife” fest. Was ja auch logisch ist. Wenn ich das ganze aber mit einer “If” Abfrage probiere, werden die Daten nur jeweils 1x pro Tastendruck gesendet. Und das soll eben nicht geschehen, die Buttons sollen quasi wie Schalter funktionieren. Was mir die Frage aufwirft, werden denn Zustände nach jedem Durchlauf des loops wieder gelöscht und auf null gesetzt?

Könnte man das ganze mit switch cases lösen? Wenn ja auf welche Variable beruft man sich !?
Kann man in einem Switch Case auch mehrere Variablen eingeben, wie hier z.B. x,y um die Koordinaten ?

Viele Fragen und ich hoffe auf viele Lösungsansätze.

MFG CrazyRider

Du musst eine Variable setzen um den Button umzuschalten. z.B. sowas wie “bool button1_pressed”. Dann kannst du bei jedem Tastendruck den Zustand ändern. Und je nach Zustand Daten senden oder nicht.

Die UTFT_Buttons Library hilft dir auch den Code etwas zu kürzen. Damit kannst du auch einfach die Button Farben ändern. Aber die Logik musst du genauso selbst implementieren.

Gewöhne dir außerdem an den Code von UI und Kommunikation zu trennen. Das Daten Senden hat eigentlich nichts im UI Code verloren. Du kannst in einer anderen Funktion die ständig aufgerufen wird genauso auf den Button Status abfragen.

Was soll die while(true) innerhalb der loop?

Wenn es nur 1x pro Tastendruck gesendet wird, dann setze in der Abfrage nur eine Variable. Du solltest hier nach dem EVA-Prinzip arbeiten!

E: Touch einlesen V: Daten vorbereiten A: Ausgeben auf dem CAN

...Die kannst in einer anderen Funktion die ständig aufgerufen wird...

und damit sie ständig aufgerufen wird, müssen alle while schleifen raus.

Ja genau das habe ich ja versucht mit der Variablen "Status_Button_3" "Status_Button_2" "Status_Button_3"

3 Variablen die je nach Tastendruck true or false ergeben.

UI? Bahnhof..!

D.h. die Abfrage der Buttons und damit die Änderung der Variablen in eine Funktion schreiben und diese dann im Loop aufrufen?! While Schleifen rauslöschen, da sonst das Pgr. nicht weiter arbeitet.

Wenn im Loop folgendes steht:

eingabe(); //1 verarbeitung(); //2 ausgabe(); //3

Werden diese schleifen nacheinander abgearbeitet - richtig?!

UI = UserInterface (dein Touch)

ja, wenn du das in Funktionen auslagerst, wird das nacheinander abgearbeitet, aber lass die Schleifen da weg!

UI - HMI ..... verstehe ; )

Ich setz mich gleich ran.

Danke!

Wie gesagt keine Schleifen! Nur if-Abfragen. Also immer mit if abfragen in welchem Zustand du bist. Oder bei Bedarf eine zeitliche Verzögerung per millis() für das Senden.

Dein Problem ist eben dass der Sende-Code im UI-Code steckt und nur ausgeführt wird wenn etwas gedrückt wurde. Das ist überhaupt nicht was du willst. Aber selbst wenn du nur einmalig was senden wolltest, sollte man das sauber trennen. Alleine wegen der Übersichtlichkeit und Wartbarkeit.

Ach ja, und du verwechselst Zuweisung und Vergleich:

Status_Button_2==false;
 Status_Button_3==false;

Und andere Stellen

Werden diese schleifen nacheinander abgearbeitet - richtig?!

Es sollten keine Schleifen sein, sondern Funktionen, die sofort fertig sind. Mit nacheinander ist richtig gemeint, dass sie sich nicht gegenseitig stören und unterbrechen. Da sie aber praktisch keine Zeit brauchen, ist ihre Reihenfolge eigentlich egal. Jede Funktion kommt "sofort" wieder dran, nachdem sie festgestellt hat, dass nichts zu tun war (oder sich eine Zustandsänderung gemerkt hat).

Damit waren die Funktionen gemeint.

Ich konnte den Sketch schon realtiv gut aufräumen und bisher läuft alles nach Plan.

Gibt es eine Möglichkeit eine IF Operation mit mehereren Variablen zu belegen.

Also IF (x,y,z==10) {Tue dies und das} ?

Nein. Man muss jede Bedingung einzeln machen und per && verknüpfen

Das hier macht die Button Geschichte wie gesagt etwas einfacher:
http://www.rinkydinkelectronics.com/library.php?id=61

Das kapselt den ganzen Kram mit den Koordinaten für dich. Da kann man direkt abfragen ob bestimmte Buttons gedrückt wurden.

if (x==10 && y==10 && z==10) { tu dis und das; }

Danke an euch alle. Das Programm läuft und tut was es soll !!

Jetzt geht es noch an den Feinschliff : )