15 #include "../include/tscope5/cedrusbox.h"
16 #include "../include/tscope5/cedrusbox_internal.h"
17 #include "../include/tscope5/system_internal.h"
18 #include "../include/tscope5/timer_internal.h"
43 ts5_log(TS5_LOGLEVEL_6,
"%s: ts5_check_cedrusbox\n", calling_function);
67 ts5_log(TS5_LOGLEVEL_1,
"%s: Installing Tscope5 cedrusbox\n",
71 goto cedrusbox_is_installed;
76 int num_serial_devices=0;
88 int device_type[TS5_CEDRUSBOX_MAXPORT];
90 for (i=0; i<num_serial_devices; i++) {
92 char serial_buff[TS5_MAX_CHAR];
104 device_type[i] = serial_buff[0] - 47;
106 if (device_type[i]==3) {
110 device_type[i] += serial_buff[0] - 49;
113 switch (device_type[i]) {
115 case TS5_CEDRUSBOX_LUMINA:
116 sprintf(serial_buff,
"lumina");
119 case TS5_CEDRUSBOX_SV1:
120 sprintf(serial_buff,
"sv1");
123 case TS5_CEDRUSBOX_RB530:
124 sprintf(serial_buff,
"rb530");
127 case TS5_CEDRUSBOX_RB730:
128 sprintf(serial_buff,
"rb730");
131 case TS5_CEDRUSBOX_RB830:
132 sprintf(serial_buff,
"rb830");
135 case TS5_CEDRUSBOX_RB834:
136 sprintf(serial_buff,
"rb834");
141 device_type[i] = TS5_CEDRUSBOX_NODEVICE;
144 if (!CloseHandle(_ts5_cedrusbox_handle[i])) {
145 ts5_log(TS5_LOGLEVEL_1,
"%s: %s\n", calling_function,
146 "could not remove unknown device");
150 tcdrain(_ts5_cedrusbox_fd[i]);
151 tcsetattr(_ts5_cedrusbox_fd[i], TCSANOW,
152 &_ts5_cedrusbox_oldoptions[i]);
154 if (close(_ts5_cedrusbox_fd[i]) == -1) {
155 ts5_log(TS5_LOGLEVEL_1,
"%s: %s\n", calling_function,
156 "could not remove unknown device");
163 ts5_log(TS5_LOGLEVEL_1,
"%s: cedrusbox ID %d (%s)\n",
164 calling_function, device_type[i], serial_buff);
171 major = serial_buff[0];
176 minor = serial_buff[0];
177 ts5_log(TS5_LOGLEVEL_1,
"%s: cedrusbox firmware revision: %c.%c\n",
178 calling_function, major, minor);
189 _ts5_status.timer.num_cedrusboxes++;
193 if (!_ts5_status.timer.num_cedrusboxes) {
194 ts5_fatal(
"%s: could not install Tscope5 cedrusboxes\n",
199 al_init_user_event_source(&_ts5_data.timer.cedrusbox_response_event_source);
202 al_register_event_source(_ts5_data.timer.response_queue,
203 &_ts5_data.timer.cedrusbox_response_event_source);
206 al_init_user_event_source(
207 &_ts5_data.timer.cedrusbox_trigger_event_source);
210 al_register_event_source(_ts5_data.timer.trigger_queue,
211 &_ts5_data.timer.cedrusbox_trigger_event_source);
214 al_register_event_source(_ts5_data.timer.trigger_log,
215 &_ts5_data.timer.cedrusbox_trigger_event_source);
218 _ts5_data.timer.cedrusbox_thread =
221 al_start_thread(_ts5_data.timer.cedrusbox_thread);
224 _ts5_status.timer.cedrusbox =
225 (TS5_CEDRUSBOX_STATUS *)
226 al_malloc(
sizeof(TS5_CEDRUSBOX_STATUS)
227 * _ts5_status.timer.num_cedrusboxes);
230 for (i=0; i<num_serial_devices; i++) {
232 if (device_type[i]==TS5_CEDRUSBOX_NODEVICE) {
236 _ts5_status.timer.cedrusbox[j].port_num = i;
237 _ts5_status.timer.cedrusbox[j].type = device_type[i];
239 switch (_ts5_status.timer.cedrusbox[j].type) {
241 case TS5_CEDRUSBOX_LUMINA:
242 _ts5_status.timer.cedrusbox[j].num_buttons = 4;
245 case TS5_CEDRUSBOX_SV1:
246 _ts5_status.timer.cedrusbox[j].num_buttons = 1;
249 case TS5_CEDRUSBOX_RB530:
250 _ts5_status.timer.cedrusbox[j].num_buttons = 5;
253 case TS5_CEDRUSBOX_RB730:
254 _ts5_status.timer.cedrusbox[j].num_buttons = 7;
257 case TS5_CEDRUSBOX_RB830:
258 _ts5_status.timer.cedrusbox[j].num_buttons = 8;
261 case TS5_CEDRUSBOX_RB834:
262 _ts5_status.timer.cedrusbox[j].num_buttons = 8;
266 ts5_fatal(
"%s: unknown cedrus device type\n", calling_function);
269 _ts5_status.timer.cedrusbox[j].num_defined_buttons = 0;
270 _ts5_status.timer.cedrusbox[j].num_active_buttons = 0;
272 _ts5_status.timer.cedrusbox[j].button_press_defined =
273 (
int *)al_malloc(
sizeof(
int)
274 * _ts5_status.timer.cedrusbox[j].num_buttons);
276 _ts5_status.timer.cedrusbox[j].button_press_active =
277 (
int *)al_malloc(
sizeof(
int)
278 * _ts5_status.timer.cedrusbox[j].num_buttons);
280 _ts5_status.timer.cedrusbox[j].button_release_defined =
281 (
int *)al_malloc(
sizeof(
int)
282 * _ts5_status.timer.cedrusbox[j].num_buttons);
284 _ts5_status.timer.cedrusbox[j].button_release_active =
285 (
int *)al_malloc(
sizeof(
int)
286 * _ts5_status.timer.cedrusbox[j].num_buttons);
289 for (k=0; k<_ts5_status.timer.cedrusbox[j].num_buttons; k++) {
290 _ts5_status.timer.cedrusbox[j].button_press_defined[k] = 0;
291 _ts5_status.timer.cedrusbox[j].button_press_active[k] = 0;
292 _ts5_status.timer.cedrusbox[j].button_release_defined[k] = 0;
293 _ts5_status.timer.cedrusbox[j].button_release_active[k] = 0;
296 _ts5_status.timer.cedrusbox[j].is_trigger_input_device = 0;
297 _ts5_status.timer.cedrusbox[j].simulate_trigger_input = 0;
298 _ts5_status.timer.cedrusbox[j].trigger_simulation_interval = 2.0;
299 _ts5_status.timer.cedrusbox[j].last_trigger_simulation = al_get_time();
305 cedrusbox_is_installed:
320 ts5_log(TS5_LOGLEVEL_1,
"Uninstalling Tscope5 cedrusbox\n");
325 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
330 al_join_thread(_ts5_data.timer.cedrusbox_thread, NULL);
331 al_destroy_thread(_ts5_data.timer.cedrusbox_thread);
334 al_unregister_event_source(_ts5_data.timer.response_queue,
335 &_ts5_data.timer.cedrusbox_response_event_source);
338 al_destroy_user_event_source(
339 &_ts5_data.timer.cedrusbox_response_event_source);
342 al_unregister_event_source(_ts5_data.timer.trigger_queue,
343 &_ts5_data.timer.cedrusbox_trigger_event_source);
345 al_unregister_event_source(_ts5_data.timer.trigger_log,
346 &_ts5_data.timer.cedrusbox_trigger_event_source);
349 al_destroy_user_event_source(
350 &_ts5_data.timer.cedrusbox_trigger_event_source);
362 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
365 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
367 al_free(_ts5_status.timer.cedrusbox[i].button_press_defined);
368 _ts5_status.timer.cedrusbox[i].button_press_defined = NULL;
370 al_free(_ts5_status.timer.cedrusbox[i].button_press_active);
371 _ts5_status.timer.cedrusbox[i].button_press_active = NULL;
373 al_free(_ts5_status.timer.cedrusbox[i].button_release_defined);
374 _ts5_status.timer.cedrusbox[i].button_release_defined = NULL;
376 al_free(_ts5_status.timer.cedrusbox[i].button_release_active);
377 _ts5_status.timer.cedrusbox[i].button_release_active = NULL;
380 al_free(_ts5_status.timer.cedrusbox);
381 _ts5_status.timer.cedrusbox=NULL;
382 _ts5_status.timer.num_cedrusboxes = 0;
383 _ts5_status.timer.cedrusbox_is_response_device = 0;
384 _ts5_status.timer.cedrusbox_is_trigger_device = 0;
404 unsigned long bytes_to_read)
406 ts5_log(TS5_LOGLEVEL_5,
"ts5_read_cedrusbox(%d,%s,%lu)\n",
407 port, buff, bytes_to_read);
435 unsigned long bytes_to_write)
437 ts5_log(TS5_LOGLEVEL_5,
"ts5_write_cedrusbox(%d,%s,%lu)\n",
438 port, buff, bytes_to_write);
463 ts5_log(TS5_LOGLEVEL_5,
"ts5_fflush_cedrusbox(%d)\n", port);
482 ALLEGRO_EVENT cedrusbox_event;
483 double previous_time;
484 double current_time = al_get_time();
487 while (!al_get_thread_should_stop(_ts5_data.timer.cedrusbox_thread)) {
489 char serial_buff[6] = {0};
492 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
494 unsigned int num_bytes =
502 if (num_bytes>0 && num_bytes<6 && _ts5_status.timer.cedrusbox[i].type == TS5_CEDRUSBOX_SV1) {
506 &serial_buff[num_bytes], 6-num_bytes);
516 if (num_bytes>0 && num_bytes<6 && _ts5_status.timer.cedrusbox[i].type == TS5_CEDRUSBOX_LUMINA) {
520 &serial_buff[num_bytes], 6-num_bytes);
526 if (serial_buff[0]==
'k' && serial_buff[1]==-80) {
527 serial_buff[0] =
'T';
528 serial_buff[1] =
'A';
533 if (serial_buff[0]==
'k' && serial_buff[1]==-96) {
539 if (num_bytes==6 && serial_buff[0]==
'k') {
542 int action = ((
unsigned char)(serial_buff[1]) & 16) >> 4;
545 cedrusbox_event.user.type = TS5_EVENT_CEDRUSBOX_BUTTON_UP;
549 cedrusbox_event.user.type = TS5_EVENT_CEDRUSBOX_BUTTON_DOWN;
553 cedrusbox_event.user.data1 = i;
556 cedrusbox_event.user.data2 =
557 ((
unsigned char)serial_buff[1] >> 5) - 1;
560 cedrusbox_event.user.data3 =
561 (intptr_t)((current_time-previous_time)*1000000.0);
564 intptr_t cedrus_time = 0;
566 cedrus_time += (
unsigned char)(serial_buff[2]);
567 cedrus_time += (
unsigned char)(serial_buff[3]) * (256);
568 cedrus_time += (
unsigned char)(serial_buff[4]) * (256*256);
569 cedrus_time += (
unsigned char)(serial_buff[5]) * (256*256*256);
571 cedrusbox_event.user.data4 = cedrus_time;
574 &_ts5_data.timer.cedrusbox_response_event_source,
575 &cedrusbox_event, NULL);
579 if (!strcmp(serial_buff,
"TA")) {
581 cedrusbox_event.user.type = TS5_EVENT_CEDRUSBOX_TRIGGER;
584 cedrusbox_event.user.data1 = i;
587 cedrusbox_event.user.data2 = serial_buff[0];
590 cedrusbox_event.user.data3 =
591 (intptr_t)((current_time-previous_time)*1000000.0);
594 &_ts5_data.timer.cedrusbox_trigger_event_source,
595 &cedrusbox_event, NULL);
599 if (_ts5_status.timer.cedrusbox[i].simulate_trigger_input) {
601 if (current_time - _ts5_status.timer.cedrusbox[i]
602 .last_trigger_simulation
603 >= _ts5_status.timer.cedrusbox[i]
604 .trigger_simulation_interval) {
606 cedrusbox_event.user.type = TS5_EVENT_CEDRUSBOX_TRIGGER;
608 cedrusbox_event.user.data1 = i;
610 cedrusbox_event.user.data2 =
'T';
612 cedrusbox_event.user.data3 =
613 (intptr_t)((current_time-previous_time)*1000000.0);
616 &_ts5_data.timer.cedrusbox_trigger_event_source,
617 &cedrusbox_event, NULL);
619 _ts5_status.timer.cedrusbox[i].last_trigger_simulation =
624 previous_time = current_time;
625 current_time = al_get_time();
int _ts5_is_cedrusbox_installed
Is the cedrusbox subsystem installed?
int ts5_install_cedrusbox_posix(char *calling_function)
Posix-specific (Mac OS X, Linux) cedrusbox function.
void ts5_fflush_cedrusbox_windows(int port)
Windows-specific cedrusbox function.
void ts5_uninstall_cedrusbox()
Uninstall the cedrusbox subsystem.
Definitions of Windows-specific cedrusbox functions.
void ts5_wait(double waittime)
Wait for a number of seconds.
int _ts5_is_timer_installed
Is the timer subsystem installed?
Definitions of Posix-specific (Mac OS X, Linux) cedrusbox functions.
void ts5_install_cedrusbox(char *calling_function)
Install the cedrusbox subsystem.
unsigned int ts5_read_cedrusbox(int port, char *buff, unsigned long bytes_to_read)
Read text from a cedrusbox.
void ts5_uninstall_cedrusbox_posix()
Posix-specific (Mac OS X, Linux) cedrusbox function.
int ts5_install_cedrusbox_windows(char *calling_function)
Windows-specific cedrusbox function.
void ts5_fflush_cedrusbox(int port)
Flush the output of a cedrusbox.
unsigned int ts5_write_cedrusbox_windows(int port, char *buff, unsigned long bytes_to_write)
Windows-specific cedrusbox function.
void ts5_install_timer(char *calling_function)
Install the timer subsystem.
void ts5_log(const unsigned int level, const char *format,...)
Send info to a logging window.
void * ts5_cedrusbox_threadfunc()
Cedrusbox thread function.
unsigned int ts5_read_cedrusbox_posix(int port, char *buff, unsigned long bytes_to_read)
Posix-specific (Mac OS X, Linux) cedrusbox function.
void ts5_fflush_cedrusbox_posix(int port)
Posix-specific (Mac OS X, Linux) cedrusbox function.
unsigned int ts5_write_cedrusbox(int port, char *buff, unsigned long bytes_to_write)
Write text to a cedrusbox.
void ts5_uninstall_cedrusbox_windows()
Windows-specific cedrusbox function.
void ts5_check_cedrusbox(char *calling_function)
Do some checks at the start of each cedrusbox function.
unsigned int ts5_read_cedrusbox_windows(int port, char *buff, unsigned long bytes_to_read)
Windows-specific cedrusbox function.
void ts5_fatal(const char *format,...)
Exit safely with an error message.
unsigned int ts5_write_cedrusbox_posix(int port, char *buff, unsigned long bytes_to_write)
Posix-specific (Mac OS X, Linux) cedrusbox function.