Как установить более одного таймера в verifyone vx520
Я хочу установить таймер для ввода ключа и один таймер для выключения подсветки, но он использует первый таймер, который я установил, и я не могу установить более одного таймера, а второй таймер не работает.
я использую код ниже
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;
}
}
2 ответа
Другой подход заключается в том, чтобы сохранить ваши таймеры в вашей собственной структуре данных (скажем, отсортированный список, упорядоченный по времени истечения таймера) и использовать только один системный таймер для первого таймера, который истекает (то есть первый в отсортированном списке).
Когда вы получите EVT_TIMER
системное событие, вы запускаете все таймеры, время истечения которых прошло в прошлом (удаляя их из отсортированного списка).
Если в списке остается какой-либо таймер, вы запускаете новый системный таймер для истечения срока действия нового первого таймера.
Есть (по крайней мере) две вещи, о которых нужно знать:
при добавлении нового таймера вы должны проверить, не истек ли он первым таймером. Если это так, вы должны отменить существующий системный таймер с
clr_timer()
и установить новый системный таймер для истечения срока действия нового первого таймера (новый добавленный таймер, который теперь является первым в отсортированном списке). Пропуститьclr_timer()
вызов при добавлении нового таймера в пустой список (так как сейчас не должно быть активного системного таймера)если вы используете
read_ticks()
вызов для расчета времени истечения таймера (или для чего-либо еще), убедитесь, что обрабатывает случай, когда его значение возвращается к нулю (что происходит каждые 49,7 дней)
Вам нужно использовать другую маску событий (EVT_TIMER), если вы хотите захватить их как разные события. Хитрость в том, что вы должны быть осторожны с тем, что вы используете, потому что это может вызвать другие действия. Эти события определены в svc.h
(Обратите внимание, что маска является long
и long
определяется как 32-битный, так что у вас действительно ничего не остается после того, как все стандартные события используются).
Хорошая новость в том, что set_timer
возвращает идентификатор (вот что timer1
а также timer2
в вашем коде). Затем вы можете использовать SVC_TICKS
API, чтобы определить, какой таймер истек. Я написал обертку под названием "timeRemains", чтобы помочь мне с этим.
//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.
}