13 #include "../include/tscope5/timer.h"
14 #include "../include/tscope5/timer_internal.h"
15 #include "../include/tscope5/system_internal.h"
35 ts5_check_timer(
"ts5_get_time");
36 ts5_log(TS5_LOGLEVEL_5,
"ts5_get_time()\n");
47 ts5_check_timer(
"ts5_wait");
48 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait(%f)\n", waittime);
51 double starttime = al_get_time();
53 if (waittime > 0.02) {
54 al_rest(waittime - 0.02);
57 while (al_get_time() < starttime+waittime) {
68 ts5_check_timer(
"ts5_wait_until");
69 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_until(%f)\n", deadline);
72 double starttime = al_get_time();
74 if (deadline - starttime > 0.02) {
75 al_rest(deadline - starttime - 0.02);
78 while (al_get_time() < deadline) {
125 ts5_check_timer(
"ts5_hide_response_key");
126 ts5_check_timer2(
"ts5_hide_response_key");
127 ts5_log(TS5_LOGLEVEL_3,
"ts5_hide_response_key(%d)\n", key);
129 if (key<0 || key>_ts5_status.timer_status.num_defined_buttons) {
130 ts5_fatal(
"ts5_hide_response_key: key argument is %d, there are %d reponse buttons defined\n",
131 key, _ts5_status.timer_status.num_defined_buttons);
141 if (_ts5_status.timer_status.mouse_is_response_device) {
143 for (i=0; i<_ts5_status.timer_status.mouse.num_buttons; i++) {
145 _ts5_status.timer_status.mouse.button_press_active[i] =
146 _ts5_status.timer_status.mouse.button_press_defined[i];
148 _ts5_status.timer_status.mouse.button_release_active[i] =
149 _ts5_status.timer_status.mouse.button_release_defined[i];
152 _ts5_status.timer_status.mouse.num_active_buttons =
153 _ts5_status.timer_status.mouse.num_defined_buttons;
156 if (_ts5_status.timer_status.keyboard_is_response_device) {
158 for (i=0; i<_ts5_status.timer_status.keyboard.num_buttons; i++) {
160 _ts5_status.timer_status.keyboard.button_press_active[i] =
161 _ts5_status.timer_status.keyboard.button_press_defined[i];
163 _ts5_status.timer_status.keyboard.button_release_active[i] =
164 _ts5_status.timer_status.keyboard.button_release_defined[i];
167 _ts5_status.timer_status.keyboard.num_active_buttons =
168 _ts5_status.timer_status.keyboard.num_defined_buttons;
171 if (_ts5_status.timer_status.joystick_is_response_device) {
173 for (i=0; i<_ts5_status.timer_status.num_joystick; i++) {
175 for (j=0; j<_ts5_status.timer_status.joystick[i].num_buttons; j++) {
177 _ts5_status.timer_status.joystick[i].button_press_active[j] =
178 _ts5_status.timer_status.joystick[i].button_press_defined[j];
180 _ts5_status.timer_status.joystick[i].button_release_active[j] =
181 _ts5_status.timer_status.joystick[i].button_release_defined[j];
183 _ts5_status.timer_status.joystick[i].num_active_buttons =
184 _ts5_status.timer_status.joystick[i].num_defined_buttons;
188 if (_ts5_status.timer_status.cedrusbox_is_response_device) {
190 for (i=0; i<_ts5_status.timer_status.num_cedrusbox; i++) {
192 for (j=0; j<_ts5_status.timer_status.cedrusbox[i].num_buttons; j++) {
194 _ts5_status.timer_status.cedrusbox[i].button_press_active[j] =
195 _ts5_status.timer_status.cedrusbox[i].button_press_defined[j];
197 _ts5_status.timer_status.cedrusbox[i].button_release_active[j] =
198 _ts5_status.timer_status.cedrusbox[i].button_release_defined[j];
200 _ts5_status.timer_status.cedrusbox[i].num_active_buttons =
201 _ts5_status.timer_status.cedrusbox[i].num_defined_buttons;
204 _ts5_status.timer_status.num_active_buttons = _ts5_status.timer_status.num_defined_buttons;
210 if (_ts5_status.timer_status.mouse_is_response_device) {
212 for (i=0; i<_ts5_status.timer_status.mouse.num_buttons; i++) {
214 if (key==_ts5_status.timer_status.mouse.button_press_active[i]) {
215 _ts5_status.timer_status.mouse.button_press_active[i] = 0;
218 else if (key==_ts5_status.timer_status.mouse.button_release_active[i]) {
219 _ts5_status.timer_status.mouse.button_release_active[i] = 0;
224 _ts5_status.timer_status.mouse.num_active_buttons--;
225 _ts5_status.timer_status.num_active_buttons--;
231 if (_ts5_status.timer_status.keyboard_is_response_device) {
233 for (i=0; i<_ts5_status.timer_status.keyboard.num_buttons; i++) {
235 if (key==_ts5_status.timer_status.keyboard.button_press_active[i]) {
236 _ts5_status.timer_status.keyboard.button_press_active[i] = 0;
239 else if (key==_ts5_status.timer_status.keyboard.button_release_active[i]) {
240 _ts5_status.timer_status.keyboard.button_release_active[i] = 0;
245 _ts5_status.timer_status.keyboard.num_active_buttons--;
246 _ts5_status.timer_status.num_active_buttons--;
252 if (_ts5_status.timer_status.joystick_is_response_device) {
254 for (i=0; i<_ts5_status.timer_status.num_joystick; i++) {
256 for (j=0; j<_ts5_status.timer_status.joystick[i].num_buttons; j++) {
258 if (key==_ts5_status.timer_status.joystick[i].button_press_active[j]) {
259 _ts5_status.timer_status.joystick[i].button_press_active[j] = 0;
262 else if (key==_ts5_status.timer_status.joystick[i].button_release_active[j]) {
263 _ts5_status.timer_status.joystick[i].button_release_active[j] = 0;
268 _ts5_status.timer_status.joystick[i].num_active_buttons--;
269 _ts5_status.timer_status.num_active_buttons--;
276 if (_ts5_status.timer_status.cedrusbox_is_response_device) {
278 for (i=0; i<_ts5_status.timer_status.num_cedrusbox; i++) {
280 for (j=0; j<_ts5_status.timer_status.cedrusbox[i].num_buttons; j++) {
282 if (key==_ts5_status.timer_status.cedrusbox[i].button_press_active[j]) {
283 _ts5_status.timer_status.cedrusbox[i].button_press_active[j] = 0;
286 else if (key==_ts5_status.timer_status.cedrusbox[i].button_release_active[j]) {
287 _ts5_status.timer_status.cedrusbox[i].button_release_active[j] = 0;
292 _ts5_status.timer_status.cedrusbox[i].num_active_buttons--;
293 _ts5_status.timer_status.num_active_buttons--;
304 ts5_fatal(
"ts5_hide_response_key: response key %d not found\n", key);
307 if (_ts5_status.timer_status.num_active_buttons<1) {
308 ts5_fatal(
"ts5_hide_response_key: there are no active response buttons left\n");
311 return _ts5_status.timer_status.num_active_buttons;
320 ts5_check_timer(
"ts5_remove_response_keys");
321 ts5_log(TS5_LOGLEVEL_3,
"ts5_remove_response_keys()\n");
326 if (_ts5_status.timer_status.mouse_is_response_device) {
328 for (i=0; i<_ts5_status.timer_status.mouse.num_buttons; i++) {
330 _ts5_status.timer_status.mouse.button_press_defined[i] = 0;
331 _ts5_status.timer_status.mouse.button_press_active[i] = 0;
332 _ts5_status.timer_status.mouse.button_release_defined[i] = 0;
333 _ts5_status.timer_status.mouse.button_release_active[i] = 0;
336 _ts5_status.timer_status.mouse_is_response_device = 0;
340 if (_ts5_status.timer_status.keyboard_is_response_device) {
342 for (i=0; i<_ts5_status.timer_status.keyboard.num_buttons; i++) {
344 _ts5_status.timer_status.keyboard.button_press_defined[i] = 0;
345 _ts5_status.timer_status.keyboard.button_press_active[i] = 0;
346 _ts5_status.timer_status.keyboard.button_release_defined[i] = 0;
347 _ts5_status.timer_status.keyboard.button_release_active[i] = 0;
350 _ts5_status.timer_status.keyboard_is_response_device = 0;
354 if (_ts5_status.timer_status.joystick_is_response_device) {
356 for (i=0; i<_ts5_status.timer_status.num_joystick; i++) {
358 for (j=0; j<_ts5_status.timer_status.joystick[i].num_buttons; j++) {
360 _ts5_status.timer_status.joystick[i].button_press_defined[j] = 0;
361 _ts5_status.timer_status.joystick[i].button_press_active[j] = 0;
362 _ts5_status.timer_status.joystick[i].button_release_defined[j] = 0;
363 _ts5_status.timer_status.joystick[i].button_release_active[j] = 0;
367 _ts5_status.timer_status.joystick_is_response_device = 0;
371 if (_ts5_status.timer_status.joystick_is_response_device) {
373 for (i=0; i<_ts5_status.timer_status.num_joystick; i++) {
375 for (j=0; j<_ts5_status.timer_status.joystick[i].num_buttons; j++) {
377 _ts5_status.timer_status.joystick[i].button_press_defined[j] = 0;
378 _ts5_status.timer_status.joystick[i].button_press_active[j] = 0;
379 _ts5_status.timer_status.joystick[i].button_release_defined[j] = 0;
380 _ts5_status.timer_status.joystick[i].button_release_active[j] = 0;
384 _ts5_status.timer_status.joystick_is_response_device = 0;
388 if (_ts5_status.timer_status.cedrusbox_is_response_device) {
390 for (i=0; i<_ts5_status.timer_status.num_cedrusbox; i++) {
392 for (j=0; j<_ts5_status.timer_status.cedrusbox[i].num_buttons; j++) {
394 _ts5_status.timer_status.cedrusbox[i].button_press_defined[j] = 0;
395 _ts5_status.timer_status.cedrusbox[i].button_press_active[j] = 0;
396 _ts5_status.timer_status.cedrusbox[i].button_release_defined[j] = 0;
397 _ts5_status.timer_status.cedrusbox[i].button_release_active[j] = 0;
400 _ts5_status.timer_status.cedrusbox_is_response_device = 0;
403 _ts5_status.timer_status.num_defined_buttons=0;
404 _ts5_status.timer_status.num_active_buttons=0;
413 ts5_check_timer(
"ts5_flush_responses");
414 ts5_log(TS5_LOGLEVEL_5,
"ts5_flush_responses()\n");
416 al_flush_event_queue(_ts5_status.timer_status.response_queue);
432 ts5_check_timer(
"ts5_check_response");
433 ts5_check_timer2(
"ts5_check_response");
434 ts5_log(TS5_LOGLEVEL_6,
"ts5_check_response(%p,%p)\n", resptime, timing_error);
439 if (!al_get_next_event(_ts5_status.timer_status.response_queue, &event)) {
441 if (resptime!=NULL) {
442 *resptime = al_get_time();
444 if (timing_error!=NULL) {
450 if (resptime!=NULL) {
451 *resptime =
event.any.timestamp;
454 if (timing_error!=NULL) {
461 if (_ts5_status.timer_status.mouse_is_response_device) {
463 if (_ts5_status.timer_status.mouse.num_active_buttons) {
465 if (event.type==ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) {
467 resp = _ts5_status.timer_status.mouse.button_press_active[
event.mouse.button-1];
470 if (event.type==ALLEGRO_EVENT_MOUSE_BUTTON_UP) {
471 resp = _ts5_status.timer_status.mouse.button_release_active[
event.mouse.button-1];
477 if (_ts5_status.timer_status.keyboard_is_response_device) {
479 if (_ts5_status.timer_status.keyboard.num_active_buttons) {
481 if (event.type==ALLEGRO_EVENT_KEY_DOWN) {
482 resp = _ts5_status.timer_status.keyboard.
483 button_press_active[
event.keyboard.keycode-1];
486 if (event.type==ALLEGRO_EVENT_KEY_UP) {
487 resp = _ts5_status.timer_status.keyboard.
488 button_release_active[
event.keyboard.keycode-1];
494 if (_ts5_status.timer_status.joystick_is_response_device) {
496 for (i=0; i<_ts5_status.timer_status.num_joystick; i++) {
498 if (_ts5_status.timer_status.joystick[i].num_active_buttons) {
500 if (event.type==ALLEGRO_EVENT_JOYSTICK_BUTTON_DOWN) {
502 ALLEGRO_JOYSTICK *stick = al_get_joystick(i);
504 if (event.joystick.id == stick) {
505 resp = _ts5_status.timer_status.joystick[i].
506 button_press_active[
event.joystick.button];
510 if (event.type==ALLEGRO_EVENT_JOYSTICK_BUTTON_UP) {
512 ALLEGRO_JOYSTICK *stick = al_get_joystick(i);
514 if (event.joystick.id == stick) {
515 resp = _ts5_status.timer_status.joystick[i].
516 button_release_active[
event.joystick.button];
524 if (_ts5_status.timer_status.cedrusbox_is_response_device) {
526 for (i=0; i<_ts5_status.timer_status.num_cedrusbox; i++) {
528 if (_ts5_status.timer_status.cedrusbox[i].num_active_buttons) {
530 if (event.type==TS5_EVENT_CEDRUS_BUTTON_DOWN) {
532 if (event.user.data1 == i) {
533 resp = _ts5_status.timer_status.cedrusbox[i].
534 button_press_active[
event.user.data2];
538 if (event.type==TS5_EVENT_CEDRUS_BUTTON_UP) {
540 if (event.user.data1 == i) {
541 resp = _ts5_status.timer_status.cedrusbox[i].
542 button_release_active[
event.user.data2];
546 if (resp && timing_error!=NULL) {
547 *timing_error = ((double)event.user.data3)/1000000.0;
554 if (_ts5_status.timer_status.parport_is_response_device) {
556 for (i=0; i<_ts5_status.timer_status.num_parport; i++) {
558 if (_ts5_status.timer_status.parport[i].num_active_buttons) {
560 if (event.type==TS5_EVENT_PARPORT_BUTTON_DOWN) {
562 if (event.user.data1 == i) {
563 resp = _ts5_status.timer_status.parport[i].
564 button_press_active[
event.user.data2-1];
568 if (event.type==TS5_EVENT_PARPORT_BUTTON_UP) {
570 if (event.user.data1 == i) {
571 resp = _ts5_status.timer_status.parport[i].
572 button_release_active[
event.user.data2-1];
576 if (resp && timing_error!=NULL) {
577 *timing_error = ((double)event.user.data3)/1000000.0;
598 ts5_check_timer(
"ts5_wait_for_response");
599 ts5_check_timer2(
"ts5_wait_for_response");
600 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_response(%p,%p)\n", resptime, timing_error);
623 ts5_check_timer(
"ts5_wait_for_response_timed");
624 ts5_check_timer2(
"ts5_wait_for_response_timed");
625 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_response_timed(%p,%p,%f)\n", resptime, timing_error, maxtime);
628 ts5_fatal(
"ts5_wait_for_response_timed: maxtime is negative (%f)\n", maxtime);
631 int resp=0, deadline=0;
632 double starttime = al_get_time();
634 while (!resp && !deadline) {
638 if (al_get_time()-starttime>=maxtime) {
658 ts5_check_timer(
"ts5_wait_for_response_until");
659 ts5_check_timer2(
"ts5_wait_for_response_until");
660 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_response_until(%p,%p,%f)\n", resptime, timing_error, deadline);
662 if (deadline<al_get_time()) {
663 ts5_fatal(
"ts5_wait_for_response_until: response deadline is in the past (%f)\n",
664 deadline-al_get_time());
667 int resp=0, maxtime=0;
669 while (!resp && !maxtime) {
673 if (al_get_time()>=deadline) {
719 ts5_check_timer(
"ts5_flush_triggers");
720 ts5_log(TS5_LOGLEVEL_5,
"ts5_flush_triggers()\n");
722 al_flush_event_queue(_ts5_status.timer_status.trigger_queue);
738 ts5_check_timer(
"ts5_check_trigger");
739 ts5_check_timer3(
"ts5_check_trigger");
740 ts5_log(TS5_LOGLEVEL_6,
"ts5_check_trigger(%p,%p)\n", trigtime, timing_error);
745 if (trigtime!=NULL) {
746 *trigtime = al_get_time();
748 if (timing_error!=NULL) {
752 if (al_get_next_event(_ts5_status.timer_status.trigger_queue, &event)) {
754 if(_ts5_status.timer_status.parport_is_trigger_device) {
757 for (i=0; i<_ts5_status.timer_status.num_parport; i++) {
759 if (_ts5_status.timer_status.parport[i].is_trigger_input_device) {
761 if (event.type==TS5_EVENT_PARPORT_TRIGGER && event.user.data1 == i) {
763 if (trigtime!=NULL) {
764 *trigtime =
event.any.timestamp;
767 if (timing_error!=NULL) {
768 *timing_error = ((double)event.user.data3)/1000000.0;
771 trigger =
event.user.data2;
777 if(_ts5_status.timer_status.serialport_is_trigger_device) {
780 for (i=0; i<_ts5_status.timer_status.num_serialport; i++) {
782 if (_ts5_status.timer_status.serialport[i].is_trigger_input_device) {
784 if (event.type==TS5_EVENT_SERIALPORT_TRIGGER && event.user.data1 == i) {
786 if (trigtime!=NULL) {
787 *trigtime =
event.any.timestamp;
790 if (timing_error!=NULL) {
791 *timing_error = ((double)event.user.data3)/1000000.0;
794 trigger =
event.user.data2;
815 ts5_check_timer(
"ts5_wait_for_trigger");
816 ts5_check_timer2(
"ts5_wait_for_trigger");
817 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_trigger(%p,%p)\n", trigtime, timing_error);
840 ts5_check_timer(
"ts5_wait_for_trigger_timed");
841 ts5_check_timer2(
"ts5_wait_for_trigger_timed");
842 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_trigger_timed(%p,%p,%f)\n", trigtime, timing_error, maxtime);
845 ts5_fatal(
"ts5_wait_for_trigger_timed: maxtime is negative (%f)\n", maxtime);
848 int trigger=0, deadline=0;
849 double starttime = al_get_time();
851 while (!trigger && !deadline) {
855 if (al_get_time()-starttime>=maxtime) {
876 ts5_check_timer(
"ts5_wait_for_trigger_until");
877 ts5_check_timer2(
"ts5_wait_for_trigger_until");
878 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_trigger_until(%p,%p,%f)\n", trigtime, timing_error, deadline);
880 if (deadline<al_get_time()) {
881 ts5_fatal(
"ts5_wait_for_trigger_until: trigger deadline is in the past (%f)\n",
882 deadline-al_get_time());
885 int trigger=0, maxtime=0;
887 while (!trigger && !maxtime) {
891 if (al_get_time()>=deadline) {
907 ts5_check_timer(
"ts5_write_all_triggers");
908 ts5_check_timer3(
"ts5_write_all_triggers");
909 ts5_log(TS5_LOGLEVEL_5,
"ts5_write_all_triggers(%s)\n", filename);
912 fp = fopen(filename,
"a+");
914 ts5_fatal(
"ts5_write_all_triggers: could not open output file %s\n", filename);
919 while (al_get_next_event(_ts5_status.timer_status.trigger_log, &event)) {
921 fprintf(fp,
"%10.8f ", event.any.timestamp);
923 double timing_error = ((double)event.user.data3)/1000000.0;
924 fprintf(fp,
"%10.8f ", timing_error);
926 if (event.type==TS5_EVENT_PARPORT_TRIGGER) {
927 fprintf(fp,
"PARPORT ");
929 else if (event.type==TS5_EVENT_SERIALPORT_TRIGGER) {
930 fprintf(fp,
"SERIALPORT ");
933 fprintf(fp,
"UNKNOWN ");
936 fprintf(fp,
"%d ", (
int)event.user.data1+1);
937 fprintf(fp,
"%d ", (
int)event.user.data2);