14 #include "../include/tscope5/cedrusbox.h"
15 #include "../include/tscope5/cedrusbox_internal.h"
16 #include "../include/tscope5/system_internal.h"
17 #include "../include/tscope5/timer_internal.h"
42 ts5_log(TS5_LOGLEVEL_6,
"%s: ts5_check_cedrusbox\n", calling_function);
66 ts5_log(TS5_LOGLEVEL_1,
"%s: Installing Tscope5 cedrusbox\n",
70 goto cedrusbox_is_installed;
75 int num_serial_devices=0;
87 int device_type[TS5_CEDRUSBOX_MAXPORT];
89 for (i=0; i<num_serial_devices; i++) {
91 char serial_buff[TS5_MAX_CHAR];
103 device_type[i] = serial_buff[0] - 47;
105 if (device_type[i]==3) {
109 device_type[i] += serial_buff[0] - 49;
112 switch (device_type[i]) {
114 case TS5_CEDRUSBOX_LUMINA:
115 sprintf(serial_buff,
"lumina");
118 case TS5_CEDRUSBOX_SV1:
119 sprintf(serial_buff,
"sv1");
122 case TS5_CEDRUSBOX_RB530:
123 sprintf(serial_buff,
"rb530");
126 case TS5_CEDRUSBOX_RB730:
127 sprintf(serial_buff,
"rb730");
130 case TS5_CEDRUSBOX_RB830:
131 sprintf(serial_buff,
"rb830");
134 case TS5_CEDRUSBOX_RB834:
135 sprintf(serial_buff,
"rb834");
140 device_type[i] = TS5_CEDRUSBOX_NODEVICE;
143 if (!CloseHandle(_ts5_cedrusbox_handle[i])) {
144 ts5_log(TS5_LOGLEVEL_1,
"%s: %s\n", calling_function,
145 "could not remove unknown device");
149 tcdrain(_ts5_cedrusbox_fd[i]);
150 tcsetattr(_ts5_cedrusbox_fd[i], TCSANOW,
151 &_ts5_cedrusbox_oldoptions[i]);
153 if (close(_ts5_cedrusbox_fd[i]) == -1) {
154 ts5_log(TS5_LOGLEVEL_1,
"%s: %s\n", calling_function,
155 "could not remove unknown device");
162 ts5_log(TS5_LOGLEVEL_1,
"%s: cedrusbox ID %d (%s)\n",
163 calling_function, device_type[i], serial_buff);
170 major = serial_buff[0];
175 minor = serial_buff[0];
176 ts5_log(TS5_LOGLEVEL_1,
"%s: cedrusbox firmware revision: %c.%c\n",
177 calling_function, major, minor);
184 _ts5_status.timer.num_cedrusboxes++;
188 if (!_ts5_status.timer.num_cedrusboxes) {
189 ts5_fatal(
"%s: could not install Tscope5 cedrusboxes\n",
194 al_init_user_event_source(&_ts5_data.timer.cedrusbox_response_event_source);
197 al_register_event_source(_ts5_data.timer.response_queue,
198 &_ts5_data.timer.cedrusbox_response_event_source);
201 _ts5_data.timer.cedrusbox_thread =
204 al_start_thread(_ts5_data.timer.cedrusbox_thread);
205 _ts5_data.timer.cedrusbox_thread_is_paused = 0;
208 _ts5_status.timer.cedrusbox =
209 (TS5_CEDRUSBOX_STATUS *)
210 al_malloc(
sizeof(TS5_CEDRUSBOX_STATUS)
211 * _ts5_status.timer.num_cedrusboxes);
214 for (i=0; i<num_serial_devices; i++) {
216 if (device_type[i]==TS5_CEDRUSBOX_NODEVICE) {
220 _ts5_status.timer.cedrusbox[j].port_num = i;
221 _ts5_status.timer.cedrusbox[j].type = device_type[i];
223 switch (_ts5_status.timer.cedrusbox[j].type) {
225 case TS5_CEDRUSBOX_LUMINA:
226 _ts5_status.timer.cedrusbox[j].num_buttons = 4;
229 case TS5_CEDRUSBOX_SV1:
230 _ts5_status.timer.cedrusbox[j].num_buttons = 1;
233 case TS5_CEDRUSBOX_RB530:
234 _ts5_status.timer.cedrusbox[j].num_buttons = 5;
237 case TS5_CEDRUSBOX_RB730:
238 _ts5_status.timer.cedrusbox[j].num_buttons = 7;
241 case TS5_CEDRUSBOX_RB830:
242 _ts5_status.timer.cedrusbox[j].num_buttons = 8;
245 case TS5_CEDRUSBOX_RB834:
246 _ts5_status.timer.cedrusbox[j].num_buttons = 8;
250 ts5_fatal(
"%s: unknown cedrus device type\n", calling_function);
253 _ts5_status.timer.cedrusbox[j].num_defined_buttons = 0;
254 _ts5_status.timer.cedrusbox[j].num_active_buttons = 0;
256 _ts5_status.timer.cedrusbox[j].button_press_defined =
257 (
int *)al_malloc(
sizeof(
int)
258 * _ts5_status.timer.cedrusbox[j].num_buttons);
260 _ts5_status.timer.cedrusbox[j].button_press_active =
261 (
int *)al_malloc(
sizeof(
int)
262 * _ts5_status.timer.cedrusbox[j].num_buttons);
264 _ts5_status.timer.cedrusbox[j].button_release_defined =
265 (
int *)al_malloc(
sizeof(
int)
266 * _ts5_status.timer.cedrusbox[j].num_buttons);
268 _ts5_status.timer.cedrusbox[j].button_release_active =
269 (
int *)al_malloc(
sizeof(
int)
270 * _ts5_status.timer.cedrusbox[j].num_buttons);
273 for (k=0; k<_ts5_status.timer.cedrusbox[j].num_buttons; k++) {
274 _ts5_status.timer.cedrusbox[j].button_press_defined[k] = 0;
275 _ts5_status.timer.cedrusbox[j].button_press_active[k] = 0;
276 _ts5_status.timer.cedrusbox[j].button_release_defined[k] = 0;
277 _ts5_status.timer.cedrusbox[j].button_release_active[k] = 0;
283 cedrusbox_is_installed:
297 goto cedrusbox_is_uninstalled;
300 ts5_log(TS5_LOGLEVEL_1,
"Uninstalling Tscope5 cedrusbox\n");
305 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
309 if (_ts5_status.timer.cedrusbox[i].type==TS5_CEDRUSBOX_SV1) {
312 TS5_CEDRUSBOX_LOCKINGLEVEL, TS5_CEDRUSBOX_LOCK);
323 TS5_CEDRUSBOX_LOCKINGLEVEL, TS5_CEDRUSBOX_UNLOCK);
329 al_join_thread(_ts5_data.timer.cedrusbox_thread, NULL);
330 al_destroy_thread(_ts5_data.timer.cedrusbox_thread);
333 al_unregister_event_source(_ts5_data.timer.response_queue,
334 &_ts5_data.timer.cedrusbox_response_event_source);
337 al_destroy_user_event_source(
338 &_ts5_data.timer.cedrusbox_response_event_source);
350 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
353 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
355 al_free(_ts5_status.timer.cedrusbox[i].button_press_defined);
356 _ts5_status.timer.cedrusbox[i].button_press_defined = NULL;
358 al_free(_ts5_status.timer.cedrusbox[i].button_press_active);
359 _ts5_status.timer.cedrusbox[i].button_press_active = NULL;
361 al_free(_ts5_status.timer.cedrusbox[i].button_release_defined);
362 _ts5_status.timer.cedrusbox[i].button_release_defined = NULL;
364 al_free(_ts5_status.timer.cedrusbox[i].button_release_active);
365 _ts5_status.timer.cedrusbox[i].button_release_active = NULL;
368 al_free(_ts5_status.timer.cedrusbox);
369 _ts5_status.timer.cedrusbox=NULL;
370 _ts5_status.timer.num_cedrusboxes = 0;
371 _ts5_status.timer.cedrusbox_is_response_device = 0;
376 cedrusbox_is_uninstalled:
393 unsigned long bytes_to_read)
395 ts5_log(TS5_LOGLEVEL_5,
"ts5_read_cedrusbox(%d,%s,%lu)\n",
396 port, buff, bytes_to_read);
424 unsigned long bytes_to_write)
426 ts5_log(TS5_LOGLEVEL_5,
"ts5_write_cedrusbox(%d,%s,%lu)\n",
427 port, buff, bytes_to_write);
452 ts5_log(TS5_LOGLEVEL_5,
"ts5_fflush_cedrusbox(%d)\n", port);
471 ALLEGRO_EVENT cedrusbox_event;
472 double looptime = al_get_time();
475 while (!al_get_thread_should_stop(_ts5_data.timer.cedrusbox_thread)) {
479 char serial_buff[6] = {0};
482 for (i=0; i<_ts5_status.timer.num_cedrusboxes; i++) {
484 unsigned int num_bytes =
488 if (num_bytes==6 && serial_buff[0]==
'k') {
490 int action = ((
unsigned char)(serial_buff[1]) & 16) >> 4;
493 cedrusbox_event.user.type = TS5_EVENT_CEDRUS_BUTTON_UP;
497 cedrusbox_event.user.type = TS5_EVENT_CEDRUS_BUTTON_DOWN;
500 cedrusbox_event.user.data1 = i;
502 cedrusbox_event.user.data2 =
503 ((
unsigned char)serial_buff[1] >> 5) - 1;
505 cedrusbox_event.user.data3 =
506 (intptr_t)((now-looptime)*1000000.0);
509 &_ts5_data.timer.cedrusbox_response_event_source,
510 &cedrusbox_event, NULL);