Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Menü Aufbau/Beispiel Kategorie: Programmierung (von Werner - 2.08.2008 19:05)
Als Antwort auf Re: Menü Aufbau/Beispiel von Jens. - 1.08.2008 16:51
Ich nutze:
C-Control II Station, OSOPT V3.1
Hi Jens,

schön lang und nicht ganz übersichtlich dein Menü. Hier aber in paar Ideen zur Lösungsfindung:
1. Im Thread main ist das release und das capture nicht auf der selben Ebene.
   release wird in der loop immer ausgeführt, das capture nur wenn Taste gedrückt.

2. Was passiert in deinen Funtionen uhrdatum() und test()?
   Wenn diese blockierend arbeiten, dann ist die Unterscheidung von pos = 1 und pos = 2
   nicht nötig, da aus der Funktion nur dann zurück gekehrt wird, wenn die Eingabe
   abgeschlossen ist, dann kann auch gleich im zweiten Teil weiter gearbeitet werden
   (pos = 2). Ein gutes Beispiel für eine solche Eingabefunktion ist in der stkeyb.input()
   zu finden. Diese Funktion wartet auf die Eingabe von Ziffen und kehrt erst bei Enter,
   timeout oder Abbruch zurück.
   Wenn du allerdings in deinen Funktionen einen neue Thread starten solltest, dann
   musst du während der Eingabe das Menü deaktivieren.
   Hier ein Beispiel:

Im Thread main

 loop
  { // loop anfang
    if (InEingabe == 1) continue;
 
    if (stkeyb.get() !=255) // warten taste gedrückt
[...]
  }
 


und in der Funktion dis

[...]
    InEingabe == 1;
    uhrdatum();

[...]


Soll hei�en, dass beim starten der Eingabe das Navigieren durch das Menü
unterbunden wird. Aber Achtung, nicht vergessen am Ende der Eingabe
InEingabe = 0 zu setzen.


Persönlich bevorzuge ich die erste Variante mit der blockierende Eingabefunktion.

In meinem Program starte ich ein Menü durch drücken der Tasten F1, F2 oder F3.
Dann rufe ich aus dem Hauptthread die entsprechende Unterfunktion auf.
Hier werden dann die Untermenüpunkte angezeigt und anschlie�end in die
Eingabefunktion verzweigt. Dort erfolgt dann die eigentliche Eingabe. Alle
Funktionen sind blockierend.

Hier ein Codeschnipsel:

/*******************************************************************************
* Textkonstanten
*******************************************************************************/

const MENU20NR = 3;                                                             // Anzahl der Menupunkte bei F1
const MENU20[] = "0: Zurxf5""ck       ","1: Datum stellen","2: Zeit stellen "; // Menueoptionen bei F1

const MENU21   = "Datum einstellen";                                            // Menueanzeigetexte je nach Menupunkt
const MENU22   = "Uhrzeit stellen ";

const INPUTERR = "Eingabefehler!!!";                                            // Meldung bei fehlerhaften Eingaben
const INPUTCAN = "Abbruch!        ";                                            // Meldung bei Abbruch

/*******************************************************************************
* Konstanten
*******************************************************************************/

const TIMEOUT  = 10000;                                                         // Timeout fuer Eingaben
const SHOW_OLD = 1000;                                                          // Anzeigedauer fuer alte Werte
const SHOW_NEW = 2000;                                                          // Anzeigedauer fuer neue Werte


/*******************************************************************************
* Menu22()
*        Untermenue Nr.2 im Menu F1 -  Uhrzeit einstellen
*
* @param void
* @return void
*******************************************************************************/

function Menu22()
{
  long val;                                                                     // Hilfswerte fuer Eingaben
  int  val1, val2, val3;                                                        // Aufgeteile Eingabewerte

  lcdext.line(1);
  lcdext.print(MENU22);
  lcdext.line(2);
  lcdext.print(" ");
  lcdext.time(1);
  sleep SHOW_OLD;
  val = input(-1, 2, " __:__:__       ");
  lcdext.delline(2);
  lcdext.line(2);
  val1 = val / 10000;  val = val % 10000;                                       // Stunde
  val2 = val / 100;                                                             // Minute
  val3 = val % 100;                                                             // Sekunde
  if (val1>=0)and(val1<=24) and (val2>=0)and(val2<=59) and (val3>=0)and(val3<=59)
  {
    system.settime(val1, val2, val3);
    pcf8583.syncpcf();
    lcdext.print("Set: ");
    lcdext.time(1);
  }
  else if (val == -1)                                                           // bei Defaultwert
    lcdext.print(INPUTCAN);                                                     // Eingabe abgebrochen!
  else
    lcdext.print(INPUTERR);

  sleep SHOW_NEW;
}
/*******************************************************************************
* Menu20()
*        Anzeigen des Untermenues nach druecken der Taste F1.
*        Menuepunkt zum Konfigurieren der Grundparameter
*
* @param void
* @return void
*******************************************************************************/

function Menu20()
{
  long timeout, val;                                                              // Hilfswerte fuer Timeout und Eingaben

  MZahl = MENU20NR;                                                             // 4 Menuoptionen
  InMenu = 0x20;
  stports.setLED(6, 1);

  loop
  {
    lcdext.clear();
    timeout = system.timer();
    loop
    {
      Key = stkeyb.get();
      if ((Key < MZahl) or (Key == stkeyb.CLEAR)) break;
      val = system.timer() - timeout;
      if (val >= (TIMEOUT * 2))
      {
        lcdext.clear();
        InMenu = 0;
        stports.setLED(6, 0);
        return;                                                                 // Timeout-Abbruch
      }
      lcdext.line(1);
      lcdext.print(MENU20[mod(val, MZahl)]);
      yield;
    }
    plm.beep(10); sleep 40; plm.beep(-1);
    wait stkeyb.get()==255;
    sleep 50;                                                                   // Zeit zum Tastenentprellen

    if (Key == 1)                                                               // Datum einstellen
    {
      stports.setLED(1, 1);
      Menu21();
      stports.setLED(1, 0);
    }
    if (Key == 2)                                                               // Uhrzeit einstellen
    {
      stports.setLED(2, 1);
      Menu22();
      stports.setLED(2, 0);
    }
    if (Key == 0)                                                               // Zurueck
    {
      timer.DefineUpDown();
      lcdext.clear();
      InMenu = 0;
      stports.setLED(6, 0);
      return;
    }
  }
}


Hierbei verwende ich eine eigene Eingabefunktion input, welche mit einer Eingabemaske
arbeitet. Ansonsten entspricht Sie grundsätzlich der Funktion stkeyb.input(), hat
aber ganz andere Parameter.

Lange Antwort, hoffentlich hilfts.

Mfg
   Werner


    Antwort schreiben


Antworten: