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

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

Kommentar:
Einfügen von HTML im Kommentar:

Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a>
Bild einfügen: <img src="BILDURL">
Text formatieren: <b>fetter Text</b>  <i>kursiver Text</i> <u>unterstrichener Text</u>
Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b>
C2 Quellcode formatieren: <code>Quellcode</code>
ASM Quellcode formatieren: <asm>Quellcode</asm>
(Innerhalb eines Quellcodeabschnitts ist kein html möglich.)
Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst !  

> 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 > <code> > loop > { // loop anfang > if (InEingabe == 1) continue; > > if (stkeyb.get() !=255) // warten taste gedrückt > [...] > } > </code> > > und in der Funktion dis > <code> > [...] > InEingabe == 1; > uhrdatum(); > > [...] > </code> > > 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: > <code> > /******************************************************************************* > * Textkonstanten > *******************************************************************************/ > const MENU20NR = 3; // Anzahl der Menupunkte bei F1 > const MENU20[] = "0: Zur\xf5""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; > } > } > } > </code> > > 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
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB