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:
319 goto cedrusbox_is_uninstalled;
322 ts5_log(TS5_LOGLEVEL_1,
"Uninstalling Tscope5 cedrusbox\n");
327 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
332 al_join_thread(_ts5_data.timer.cedrusbox_thread, NULL);
333 al_destroy_thread(_ts5_data.timer.cedrusbox_thread);
336 al_unregister_event_source(_ts5_data.timer.response_queue,
337 &_ts5_data.timer.cedrusbox_response_event_source);
340 al_destroy_user_event_source(
341 &_ts5_data.timer.cedrusbox_response_event_source);
344 al_unregister_event_source(_ts5_data.timer.trigger_queue,
345 &_ts5_data.timer.cedrusbox_trigger_event_source);
347 al_unregister_event_source(_ts5_data.timer.trigger_log,
348 &_ts5_data.timer.cedrusbox_trigger_event_source);
351 al_destroy_user_event_source(
352 &_ts5_data.timer.cedrusbox_trigger_event_source);
364 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
367 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
369 al_free(_ts5_status.timer.cedrusbox[i].button_press_defined);
370 _ts5_status.timer.cedrusbox[i].button_press_defined = NULL;
372 al_free(_ts5_status.timer.cedrusbox[i].button_press_active);
373 _ts5_status.timer.cedrusbox[i].button_press_active = NULL;
375 al_free(_ts5_status.timer.cedrusbox[i].button_release_defined);
376 _ts5_status.timer.cedrusbox[i].button_release_defined = NULL;
378 al_free(_ts5_status.timer.cedrusbox[i].button_release_active);
379 _ts5_status.timer.cedrusbox[i].button_release_active = NULL;
382 al_free(_ts5_status.timer.cedrusbox);
383 _ts5_status.timer.cedrusbox=NULL;
384 _ts5_status.timer.num_cedrusboxes = 0;
385 _ts5_status.timer.cedrusbox_is_response_device = 0;
390 cedrusbox_is_uninstalled:
407 unsigned long bytes_to_read)
409 ts5_log(TS5_LOGLEVEL_5,
"ts5_read_cedrusbox(%d,%s,%lu)\n",
410 port, buff, bytes_to_read);
438 unsigned long bytes_to_write)
440 ts5_log(TS5_LOGLEVEL_5,
"ts5_write_cedrusbox(%d,%s,%lu)\n",
441 port, buff, bytes_to_write);
466 ts5_log(TS5_LOGLEVEL_5,
"ts5_fflush_cedrusbox(%d)\n", port);
485 ALLEGRO_EVENT cedrusbox_event;
486 double previous_time;
487 double current_time = al_get_time();
490 while (!al_get_thread_should_stop(_ts5_data.timer.cedrusbox_thread)) {
492 char serial_buff[6] = {0};
495 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
497 unsigned int num_bytes =
505 if (num_bytes>0 && num_bytes<6 && _ts5_status.timer.cedrusbox[i].type == TS5_CEDRUSBOX_SV1) {
509 &serial_buff[num_bytes], 6-num_bytes);
519 if (num_bytes>0 && num_bytes<6 && _ts5_status.timer.cedrusbox[i].type == TS5_CEDRUSBOX_LUMINA) {
523 &serial_buff[num_bytes], 6-num_bytes);
529 if (serial_buff[0]==
'k' && serial_buff[1]==-80) {
530 serial_buff[0] =
'T';
531 serial_buff[1] =
'A';
536 if (serial_buff[0]==
'k' && serial_buff[1]==-96) {
542 if (num_bytes==6 && serial_buff[0]==
'k') {
545 int action = ((
unsigned char)(serial_buff[1]) & 16) >> 4;
548 cedrusbox_event.user.type = TS5_EVENT_CEDRUSBOX_BUTTON_UP;
552 cedrusbox_event.user.type = TS5_EVENT_CEDRUSBOX_BUTTON_DOWN;
556 cedrusbox_event.user.data1 = i;
559 cedrusbox_event.user.data2 =
560 ((
unsigned char)serial_buff[1] >> 5) - 1;
563 cedrusbox_event.user.data3 =
564 (intptr_t)((current_time-previous_time)*1000000.0);
567 intptr_t cedrus_time = 0;
569 cedrus_time += (
unsigned char)(serial_buff[2]);
570 cedrus_time += (
unsigned char)(serial_buff[3]) * (256);
571 cedrus_time += (
unsigned char)(serial_buff[4]) * (256*256);
572 cedrus_time += (
unsigned char)(serial_buff[5]) * (256*256*256);
574 cedrusbox_event.user.data4 = cedrus_time;
577 &_ts5_data.timer.cedrusbox_response_event_source,
578 &cedrusbox_event, NULL);
582 if (!strcmp(serial_buff,
"TA")) {
584 cedrusbox_event.user.type = TS5_EVENT_CEDRUSBOX_TRIGGER;
587 cedrusbox_event.user.data1 = i;
590 cedrusbox_event.user.data2 = serial_buff[0];
593 cedrusbox_event.user.data3 =
594 (intptr_t)((current_time-previous_time)*1000000.0);
597 &_ts5_data.timer.cedrusbox_trigger_event_source,
598 &cedrusbox_event, NULL);
602 if (_ts5_status.timer.cedrusbox[i].simulate_trigger_input) {
604 if (current_time - _ts5_status.timer.cedrusbox[i]
605 .last_trigger_simulation
606 >= _ts5_status.timer.cedrusbox[i]
607 .trigger_simulation_interval) {
609 cedrusbox_event.user.type = TS5_EVENT_CEDRUSBOX_TRIGGER;
611 cedrusbox_event.user.data1 = i;
613 cedrusbox_event.user.data2 =
'T';
615 cedrusbox_event.user.data3 =
616 (intptr_t)((current_time-previous_time)*1000000.0);
619 &_ts5_data.timer.cedrusbox_trigger_event_source,
620 &cedrusbox_event, NULL);
622 _ts5_status.timer.cedrusbox[i].last_trigger_simulation =
627 previous_time = current_time;
628 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.