21 #include "../include/tscope5/timer.h"
22 #include "../include/tscope5/timer_internal.h"
23 #include "../include/tscope5/system_internal.h"
28 #elif defined TS5_MACOSX
30 #include <sys/resource.h>
31 #include <sys/types.h>
33 #elif defined TS5_LINUX
36 #include <sys/resource.h>
65 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_priority(%d)\n", priority);
67 int oldval = _ts5_status.timer.priority;
72 h = GetCurrentProcess();
76 if (priority == TS5_HIGH_PRIORITY) {
77 priorityclass = HIGH_PRIORITY_CLASS;
79 else if (priority == TS5_ABOVE_NORMAL_PRIORITY) {
80 priorityclass = ABOVE_NORMAL_PRIORITY_CLASS;
82 else if (priority == TS5_NORMAL_PRIORITY) {
83 priorityclass = NORMAL_PRIORITY_CLASS;
85 else if (priority == TS5_BELOW_NORMAL_PRIORITY) {
86 priorityclass = BELOW_NORMAL_PRIORITY_CLASS;
88 else if (priority == TS5_LOW_PRIORITY) {
89 priorityclass = IDLE_PRIORITY_CLASS;
92 ts5_fatal(
"ts5_set_priority: unknown priority requested\n");
95 if (!SetPriorityClass(h, priorityclass)) {
96 ts5_fatal(
"ts5_set_priority: can't change program priority\n");
99 #elif defined TS5_MACOSX
100 if (geteuid() != 0) {
101 ts5_fatal(
"%s: %s, %s\n",
"ts5_set_priority",
"not running as root",
102 "can't change program priority");
107 if (priority == TS5_HIGH_PRIORITY) {
110 else if (priority == TS5_ABOVE_NORMAL_PRIORITY) {
113 else if (priority == TS5_NORMAL_PRIORITY) {
116 else if (priority == TS5_BELOW_NORMAL_PRIORITY) {
119 else if (priority == TS5_LOW_PRIORITY) {
123 ts5_fatal(
"ts5_set_priority: unknown priority requested\n");
126 if (setpriority(PRIO_PGRP, 0, priorityclass)) {
127 ts5_fatal(
"ts5_set_priority: can't change program priority\n");
131 #elif defined TS5_LINUX
132 if (geteuid() != 0) {
133 ts5_fatal(
"%s: %s, %s\n",
"ts5_set_priority",
"not running as root",
134 "can't change program priority");
141 if (priority == TS5_HIGH_PRIORITY) {
144 else if (priority == TS5_ABOVE_NORMAL_PRIORITY) {
147 else if (priority == TS5_NORMAL_PRIORITY) {
150 else if (priority == TS5_BELOW_NORMAL_PRIORITY) {
153 else if (priority == TS5_LOW_PRIORITY) {
158 ts5_fatal(
"ts5_set_priority: unknown priority requested\n");
161 if (setpriority(PRIO_PGRP, 0, priorityclass)) {
162 ts5_fatal(
"ts5_set_priority: can't change program priority\n");
167 _ts5_status.timer.priority = priority;
181 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_priority()\n");
183 return _ts5_status.timer.priority;
211 ts5_log(TS5_LOGLEVEL_5,
"ts5_get_time()\n");
213 return al_get_time();
223 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait(%f)\n", waittime);
226 double starttime = al_get_time();
228 if (waittime > 0.02) {
229 while (al_get_time() < starttime + waittime - 0.02) {
234 while (al_get_time() < starttime+waittime) {
246 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_until(%f)\n", deadline);
249 double starttime = al_get_time();
251 if (deadline - starttime > 0.02) {
252 while (al_get_time() < deadline - 0.02) {
257 while (al_get_time() < deadline) {
311 ts5_log(TS5_LOGLEVEL_3,
"ts5_hide_response_button(%d)\n", button);
313 TS5_TIMER_STATUS *timer = &_ts5_status.timer;
315 if (button<0 || button>timer->num_defined_buttons) {
316 ts5_fatal(
"%s: %s %d, %s %d\n",
"ts5_hide_response_button",
317 "button argument is", button,
318 "number of defined buttons is",
319 timer->num_defined_buttons);
329 if (timer->mouse_is_response_device) {
331 for (i=0; i<timer->mouse.num_buttons; i++) {
333 timer->mouse.button_press_active[i] =
334 timer->mouse.button_press_defined[i];
336 timer->mouse.button_release_active[i] =
337 timer->mouse.button_release_defined[i];
340 timer->mouse.num_active_buttons =
341 timer->mouse.num_defined_buttons;
344 if (timer->keyboard_is_response_device) {
346 for (i=0; i<timer->keyboard.num_buttons; i++) {
348 timer->keyboard.button_press_active[i] =
349 timer->keyboard.button_press_defined[i];
351 timer->keyboard.button_release_active[i] =
352 timer->keyboard.button_release_defined[i];
355 timer->keyboard.num_active_buttons =
356 timer->keyboard.num_defined_buttons;
359 if (timer->joystick_is_response_device) {
361 for (i=0; i<timer->num_joysticks; i++) {
363 for (j=0; j<timer->joystick[i].num_buttons; j++) {
365 timer->joystick[i].button_press_active[j] =
366 timer->joystick[i].button_press_defined[j];
368 timer->joystick[i].button_release_active[j] =
369 timer->joystick[i].button_release_defined[j];
371 timer->joystick[i].num_active_buttons =
372 timer->joystick[i].num_defined_buttons;
376 if (timer->cedrusbox_is_response_device) {
378 for (i=0; i<timer->num_cedrusboxes; i++) {
380 for (j=0; j<timer->cedrusbox[i].num_buttons; j++) {
382 timer->cedrusbox[i].button_press_active[j] =
383 timer->cedrusbox[i].button_press_defined[j];
385 timer->cedrusbox[i].button_release_active[j] =
386 timer->cedrusbox[i].button_release_defined[j];
388 timer->cedrusbox[i].num_active_buttons =
389 timer->cedrusbox[i].num_defined_buttons;
392 timer->num_active_buttons =
393 timer->num_defined_buttons;
399 if (timer->mouse_is_response_device) {
401 for (i=0; i<timer->mouse.num_buttons; i++) {
403 if (button==timer->mouse.button_press_active[i]) {
404 timer->mouse.button_press_active[i] = 0;
407 else if (button==timer->mouse.button_release_active[i]) {
408 timer->mouse.button_release_active[i] = 0;
413 timer->mouse.num_active_buttons--;
414 timer->num_active_buttons--;
420 if (timer->keyboard_is_response_device) {
422 for (i=0; i<timer->keyboard.num_buttons; i++) {
424 if (button==timer->keyboard.button_press_active[i]) {
425 timer->keyboard.button_press_active[i] = 0;
428 else if (button==timer->keyboard.button_release_active[i]) {
429 timer->keyboard.button_release_active[i] = 0;
434 timer->keyboard.num_active_buttons--;
435 timer->num_active_buttons--;
441 if (timer->joystick_is_response_device) {
443 for (i=0; i<timer->num_joysticks; i++) {
445 for (j=0; j<timer->joystick[i].num_buttons; j++) {
447 if (button==timer->joystick[i].button_press_active[j]) {
448 timer->joystick[i].button_press_active[j] = 0;
451 else if (button==timer->joystick[i].button_release_active[j]) {
452 timer->joystick[i].button_release_active[j] = 0;
457 timer->joystick[i].num_active_buttons--;
458 timer->num_active_buttons--;
465 if (timer->cedrusbox_is_response_device) {
467 for (i=0; i<timer->num_cedrusboxes; i++) {
469 for (j=0; j<timer->cedrusbox[i].num_buttons; j++) {
471 if (button==timer->cedrusbox[i].button_press_active[j]) {
472 timer->cedrusbox[i].button_press_active[j] = 0;
475 else if (button==timer->cedrusbox[i].button_release_active[j]){
476 timer->cedrusbox[i].button_release_active[j] = 0;
481 timer->cedrusbox[i].num_active_buttons--;
482 timer->num_active_buttons--;
493 ts5_fatal(
"ts5_hide_response_button: response button %d not found\n", button);
496 if (timer->num_active_buttons<1) {
497 ts5_fatal(
"%s: %s\n",
"ts5_hide_response_button",
498 "there are no active response buttons left");
501 return timer->num_active_buttons;
511 ts5_log(TS5_LOGLEVEL_3,
"ts5_remove_response_buttons()\n");
513 TS5_TIMER_STATUS *timer = &_ts5_status.timer;
518 if (timer->mouse_is_response_device) {
520 for (i=0; i<timer->mouse.num_buttons; i++) {
522 timer->mouse.button_press_defined[i] = 0;
523 timer->mouse.button_press_active[i] = 0;
524 timer->mouse.button_release_defined[i] = 0;
525 timer->mouse.button_release_active[i] = 0;
528 timer->mouse_is_response_device = 0;
532 if (timer->keyboard_is_response_device) {
534 for (i=0; i<timer->keyboard.num_buttons; i++) {
536 timer->keyboard.button_press_defined[i] = 0;
537 timer->keyboard.button_press_active[i] = 0;
538 timer->keyboard.button_release_defined[i] = 0;
539 timer->keyboard.button_release_active[i] = 0;
542 timer->keyboard_is_response_device = 0;
546 if (timer->joystick_is_response_device) {
548 for (i=0; i<timer->num_joysticks; i++) {
550 for (j=0; j<timer->joystick[i].num_buttons; j++) {
552 timer->joystick[i].button_press_defined[j] = 0;
553 timer->joystick[i].button_press_active[j] = 0;
554 timer->joystick[i].button_release_defined[j] = 0;
555 timer->joystick[i].button_release_active[j] = 0;
559 timer->joystick_is_response_device = 0;
563 if (timer->joystick_is_response_device) {
565 for (i=0; i<timer->num_joysticks; i++) {
567 for (j=0; j<timer->joystick[i].num_buttons; j++) {
569 timer->joystick[i].button_press_defined[j] = 0;
570 timer->joystick[i].button_press_active[j] = 0;
571 timer->joystick[i].button_release_defined[j] = 0;
572 timer->joystick[i].button_release_active[j] = 0;
576 timer->joystick_is_response_device = 0;
580 if (timer->cedrusbox_is_response_device) {
582 for (i=0; i<timer->num_cedrusboxes; i++) {
584 for (j=0; j<timer->cedrusbox[i].num_buttons; j++) {
586 timer->cedrusbox[i].button_press_defined[j] = 0;
587 timer->cedrusbox[i].button_press_active[j] = 0;
588 timer->cedrusbox[i].button_release_defined[j] = 0;
589 timer->cedrusbox[i].button_release_active[j] = 0;
592 timer->cedrusbox_is_response_device = 0;
595 timer->num_defined_buttons=0;
596 timer->num_active_buttons=0;
606 ts5_log(TS5_LOGLEVEL_5,
"ts5_flush_responses()\n");
608 al_flush_event_queue(_ts5_data.timer.response_queue);
628 ts5_log(TS5_LOGLEVEL_6,
"ts5_check_response(%p,%p)\n",
629 resptime, timing_error);
634 TS5_TIMER_STATUS *timer = &_ts5_status.timer;
636 if (!al_get_next_event(_ts5_data.timer.response_queue, &event)) {
638 if (resptime!=NULL) {
639 *resptime = al_get_time();
641 if (timing_error!=NULL) {
647 if (resptime!=NULL) {
648 *resptime =
event.any.timestamp;
651 if (timing_error!=NULL) {
658 if (timer->mouse_is_response_device) {
660 if (timer->mouse.num_active_buttons) {
662 if (event.type==ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) {
665 .button_press_active[
event.mouse.button-1];
668 if (event.type==ALLEGRO_EVENT_MOUSE_BUTTON_UP) {
670 .button_release_active[
event.mouse.button-1];
676 if (timer->keyboard_is_response_device) {
678 if (timer->keyboard.num_active_buttons) {
680 if (event.type==ALLEGRO_EVENT_KEY_DOWN) {
681 resp = timer->keyboard
682 .button_press_active[
event.keyboard.keycode-1];
685 if (event.type==ALLEGRO_EVENT_KEY_UP) {
686 resp = timer->keyboard
687 .button_release_active[
event.keyboard.keycode-1];
693 if (timer->joystick_is_response_device) {
695 for (i=0; i<timer->num_joysticks; i++) {
697 if (timer->joystick[i].num_active_buttons) {
699 if (event.type==ALLEGRO_EVENT_JOYSTICK_BUTTON_DOWN) {
701 ALLEGRO_JOYSTICK *stick = al_get_joystick(i);
703 if (event.joystick.id == stick) {
704 resp = timer->joystick[i]
705 .button_press_active[
event.joystick.button];
709 if (event.type==ALLEGRO_EVENT_JOYSTICK_BUTTON_UP) {
711 ALLEGRO_JOYSTICK *stick = al_get_joystick(i);
713 if (event.joystick.id == stick) {
714 resp = timer->joystick[i]
715 .button_release_active
716 [
event.joystick.button];
724 if (timer->cedrusbox_is_response_device) {
726 for (i=0; i<timer->num_cedrusboxes; i++) {
728 if (timer->cedrusbox[i].num_active_buttons) {
730 if (event.type==TS5_EVENT_CEDRUS_BUTTON_DOWN) {
732 if (event.user.data1 == i) {
733 resp = timer->cedrusbox[i]
734 .button_press_active[
event.user.data2];
738 if (event.type==TS5_EVENT_CEDRUS_BUTTON_UP) {
740 if (event.user.data1 == i) {
741 resp = timer->cedrusbox[i]
742 .button_release_active[
event.user.data2];
746 if (resp && timing_error!=NULL) {
747 *timing_error = ((double)event.user.data3)/1000000.0;
754 if (timer->parport_is_response_device) {
756 for (i=0; i<timer->num_parports; i++) {
758 if (timer->parport[i].num_active_buttons) {
760 if (event.type==TS5_EVENT_PARPORT_BUTTON_DOWN) {
762 if (event.user.data1 == i) {
763 resp = timer->parport[i]
764 .button_press_active[
event.user.data2-1];
768 if (event.type==TS5_EVENT_PARPORT_BUTTON_UP) {
770 if (event.user.data1 == i) {
771 resp = timer->parport[i]
772 .button_release_active[
event.user.data2-1];
776 if (resp && timing_error!=NULL) {
777 *timing_error = ((double)event.user.data3)/1000000.0;
801 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_response(%p,%p)\n",
802 resptime, timing_error);
830 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_response_timed(%p,%p,%f)\n",
831 resptime, timing_error, maxtime);
834 ts5_fatal(
"ts5_wait_for_response_timed: maxtime is negative (%f)\n",
838 int resp=0, deadline=0;
839 double starttime = al_get_time();
841 while (!resp && !deadline) {
845 if (al_get_time()-starttime>=maxtime) {
870 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_response_until(%p,%p,%f)\n",
871 resptime, timing_error, deadline);
873 if (deadline<al_get_time()) {
874 ts5_fatal(
"%s: %s (%f)\n",
"ts5_wait_for_response_until",
875 "response deadline is in the past",
876 deadline-al_get_time());
879 int resp=0, maxtime=0;
881 while (!resp && !maxtime) {
885 if (al_get_time()>=deadline) {
938 ts5_log(TS5_LOGLEVEL_5,
"ts5_flush_triggers()\n");
940 al_flush_event_queue(_ts5_data.timer.trigger_queue);
958 ts5_log(TS5_LOGLEVEL_6,
"ts5_check_trigger(%p,%p)\n",
959 trigtime, timing_error);
964 TS5_TIMER_STATUS *timer = &_ts5_status.timer;
966 if (trigtime!=NULL) {
967 *trigtime = al_get_time();
969 if (timing_error!=NULL) {
973 if (al_get_next_event(_ts5_data.timer.trigger_queue, &event)) {
975 if(timer->parport_is_trigger_device) {
978 for (i=0; i<timer->num_parports; i++) {
980 if (timer->parport[i].is_trigger_input_device) {
982 if (event.type==TS5_EVENT_PARPORT_TRIGGER
983 && event.user.data1 == i) {
985 if (trigtime!=NULL) {
986 *trigtime =
event.any.timestamp;
989 if (timing_error!=NULL) {
991 ((double)event.user.data3)/1000000.0;
994 trigger =
event.user.data2;
1000 if(timer->serialport_is_trigger_device) {
1003 for (i=0; i<timer->num_serialports; i++) {
1005 if (timer->serialport[i].is_trigger_input_device) {
1007 if (event.type==TS5_EVENT_SERIALPORT_TRIGGER
1008 && event.user.data1 == i) {
1010 if (trigtime!=NULL) {
1011 *trigtime =
event.any.timestamp;
1014 if (timing_error!=NULL) {
1016 ((double)event.user.data3)/1000000.0;
1019 trigger =
event.user.data2;
1043 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_trigger(%p,%p)\n",
1044 trigtime, timing_error);
1073 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_trigger_timed(%p,%p,%f)\n",
1074 trigtime, timing_error, maxtime);
1077 ts5_fatal(
"ts5_wait_for_trigger_timed: maxtime is negative (%f)\n",
1081 int trigger=0, deadline=0;
1082 double starttime = al_get_time();
1084 while (!trigger && !deadline) {
1088 if (al_get_time()-starttime>=maxtime) {
1113 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_trigger_until(%p,%p,%f)\n",
1114 trigtime, timing_error, deadline);
1116 if (deadline<al_get_time()) {
1117 ts5_fatal(
"%s: %s (%f)\n",
"ts5_wait_for_trigger_until",
1118 "trigger deadline is in the past",
1119 deadline-al_get_time());
1122 int trigger=0, maxtime=0;
1124 while (!trigger && !maxtime) {
1128 if (al_get_time()>=deadline) {
1146 ts5_log(TS5_LOGLEVEL_5,
"ts5_write_all_triggers(%s)\n", filename);
1149 fp = fopen(filename,
"a+");
1151 ts5_fatal(
"ts5_write_all_triggers: could not open output file %s\n",
1155 ALLEGRO_EVENT event;
1157 while (al_get_next_event(_ts5_data.timer.trigger_log, &event)) {
1159 fprintf(fp,
"%10.8f ", event.any.timestamp);
1161 double timing_error = ((double)event.user.data3)/1000000.0;
1162 fprintf(fp,
"%10.8f ", timing_error);
1164 if (event.type==TS5_EVENT_PARPORT_TRIGGER) {
1165 fprintf(fp,
"PARPORT ");
1167 else if (event.type==TS5_EVENT_SERIALPORT_TRIGGER) {
1168 fprintf(fp,
"SERIALPORT ");
1171 fprintf(fp,
"UNKNOWN ");
1174 fprintf(fp,
"%d ", (
int)event.user.data1+1);
1175 fprintf(fp,
"%d ", (
int)event.user.data2);