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");
105 int priorityclass = 0;
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->voicekey_is_response_device) {
331 for (i=0; i<timer->voicekey.num_buttons; i++) {
333 timer->voicekey.button_press_active[i] =
334 timer->voicekey.button_press_defined[i];
336 timer->voicekey.button_release_active[i] =
337 timer->voicekey.button_release_defined[i];
340 timer->voicekey.num_active_buttons =
341 timer->voicekey.num_defined_buttons;
344 if (timer->mouse_is_response_device) {
346 for (i=0; i<timer->mouse.num_buttons; i++) {
348 timer->mouse.button_press_active[i] =
349 timer->mouse.button_press_defined[i];
351 timer->mouse.button_release_active[i] =
352 timer->mouse.button_release_defined[i];
355 timer->mouse.num_active_buttons =
356 timer->mouse.num_defined_buttons;
359 if (timer->keyboard_is_response_device) {
361 for (i=0; i<timer->keyboard.num_buttons; i++) {
363 timer->keyboard.button_press_active[i] =
364 timer->keyboard.button_press_defined[i];
366 timer->keyboard.button_release_active[i] =
367 timer->keyboard.button_release_defined[i];
370 timer->keyboard.num_active_buttons =
371 timer->keyboard.num_defined_buttons;
374 if (timer->joystick_is_response_device) {
376 for (i=0; i<timer->num_joysticks; i++) {
378 for (j=0; j<timer->joystick[i].num_buttons; j++) {
380 timer->joystick[i].button_press_active[j] =
381 timer->joystick[i].button_press_defined[j];
383 timer->joystick[i].button_release_active[j] =
384 timer->joystick[i].button_release_defined[j];
386 timer->joystick[i].num_active_buttons =
387 timer->joystick[i].num_defined_buttons;
391 if (timer->cedrusbox_is_response_device) {
393 for (i=0; i<timer->num_cedrusboxes; i++) {
395 for (j=0; j<timer->cedrusbox[i].num_buttons; j++) {
397 timer->cedrusbox[i].button_press_active[j] =
398 timer->cedrusbox[i].button_press_defined[j];
400 timer->cedrusbox[i].button_release_active[j] =
401 timer->cedrusbox[i].button_release_defined[j];
403 timer->cedrusbox[i].num_active_buttons =
404 timer->cedrusbox[i].num_defined_buttons;
408 if (timer->parport_is_response_device) {
410 for (i=0; i<timer->num_parports; i++) {
412 for (j=0; j<timer->parport[i].num_buttons; j++) {
414 timer->parport[i].button_press_active[j] =
415 timer->parport[i].button_press_defined[j];
417 timer->parport[i].button_release_active[j] =
418 timer->parport[i].button_release_defined[j];
420 timer->parport[i].num_active_buttons =
421 timer->parport[i].num_defined_buttons;
425 if (timer->serialport_is_response_device) {
427 for (i=0; i<timer->num_serialports; i++) {
429 for (j=0; j<timer->serialport[i].num_buttons; j++) {
431 timer->serialport[i].button_press_active[j] =
432 timer->serialport[i].button_press_defined[j];
434 timer->serialport[i].button_release_active[j] =
435 timer->serialport[i].button_release_defined[j];
437 timer->serialport[i].num_active_buttons =
438 timer->serialport[i].num_defined_buttons;
442 timer->num_active_buttons =
443 timer->num_defined_buttons;
449 if (timer->voicekey_is_response_device) {
451 for (i=0; i<timer->voicekey.num_buttons; i++) {
453 if (button==timer->voicekey.button_press_active[i]) {
454 timer->voicekey.button_press_active[i] = 0;
457 else if (button==timer->voicekey.button_release_active[i]) {
458 timer->voicekey.button_release_active[i] = 0;
463 timer->voicekey.num_active_buttons--;
464 timer->num_active_buttons--;
470 if (timer->mouse_is_response_device) {
472 for (i=0; i<timer->mouse.num_buttons; i++) {
474 if (button==timer->mouse.button_press_active[i]) {
475 timer->mouse.button_press_active[i] = 0;
478 else if (button==timer->mouse.button_release_active[i]) {
479 timer->mouse.button_release_active[i] = 0;
484 timer->mouse.num_active_buttons--;
485 timer->num_active_buttons--;
491 if (timer->keyboard_is_response_device) {
493 for (i=0; i<timer->keyboard.num_buttons; i++) {
495 if (button==timer->keyboard.button_press_active[i]) {
496 timer->keyboard.button_press_active[i] = 0;
499 else if (button==timer->keyboard.button_release_active[i]) {
500 timer->keyboard.button_release_active[i] = 0;
505 timer->keyboard.num_active_buttons--;
506 timer->num_active_buttons--;
512 if (timer->joystick_is_response_device) {
514 for (i=0; i<timer->num_joysticks; i++) {
516 for (j=0; j<timer->joystick[i].num_buttons; j++) {
518 if (button==timer->joystick[i].button_press_active[j]) {
519 timer->joystick[i].button_press_active[j] = 0;
522 else if (button==timer->joystick[i].button_release_active[j]) {
523 timer->joystick[i].button_release_active[j] = 0;
528 timer->joystick[i].num_active_buttons--;
529 timer->num_active_buttons--;
536 if (timer->cedrusbox_is_response_device) {
538 for (i=0; i<timer->num_cedrusboxes; i++) {
540 for (j=0; j<timer->cedrusbox[i].num_buttons; j++) {
542 if (button==timer->cedrusbox[i].button_press_active[j]) {
543 timer->cedrusbox[i].button_press_active[j] = 0;
546 else if (button==timer->cedrusbox[i].button_release_active[j]){
547 timer->cedrusbox[i].button_release_active[j] = 0;
552 timer->cedrusbox[i].num_active_buttons--;
553 timer->num_active_buttons--;
560 if (timer->parport_is_response_device) {
562 for (i=0; i<timer->num_parports; i++) {
564 for (j=0; j<timer->parport[i].num_buttons; j++) {
566 if (button==timer->parport[i].button_press_active[j]) {
567 timer->parport[i].button_press_active[j] = 0;
570 else if (button==timer->parport[i].button_release_active[j]){
571 timer->parport[i].button_release_active[j] = 0;
576 timer->parport[i].num_active_buttons--;
577 timer->num_active_buttons--;
584 if (timer->serialport_is_response_device) {
586 for (i=0; i<timer->num_serialports; i++) {
588 for (j=0; j<timer->serialport[i].num_buttons; j++) {
590 if (button==timer->serialport[i].button_press_active[j]) {
591 timer->serialport[i].button_press_active[j] = 0;
594 else if (button==timer->serialport[i].button_release_active[j]){
595 timer->serialport[i].button_release_active[j] = 0;
600 timer->serialport[i].num_active_buttons--;
601 timer->num_active_buttons--;
613 ts5_fatal(
"ts5_hide_response_button: response button %d not found\n", button);
616 if (timer->num_active_buttons<1) {
617 ts5_fatal(
"%s: %s\n",
"ts5_hide_response_button",
618 "there are no active response buttons left");
621 return timer->num_active_buttons;
631 ts5_log(TS5_LOGLEVEL_3,
"ts5_remove_response_buttons()\n");
633 TS5_TIMER_STATUS *timer = &_ts5_status.timer;
638 if (timer->voicekey_is_response_device) {
640 for (i=0; i<timer->voicekey.num_buttons; i++) {
642 timer->voicekey.button_press_defined[i] = 0;
643 timer->voicekey.button_press_active[i] = 0;
644 timer->voicekey.button_release_defined[i] = 0;
645 timer->voicekey.button_release_active[i] = 0;
648 timer->voicekey_is_response_device = 0;
652 if (timer->mouse_is_response_device) {
654 for (i=0; i<timer->mouse.num_buttons; i++) {
656 timer->mouse.button_press_defined[i] = 0;
657 timer->mouse.button_press_active[i] = 0;
658 timer->mouse.button_release_defined[i] = 0;
659 timer->mouse.button_release_active[i] = 0;
662 timer->mouse_is_response_device = 0;
666 if (timer->keyboard_is_response_device) {
668 for (i=0; i<timer->keyboard.num_buttons; i++) {
670 timer->keyboard.button_press_defined[i] = 0;
671 timer->keyboard.button_press_active[i] = 0;
672 timer->keyboard.button_release_defined[i] = 0;
673 timer->keyboard.button_release_active[i] = 0;
676 timer->keyboard_is_response_device = 0;
680 if (timer->joystick_is_response_device) {
682 for (i=0; i<timer->num_joysticks; i++) {
684 for (j=0; j<timer->joystick[i].num_buttons; j++) {
686 timer->joystick[i].button_press_defined[j] = 0;
687 timer->joystick[i].button_press_active[j] = 0;
688 timer->joystick[i].button_release_defined[j] = 0;
689 timer->joystick[i].button_release_active[j] = 0;
693 timer->joystick_is_response_device = 0;
697 if (timer->joystick_is_response_device) {
699 for (i=0; i<timer->num_joysticks; i++) {
701 for (j=0; j<timer->joystick[i].num_buttons; j++) {
703 timer->joystick[i].button_press_defined[j] = 0;
704 timer->joystick[i].button_press_active[j] = 0;
705 timer->joystick[i].button_release_defined[j] = 0;
706 timer->joystick[i].button_release_active[j] = 0;
710 timer->joystick_is_response_device = 0;
714 if (timer->cedrusbox_is_response_device) {
716 for (i=0; i<timer->num_cedrusboxes; i++) {
718 for (j=0; j<timer->cedrusbox[i].num_buttons; j++) {
720 timer->cedrusbox[i].button_press_defined[j] = 0;
721 timer->cedrusbox[i].button_press_active[j] = 0;
722 timer->cedrusbox[i].button_release_defined[j] = 0;
723 timer->cedrusbox[i].button_release_active[j] = 0;
726 timer->cedrusbox_is_response_device = 0;
729 timer->num_defined_buttons=0;
730 timer->num_active_buttons=0;
740 ts5_log(TS5_LOGLEVEL_5,
"ts5_flush_responses()\n");
742 al_flush_event_queue(_ts5_data.timer.response_queue);
762 ts5_log(TS5_LOGLEVEL_6,
"ts5_check_response(%p,%p)\n",
763 resptime, timing_error);
768 TS5_TIMER_STATUS *timer = &_ts5_status.timer;
770 if (!al_get_next_event(_ts5_data.timer.response_queue, &event)) {
772 if (resptime!=NULL) {
773 *resptime = al_get_time();
775 if (timing_error!=NULL) {
781 if (resptime!=NULL) {
782 *resptime =
event.any.timestamp;
785 if (timing_error!=NULL) {
792 if (timer->voicekey_is_response_device) {
794 if (timer->voicekey.num_active_buttons) {
796 if (event.type==TS5_EVENT_VOICEKEY_BUTTON_DOWN) {
797 resp = timer->voicekey
798 .button_press_active[
event.user.data2-1];
801 if (event.type==TS5_EVENT_VOICEKEY_BUTTON_UP) {
802 resp = timer->voicekey
803 .button_release_active[
event.user.data2-1];
806 if (resp && resptime!=NULL) {
807 *resptime = ((double)event.user.data3)/1000000.0;
814 if (timer->mouse_is_response_device) {
816 if (timer->mouse.num_active_buttons) {
818 if (event.type==ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) {
821 .button_press_active[
event.mouse.button-1];
824 if (event.type==ALLEGRO_EVENT_MOUSE_BUTTON_UP) {
826 .button_release_active[
event.mouse.button-1];
832 if (timer->keyboard_is_response_device) {
834 if (timer->keyboard.num_active_buttons) {
836 if (event.type==ALLEGRO_EVENT_KEY_DOWN) {
837 resp = timer->keyboard
838 .button_press_active[
event.keyboard.keycode-1];
841 if (event.type==ALLEGRO_EVENT_KEY_UP) {
842 resp = timer->keyboard
843 .button_release_active[
event.keyboard.keycode-1];
849 if (timer->joystick_is_response_device) {
851 for (i=0; i<timer->num_joysticks; i++) {
853 if (timer->joystick[i].num_active_buttons) {
855 if (event.type==ALLEGRO_EVENT_JOYSTICK_BUTTON_DOWN) {
857 ALLEGRO_JOYSTICK *stick = al_get_joystick(i);
859 if (event.joystick.id == stick) {
860 resp = timer->joystick[i]
861 .button_press_active[
event.joystick.button];
865 if (event.type==ALLEGRO_EVENT_JOYSTICK_BUTTON_UP) {
867 ALLEGRO_JOYSTICK *stick = al_get_joystick(i);
869 if (event.joystick.id == stick) {
870 resp = timer->joystick[i]
871 .button_release_active
872 [
event.joystick.button];
880 if (timer->cedrusbox_is_response_device) {
882 for (i=0; i<timer->num_cedrusboxes; i++) {
884 if (timer->cedrusbox[i].num_active_buttons) {
886 if (event.type==TS5_EVENT_CEDRUSBOX_BUTTON_DOWN) {
888 if (event.user.data1 == i) {
889 resp = timer->cedrusbox[i]
890 .button_press_active[
event.user.data2];
894 if (event.type==TS5_EVENT_CEDRUSBOX_BUTTON_UP) {
896 if (event.user.data1 == i) {
897 resp = timer->cedrusbox[i]
898 .button_release_active[
event.user.data2];
902 if (resp && timing_error!=NULL) {
903 *timing_error = ((double)event.user.data3)/1000000.0;
910 if (timer->parport_is_response_device) {
912 for (i=0; i<timer->num_parports; i++) {
914 if (timer->parport[i].num_active_buttons) {
916 if (event.type==TS5_EVENT_PARPORT_BUTTON_DOWN) {
918 if (event.user.data1 == i) {
919 resp = timer->parport[i]
920 .button_press_active[
event.user.data2-1];
924 if (event.type==TS5_EVENT_PARPORT_BUTTON_UP) {
926 if (event.user.data1 == i) {
927 resp = timer->parport[i]
928 .button_release_active[
event.user.data2-1];
932 if (resp && timing_error!=NULL) {
933 *timing_error = ((double)event.user.data3)/1000000.0;
940 if (timer->serialport_is_response_device) {
942 for (i=0; i<timer->num_serialports; i++) {
944 if (timer->serialport[i].num_active_buttons) {
946 if (event.type==TS5_EVENT_SERIALPORT_BUTTON_DOWN) {
948 if (event.user.data1 == i) {
949 resp = timer->serialport[i]
950 .button_press_active[
event.user.data2-1];
954 if (event.type==TS5_EVENT_SERIALPORT_BUTTON_UP) {
956 if (event.user.data1 == i) {
957 resp = timer->serialport[i]
958 .button_release_active[
event.user.data2-1];
962 if (resp && timing_error!=NULL) {
963 *timing_error = ((double)event.user.data3)/1000000.0;
987 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_response(%p,%p)\n",
988 resptime, timing_error);
1016 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_response_timed(%p,%p,%f)\n",
1017 resptime, timing_error, maxtime);
1020 ts5_fatal(
"ts5_wait_for_response_timed: maxtime is negative (%f)\n",
1024 int resp=0, deadline=0;
1025 double starttime = al_get_time();
1027 while (!resp && !deadline) {
1031 if (al_get_time()-starttime>=maxtime) {
1056 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_response_until(%p,%p,%f)\n",
1057 resptime, timing_error, deadline);
1059 if (deadline<al_get_time()) {
1060 ts5_fatal(
"%s: %s (%f)\n",
"ts5_wait_for_response_until",
1061 "response deadline is in the past",
1062 deadline-al_get_time());
1065 int resp=0, maxtime=0;
1067 while (!resp && !maxtime) {
1071 if (al_get_time()>=deadline) {
1124 ts5_log(TS5_LOGLEVEL_5,
"ts5_flush_triggers()\n");
1126 al_flush_event_queue(_ts5_data.timer.trigger_queue);
1144 ts5_log(TS5_LOGLEVEL_6,
"ts5_check_trigger(%p,%p)\n",
1145 trigtime, timing_error);
1148 ALLEGRO_EVENT event;
1150 TS5_TIMER_STATUS *timer = &_ts5_status.timer;
1152 if (trigtime!=NULL) {
1153 *trigtime = al_get_time();
1155 if (timing_error!=NULL) {
1156 *timing_error = 0.0;
1159 if (al_get_next_event(_ts5_data.timer.trigger_queue, &event)) {
1161 if(timer->cedrusbox_is_trigger_device) {
1164 for (i=0; i<timer->num_cedrusboxes; i++) {
1166 if (timer->cedrusbox[i].is_trigger_input_device) {
1168 if (event.type==TS5_EVENT_CEDRUSBOX_TRIGGER
1169 && event.user.data1 == i) {
1171 if (trigtime!=NULL) {
1172 *trigtime =
event.any.timestamp;
1175 if (timing_error!=NULL) {
1177 ((double)event.user.data3)/1000000.0;
1180 trigger =
event.user.data2;
1186 if(timer->parport_is_trigger_device) {
1189 for (i=0; i<timer->num_parports; i++) {
1191 if (timer->parport[i].is_trigger_input_device) {
1193 if (event.type==TS5_EVENT_PARPORT_TRIGGER
1194 && event.user.data1 == i) {
1196 if (trigtime!=NULL) {
1197 *trigtime =
event.any.timestamp;
1200 if (timing_error!=NULL) {
1202 ((double)event.user.data3)/1000000.0;
1205 trigger =
event.user.data2;
1211 if(timer->serialport_is_trigger_device) {
1214 for (i=0; i<timer->num_serialports; i++) {
1216 if (timer->serialport[i].is_trigger_input_device) {
1218 if (event.type==TS5_EVENT_SERIALPORT_TRIGGER
1219 && event.user.data1 == i) {
1221 if (trigtime!=NULL) {
1222 *trigtime =
event.any.timestamp;
1225 if (timing_error!=NULL) {
1227 ((double)event.user.data3)/1000000.0;
1230 trigger =
event.user.data2;
1254 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_trigger(%p,%p)\n",
1255 trigtime, timing_error);
1284 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_trigger_timed(%p,%p,%f)\n",
1285 trigtime, timing_error, maxtime);
1288 ts5_fatal(
"ts5_wait_for_trigger_timed: maxtime is negative (%f)\n",
1292 int trigger=0, deadline=0;
1293 double starttime = al_get_time();
1295 while (!trigger && !deadline) {
1299 if (al_get_time()-starttime>=maxtime) {
1324 ts5_log(TS5_LOGLEVEL_5,
"ts5_wait_for_trigger_until(%p,%p,%f)\n",
1325 trigtime, timing_error, deadline);
1327 if (deadline<al_get_time()) {
1328 ts5_fatal(
"%s: %s (%f)\n",
"ts5_wait_for_trigger_until",
1329 "trigger deadline is in the past",
1330 deadline-al_get_time());
1333 int trigger=0, maxtime=0;
1335 while (!trigger && !maxtime) {
1339 if (al_get_time()>=deadline) {
1357 ts5_log(TS5_LOGLEVEL_5,
"ts5_write_all_triggers(%s)\n", filename);
1360 fp = fopen(filename,
"a+");
1362 ts5_fatal(
"ts5_write_all_triggers: could not open output file %s\n",
1366 ALLEGRO_EVENT event;
1368 while (al_get_next_event(_ts5_data.timer.trigger_log, &event)) {
1370 fprintf(fp,
"%10.8f ", event.any.timestamp);
1372 double timing_error = ((double)event.user.data3)/1000000.0;
1373 fprintf(fp,
"%10.8f ", timing_error);
1375 if (event.type==TS5_EVENT_PARPORT_TRIGGER) {
1376 fprintf(fp,
"PARPORT ");
1378 else if (event.type==TS5_EVENT_SERIALPORT_TRIGGER) {
1379 fprintf(fp,
"SERIALPORT ");
1381 else if (event.type==TS5_EVENT_CEDRUSBOX_TRIGGER) {
1382 fprintf(fp,
"CEDRUSBOX ");
1385 fprintf(fp,
"UNKNOWN ");
1388 fprintf(fp,
"%d ", (
int)event.user.data1+1);
1389 fprintf(fp,
"%d ", (
int)event.user.data2);
void ts5_wait_until(double deadline)
Wait until a deadline.
int ts5_wait_for_response(double *resptime, double *timing_error)
Wait for a response.
void ts5_flush_responses()
Flush the response queue.
void ts5_flush_triggers()
Flush the trigger queue.
void ts5_wait(double waittime)
Wait for a number of seconds.
int ts5_get_priority()
Get the program's priority.
int ts5_wait_for_trigger_until(double *trigtime, double *timing_error, double deadline)
Wait for a trigger until a deadline.
void ts5_check_timer3(char *calling_function)
Do some checks at the start of each timer function.
void ts5_realtime_clock_nap()
Give up processor time to allow other processes to run.
void ts5_remove_response_buttons()
Completely removes the response button definition.
void ts5_check_timer4(char *calling_function)
Do some checks at the start of each timer function.
void ts5_log(const unsigned int level, const char *format,...)
Send info to a logging window.
int ts5_hide_response_button(int button)
Temporarily deactivates a response button.
void ts5_check_timer2(char *calling_function)
Do some checks at the start of each timer function.
int ts5_check_trigger(double *trigtime, double *timing_error)
Check for a trigger.
int ts5_wait_for_trigger(double *trigtime, double *timing_error)
Wait for a trigger.
int ts5_wait_for_response_until(double *resptime, double *timing_error, double deadline)
Wait for a response until a deadline.
int ts5_check_response(double *resptime, double *timing_error)
Check for a reponse.
void ts5_fatal(const char *format,...)
Exit safely with an error message.
int ts5_wait_for_response_timed(double *resptime, double *timing_error, double maxtime)
Wait for a response for a given time.
int ts5_wait_for_trigger_timed(double *trigtime, double *timing_error, double maxtime)
Wait for a trigger for a given time.
void ts5_write_all_triggers(char *filename)
Write all triggers to an output file.
int ts5_set_priority(int priority)
Set the program's priority.
double ts5_get_time()
Get the number of seconds since the program started.
void ts5_check_timer(char *calling_function)
Do some checks at the start of each timer function.