2016-06-28 5 views
1

einstellen Ich möchte Timer für die Eingabe von Schlüssel und einen Timer für das Ausschalten von Licht einstellen, aber es verwenden ersten Timer ich eingestellt und ich kann nicht mehr als einen Timer und den zweiten Timer einstellen hat nicht funktioniert.Wie man mehr als einen Timer in Verifone VX520

i verwenden Sie den Code unten

int timer1, timer2; 
long events; 
timer1 = set_timer(8000, EVT_TIMER); 
timer2 = set_timer(5000, EVT_TIMER); 
while(1){ 
events = wait_event(); 
if(events & EVT_KBD){ 
clr_timer(timer1); 
break; 
} 
else if (events & EVT_TIMER) 
{ 
printf("TIME_OUT"); 
break; 
} 

while(1){ 
events = wait_event(); 
if(events & EVT_KBD){ 
clr_timer(timer2); 
break; 
} 
else if (events & EVT_TIMER) 
{ 
printf("TIME_OUT2"); 
break; 
} 
} 

Antwort

1

Sie benötigen eine andere Ereignismaske (EVT_TIMER) verwenden, wenn Sie sie als verschiedene Ereignisse erfassen möchten. Die schwierige Sache ist, dass Sie vorsichtig sein müssen, was Sie verwenden, weil es andere Aktionen auslösen kann. Diese Ereignisse werden in svc.h definiert (Beachten Sie, dass die Maske eine long ist und eine long als 32 Bit definiert ist, so dass Sie wirklich nichts übrig haben, nachdem alle Standardereignisse verwendet wurden).

Die gute Nachricht ist, dass set_timer eine ID zurückgibt (das sind timer1 und timer2 sind in Ihrem Code). Sie können dann die API SVC_TICKS verwenden, um festzustellen, welcher Timer abgelaufen ist. Ich habe einen Wrapper namens "timeRemains" geschrieben, um mir dabei zu helfen.

//First, define "timeRemains" 
char timeRemains(long* timer) 
{ 
    return SVC_TICKS(0, timer); 
} 

//Here's what your code may look like: 
if(!timeRemains(&timer1)) 
{ 
    //timer1 has expired. Do whatever you wanted to do when that happens. 
    //NOTE: you don't know the state of timer2--it may also have expired, 
    //  so you will need to deal with that 
} 

if(!timeRemains(&timer2)) 
{ 
    //timer2 has expired. Do whatever you wanted to do when that happens. 
    //NOTE: even though we are PRETTY sure that timer1 has not yet expired, 
    // you can't just forget about it. If you are going to exit this polling loop, 
    // be sure to clear it first. 
} 
0

Ein weiterer Ansatz ist Ihre Timer in Ihrer eigenen Datenstruktur (sagen wir eine sortierte Liste der Timer-Ablaufzeit bestellt werden) zu halten und nur ein System-Timer zu verwenden, für die erste Timer (dh die erste in der abzulaufen sortierte Liste).

Wenn Sie das Systemereignis EVT_TIMER erhalten, feuern Sie alle Timer ab, deren Verfallszeit in der Vergangenheit liegt (sie werden aus der sortierten Liste entfernt).

Wenn noch ein Timer in der Liste vorhanden ist, starten Sie einen neuen Systemtimer, damit der neue erste Timer abläuft.

Es gibt (mindestens) zwei Dinge zu beachten:

  • wenn eine neue Timer Hinzufügen Sie überprüfen müssen, wenn es nicht der erste Timer abläuft werden zu lassen. Ist dies der Fall, müssen Sie den vorhandenen Systemzeitgeber mit clr_timer() abbrechen und einen neuen Systemzeitgeber für den neuen ersten Zeitgeber festlegen (der neu hinzugefügte Zeitgeber, der jetzt an erster Stelle in der sortierten Liste steht). Überspringen Sie die clr_timer() Anruf beim Erstellen eines neuen Timer auf eine leere Liste hinzugefügt haben (wie sollte es kein System-Timer aktiv jetzt sein)

  • , wenn Sie den read_ticks() Anruf verwenden, um die Timer-Ablaufzeiten zu berechnen (oder etwas anderes) stellen Sie sicher, um den Fall zu behandeln, wenn sein Wert wieder auf Null überläuft (was alle 49,7 Tage passiert)

Verwandte Themen