18 #include "../include/tscope5/parport.h"
19 #include "../include/tscope5/timer.h"
20 #include "../include/tscope5/parport_internal.h"
21 #include "../include/tscope5/system_internal.h"
26 typedef short (_stdcall *inbptr)(
short portaddr);
27 typedef short (_stdcall *outbptr)(
short portaddr,
short value);
31 #elif defined TS5_LINUX
60 ts5_log(TS5_LOGLEVEL_3,
"ts5_define_parport_button(%d,%d)\n", device, button);
62 if (device<1 || device>_ts5_status.timer.num_parports) {
63 ts5_fatal(
"%s: %s %d %s %d\n",
"ts5_define_parport_button",
64 "device argument is", device,
65 "number of parallel ports is",
66 _ts5_status.timer.num_parports);
69 if (_ts5_status.timer.parport[device-1].is_trigger_input_device) {
70 ts5_fatal(
"%s: %s %d %s\n",
"ts5_define_parport_button",
71 "parallel port", device,
72 "is already defined as a trigger input device");
75 if (_ts5_status.timer.parport[device-1].is_trigger_output_device) {
76 ts5_fatal(
"%s: %s %d %s\n",
"ts5_define_parport_button",
77 "parallel port", device,
78 "is already defined as a trigger output device");
82 ts5_fatal(
"%s: %s\n",
"ts5_define_parport_button",
83 "button argument is 0, response buttons are numbered from 1");
86 if (abs(button)>_ts5_status.timer.parport[device-1].num_buttons) {
87 ts5_fatal(
"%s: %s %d, %s %d is %d\n",
"ts5_define_parport_button",
88 "button argument is", button,
89 "number of parport buttons for device", device,
90 _ts5_status.timer.parport[device-1].num_buttons);
93 if (button>0 && _ts5_status.timer.parport[device-1]
94 .button_press_defined[button-1]!=0) {
95 ts5_fatal(
"%s: %s %d %s\n",
"ts5_define_parport_button",
96 "button press", button,
"is already defined");
99 if (button<0 && _ts5_status.timer.parport[device-1]
100 .button_release_defined[-button-1]!=0) {
101 ts5_fatal(
"%s: %s %d %s\n",
"ts5_define_parport_button",
102 "button release", button,
"is already defined");
105 _ts5_status.timer.parport_is_response_device = 1;
106 _ts5_status.timer.num_defined_buttons++;
107 _ts5_status.timer.num_active_buttons++;
108 _ts5_status.timer.parport[device-1].num_defined_buttons++;
109 _ts5_status.timer.parport[device-1].num_active_buttons++;
112 _ts5_status.timer.parport[device-1]
113 .button_press_defined[button-1] =
114 _ts5_status.timer.num_defined_buttons;
116 _ts5_status.timer.parport[device-1]
117 .button_press_active[button-1] =
118 _ts5_status.timer.num_defined_buttons;
121 _ts5_status.timer.parport[device-1]
122 .button_release_defined[-button-1] =
123 _ts5_status.timer.num_defined_buttons;
125 _ts5_status.timer.parport[device-1]
126 .button_release_active[-button-1] =
127 _ts5_status.timer.num_defined_buttons;
130 return _ts5_status.timer.num_defined_buttons;
144 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_num_parport_buttons(%d)\n", device);
146 return _ts5_status.timer.parport[device-1].num_buttons;
175 double button_debounce_time)
178 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_parport_button_debounce_time(%d,%f)\n",
179 device, button_debounce_time);
181 if (device<1 || device>_ts5_status.timer.num_parports) {
182 ts5_fatal(
"%s: %s %d %s %d\n",
"ts5_set_parport_button_debounce_time",
183 "device argument is", device,
184 "number of parallel ports is",
185 _ts5_status.timer.num_parports);
188 if (button_debounce_time < 0.0) {
189 ts5_fatal(
"%s: %s (is %f)\n",
"ts5_set_parport_button_debounce_time",
190 "debounce time should be positive", button_debounce_time);
194 _ts5_status.timer.parport[device-1].button_debounce_time;
196 _ts5_status.timer.parport[device-1].button_debounce_time =
197 button_debounce_time;
199 ts5_log(TS5_LOGLEVEL_4,
"%s: %s %d to %f (was %f)\n",
200 "ts5_set_parport_button_debounce_time",
201 "set debounce time of device",
203 _ts5_status.timer.parport[device-1].button_debounce_time,
220 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_parport_button_debounce_time(%d)\n",
223 if (device<1 || device>_ts5_status.timer.num_parports) {
224 ts5_fatal(
"%s: %s %d %s %d\n",
"ts5_get_parport_button_debounce_time",
225 "device argument is", device,
226 "number of parallel ports is",
227 _ts5_status.timer.num_parports);
231 return _ts5_status.timer.parport[device-1].button_debounce_time;
256 ts5_log(TS5_LOGLEVEL_3,
"ts5_define_parport_trigger_input(%d)\n", device);
258 if (device<1 || device>_ts5_status.timer.num_parports) {
259 ts5_fatal(
"%s: %s %d %s %d\n",
"ts5_define_parport_trigger_input",
260 "device argument is", device,
261 "number of parallel ports is",
262 _ts5_status.timer.num_parports);
281 ts5_log(TS5_LOGLEVEL_3,
"ts5_simulate_parport_trigger_input(%d,%d,%f)\n",
282 device, value, interval);
284 if (device<1 || device>_ts5_status.timer.num_parports) {
285 ts5_fatal(
"%s: %s %d %s %d\n",
"ts5_simulate_parport_trigger_input",
286 "device argument is", device,
287 "number of parallel ports is",
288 _ts5_status.timer.num_parports);
291 _ts5_status.timer.parport[device-1].simulate_trigger_input =
294 _ts5_status.timer.parport[device-1].trigger_simulation_interval =
310 double trigger_debounce_time)
313 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_parport_trigger_debounce_time(%d,%f)\n",
314 device, trigger_debounce_time);
316 if (device<1 || device>_ts5_status.timer.num_parports) {
317 ts5_fatal(
"%s: %s %d %s %d\n",
"ts5_set_parport_trigger_debounce_time",
318 "device argument is", device,
319 "number of parallel ports is",
320 _ts5_status.timer.num_parports);
323 if (trigger_debounce_time < 0.0) {
324 ts5_fatal(
"%s: %s (is %f)\n",
"ts5_set_parport_trigger_debounce_time",
325 "debounce time should be positive", trigger_debounce_time);
328 double retval = _ts5_status.timer.parport[device-1]
329 .trigger_debounce_time;
331 _ts5_status.timer.parport[device-1].trigger_debounce_time =
332 trigger_debounce_time;
334 ts5_log(TS5_LOGLEVEL_4,
"%s: %s %d to %f (was %f)\n",
335 "ts5_set_parport_trigger_debounce_time",
336 "set debounce time of device",
337 device, _ts5_status.timer.parport[device-1]
338 .trigger_debounce_time, retval);
354 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_parport_trigger_debounce_time(%d)\n",
357 if (device<1 || device>_ts5_status.timer.num_parports) {
358 ts5_fatal(
"%s: %s %d %s %d\n",
"ts5_get_parport_trigger_debounce_time",
359 "device argument is", device,
360 "number of parallel ports is",
361 _ts5_status.timer.num_parports);
364 return _ts5_status.timer.parport[device-1].trigger_debounce_time;
377 ts5_log(TS5_LOGLEVEL_3,
"ts5_send_parport_trigger(%d,%d)\n", device, value);
379 if (device<1 || device>_ts5_status.timer.num_parports) {
380 ts5_fatal(
"%s: %s %d %s %d\n",
"ts5_send_parport_trigger",
381 "device argument is", device,
382 "number of parallel ports is",
383 _ts5_status.timer.num_parports);
389 outb(_ts5_status.timer.parport_data_register[device-1], value);
391 ts5_wait(_ts5_status.timer.parport[device-1]
392 .trigger_output_time);
394 outb(_ts5_status.timer.parport_data_register[device-1], 0);
396 #elif defined TS5_LINUX
397 outb(value, _ts5_status.timer.parport_data_register[device-1]);
399 ts5_wait(_ts5_status.timer.parport[device-1]
400 .trigger_output_time);
402 outb(0, _ts5_status.timer.parport_data_register[device-1]);
419 double trigger_output_time)
422 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_parport_trigger_output_time(%d,%f)\n",
423 device, trigger_output_time);
425 if (device<1 || device>_ts5_status.timer.num_parports) {
426 ts5_fatal(
"%s: %s %d %s %d\n",
"ts5_set_parport_trigger_output_time",
427 "device argument is", device,
428 "number of parallel ports is",
429 _ts5_status.timer.num_parports);
432 if (trigger_output_time < 0.0) {
433 ts5_fatal(
"%s: %s (is %f)\n",
"ts5_set_parport_trigger_output_time",
434 "output time should be positive", trigger_output_time);
437 double retval = _ts5_status.timer.parport[device-1]
438 .trigger_output_time;
440 _ts5_status.timer.parport[device-1].trigger_output_time =
443 ts5_log(TS5_LOGLEVEL_4,
"%s: %s %d to %f (was %f)\n",
444 "ts5_set_parport_trigger_output_time",
445 "set output time of device", device,
446 _ts5_status.timer.parport[device-1].trigger_output_time,
463 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_parport_trigger_output_time(%d)\n",
466 if (device<1 || device>_ts5_status.timer.num_parports) {
467 ts5_fatal(
"%s: %s %d %s %d\n",
"ts5_get_parport_trigger_output_time",
468 "device argument is", device,
469 "number of parallel ports is",
470 _ts5_status.timer.num_parports);
473 return _ts5_status.timer.parport[device-1].trigger_output_time;
509 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_num_parports(%d)\n", num_parports);
511 int retval = _ts5_status.timer.num_parports;
513 if (num_parports < 0) {
514 ts5_fatal(
"ts5_set_num_parports: num_parports should be >= 0\n");
517 if (num_parports > TS5_PARPORT_MAXPORT) {
518 ts5_fatal(
"ts5_set_num_parports: num_parports should be < %d\n",
519 TS5_PARPORT_MAXPORT);
522 _ts5_status.timer.num_parports = num_parports;
525 "ts5_set_num_parports: set num_parports to %d (was %d)\n",
526 _ts5_status.timer.num_parports, retval);
540 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_num_parports()\n");
542 return _ts5_status.timer.num_parports;
557 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_parport_address(%d, %d)\n", device, address);
560 ts5_fatal(
"ts5_set_parport_address: device should be >= 1\n");
563 if (device > _ts5_status.timer.num_parports) {
564 ts5_fatal(
"ts5_set_parport_address: device should be <= %d\n",
565 _ts5_status.timer.num_parports);
568 short retval = _ts5_status.timer.parport_base_address[device-1];
570 _ts5_status.timer.parport_base_address[device-1] = address;
572 _ts5_status.timer.parport_data_register[device-1] =
573 _ts5_status.timer.parport_base_address[device-1];
575 _ts5_status.timer.parport_status_register[device-1] =
576 _ts5_status.timer.parport_base_address[device-1]+1;
578 _ts5_status.timer.parport_control_register[device-1] =
579 _ts5_status.timer.parport_base_address[device-1]+2;
595 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_parport_address(%d)\n", device);
598 ts5_fatal(
"ts5_get_parport_address: device should be >= 1\n");
601 if (device > _ts5_status.timer.num_parports) {
602 ts5_fatal(
"ts5_get_parport_address: device should be <= %d\n",
603 _ts5_status.timer.num_parports);
606 return _ts5_status.timer.parport_base_address[device-1];
double ts5_get_parport_trigger_output_time(int device)
Get the trigger output time of a parallel port.
int ts5_set_num_parports(int num_parports)
Set the number of parallel ports that are connected to the system.
void ts5_check_parport2(char *calling_function)
Do some checks at the start of each parport function.
void ts5_set_parport_trigger_output(char *calling_function, int device)
Set the DATA register of the parallel port to output mode.
void ts5_wait(double waittime)
Wait for a number of seconds.
void ts5_send_parport_trigger(int device, unsigned char value)
Send a trigger trough a parallel port.
short ts5_get_parport_address(int device)
Get the address of a parallel port.
double ts5_set_parport_trigger_debounce_time(int device, double trigger_debounce_time)
Set the trigger debounce time of a parallel port.
void ts5_check_parport(char *calling_function)
Do some checks at the start of each parport function.
double ts5_get_parport_trigger_debounce_time(int device)
Get the trigger debounce time of a parallel port.
void ts5_define_parport_trigger_input(int device)
Define a parallel port as a trigger input device.
int ts5_get_num_parports()
Get the number of parallel ports that are connected to the system.
double ts5_get_parport_button_debounce_time(int device)
Get the button debounce time of a parallel port response box.
void ts5_log(const unsigned int level, const char *format,...)
Send info to a logging window.
int ts5_get_num_parport_buttons(int device)
Get the number of buttons available on a parallel port.
double ts5_set_parport_button_debounce_time(int device, double button_debounce_time)
Set the button debounce time of a parallel port response box.
void ts5_set_parport_trigger_input(char *calling_function, int device)
Set the DATA register of the parallel port to input mode.
void ts5_simulate_parport_trigger_input(int device, unsigned char value, double interval)
Turn on parallel port input simulation.
int ts5_define_parport_button(int device, int button)
Define a parallel port button as a response button.
short ts5_set_parport_address(int device, short address)
Set the address of a parallel port.
void ts5_fatal(const char *format,...)
Exit safely with an error message.
double ts5_set_parport_trigger_output_time(int device, double trigger_output_time)
Set the trigger output time of a parallel port.