16 #include "../include/tscope5/system.h"
17 #include "../include/tscope5/display.h"
18 #include "../include/tscope5/system_internal.h"
45 void ts5_log(
const unsigned int level,
const char *format, ...)
51 if (level <= _ts5_status.loglevel) {
54 _ts5_data.textlog = fopen(
"tscope5.log",
"w+");
55 if (!_ts5_data.textlog) {
56 ts5_fatal(
"ts5_log: could not open log file\n");
61 char outbuf[TS5_MAX_CHAR];
63 va_start(args, format);
64 vsnprintf(outbuf, TS5_MAX_CHAR*
sizeof(
char), format, args);
67 double logtime = al_get_time();
68 fprintf(stdout,
"%8.3f: %s", logtime, outbuf);
70 fprintf(_ts5_data.textlog,
"%8.3f: %s", logtime, outbuf);
104 ts5_log(TS5_LOGLEVEL_4,
"ts5_set_log_level(%d)\n", loglevel);
107 retval = _ts5_status.loglevel;
109 if (loglevel <= TS5_LOGLEVEL_6) {
110 _ts5_status.loglevel = loglevel;
112 ts5_log(TS5_LOGLEVEL_4,
"%s: %s %d to %d\n",
"ts5_set_log_level",
113 "changed loglevel from", retval, loglevel);
116 ts5_fatal(
"ts5_log: requested loglevel not supported.");
134 ts5_log(TS5_LOGLEVEL_4,
"ts5_get_log_level\n");
136 return _ts5_status.loglevel;
150 char line[]=
"==================================================\n";
157 ts5_log(TS5_LOGLEVEL_0,
"tscope5 status:\n");
160 ts5_log(TS5_LOGLEVEL_0,
"Loglevel: %d\n", _ts5_status.loglevel);
161 ts5_log(TS5_LOGLEVEL_0,
"Number of display adapters: %d\n",
162 _ts5_status.num_display_adapters);
164 for (i = 0; i < _ts5_status.num_display_adapters; i++) {
166 ts5_log(TS5_LOGLEVEL_0,
"%s %d: w: %d (%d:%d), h: %d (%d:%d)\n",
167 "Display adapter", i+1,
168 _ts5_status.display_adapter[i].w,
169 _ts5_status.display_adapter[i].x1,
170 _ts5_status.display_adapter[i].x2,
171 _ts5_status.display_adapter[i].h,
172 _ts5_status.display_adapter[i].y1,
173 _ts5_status.display_adapter[i].y2);
179 ALLEGRO_DISPLAY_MODE *mode;
180 mode = (ALLEGRO_DISPLAY_MODE *)al_malloc(
sizeof(ALLEGRO_DISPLAY_MODE));
182 for (i = 0; i < _ts5_status.num_display_adapters; i++) {
184 al_set_new_display_adapter(i);
185 int oldrate = al_get_new_display_refresh_rate();
186 int oldflags = al_get_new_display_flags();
187 al_set_new_display_refresh_rate(0);
188 al_set_new_display_flags(0);
190 int nmodes = al_get_num_display_modes();
193 for (j=0; j<nmodes; j++) {
195 mode = al_get_display_mode(j, mode);
197 "adapter %d mode %2d: w=%4d, h=%4d, format=%d, rate=%d\n",
198 i+1, j+1, mode->width, mode->height,
199 mode->format, mode->refresh_rate);
202 al_set_new_display_refresh_rate(oldrate);
203 al_set_new_display_flags(oldflags);
207 al_set_new_display_adapter(oldadapter);
212 ts5_log(TS5_LOGLEVEL_0,
"Parameters for next display:\n");
214 ts5_log(TS5_LOGLEVEL_0,
"\tAdapter %d\n",
217 ts5_log(TS5_LOGLEVEL_0,
"\tw=%d, h=%d\n",
220 ts5_log(TS5_LOGLEVEL_0,
"\tx=%d, y=%d\n",
223 ts5_log(TS5_LOGLEVEL_0,
"\tRefreshrate=%d\n",
226 ts5_log(TS5_LOGLEVEL_0,
"\tDisplay mode=%d\n",
229 ts5_log(TS5_LOGLEVEL_0,
"\tVsync mode=%d\n",
232 ts5_log(TS5_LOGLEVEL_0,
"\tMultisampling=%d\n",
237 ts5_log(TS5_LOGLEVEL_0,
"Number of displays: %d\n",
238 _ts5_status.num_displays);
240 ts5_log(TS5_LOGLEVEL_0,
"Active display: %d\n",
241 _ts5_status.active_display);
243 for (i = 0; i < _ts5_status.num_displays; i++) {
246 "%s %d: %s %d, w=%d, h=%d, x=%d, y=%d, %s=%d, %s=%d, %s=%d %s=%d\n",
248 "Adapter", _ts5_status.display[i].adapter+1,
249 _ts5_status.display[i].w, _ts5_status.display[i].h,
250 _ts5_status.display[i].x, _ts5_status.display[i].y,
251 "Refreshrate", _ts5_status.display[i].refreshrate,
252 "Dispay mode", _ts5_status.display[i].display_mode,
253 "Vsync mode", _ts5_status.display[i].vsync_mode,
254 "Multisampling", _ts5_status.display[i].multisampling);
263 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
264 "Coordinate system", _ts5_status.graphics.coordinate_system);
266 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
267 "Coordinate scale", _ts5_status.graphics.coordinate_scale);
269 ts5_log(TS5_LOGLEVEL_0,
"%s: %d x %d\n",
270 "Target bitmap size",
271 _ts5_status.graphics.target_width,
272 _ts5_status.graphics.target_height);
274 al_unmap_rgba_f(_ts5_status.graphics.foreground_color, &r, &g, &b, &a);
275 ts5_log(TS5_LOGLEVEL_0,
"%s: r: %f g: %f b: %f alpha: %f\n",
276 "Foreground color", r, g, b, a);
278 al_unmap_rgba_f(_ts5_status.graphics.background_color, &r, &g, &b, &a);
279 ts5_log(TS5_LOGLEVEL_0,
"%s: r: %f g: %f b: %f alpha: %f\n",
280 "Background color", r, g, b, a);
282 ts5_log(TS5_LOGLEVEL_0,
"%s: %f\n",
283 "Line drawing thickness", _ts5_status.graphics.drawing_thickness);
285 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
286 "Fill mode", _ts5_status.graphics.fill_mode);
288 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
289 "Font type", _ts5_status.graphics.font_type);
291 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
292 "Font style", _ts5_status.graphics.font_style);
294 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
295 "Font size", _ts5_status.graphics.font_size);
297 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
298 "Font number", _ts5_status.graphics.font_index);
300 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
301 "Text alignment", _ts5_status.graphics.text_alignment);
309 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
310 "Number of audio channels", _ts5_status.audio.channels);
312 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
313 "Sample rate", _ts5_status.audio.samplerate);
315 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
316 "Sample format", _ts5_status.audio.depth);
318 ts5_log(TS5_LOGLEVEL_0,
"%s: %f\n",
319 "Audio Gain", _ts5_status.audio.gain);
323 TS5_TIMER_STATUS *timer = &_ts5_status.timer;
327 ts5_log(TS5_LOGLEVEL_0,
"Program priority: %+d\n",
330 ts5_log(TS5_LOGLEVEL_0,
"Number of defined response buttons: %d\n",
331 timer->num_defined_buttons);
333 ts5_log(TS5_LOGLEVEL_0,
"Number of active response buttons: %d\n",
334 timer->num_active_buttons);
336 ts5_log(TS5_LOGLEVEL_0,
"Voicekey is response device: %d\n",
337 timer->voicekey_is_response_device);
339 if (timer->voicekey_is_response_device) {
341 for (i=0; i<timer->voicekey.num_buttons; i++) {
343 if (timer->voicekey.button_press_active[i]!=0) {
344 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
345 "Voice key button press", i+1,
"has response value",
346 timer->voicekey.button_press_defined[i]);
349 if (timer->voicekey.button_release_active[i]!=0) {
350 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
351 "Voice key button release", i+1,
"has response value",
352 timer->voicekey.button_release_defined[i]);
357 ts5_log(TS5_LOGLEVEL_0,
"Mouse is response device: %d\n",
358 timer->mouse_is_response_device);
360 if (timer->mouse_is_response_device) {
362 for (i=0; i<timer->mouse.num_buttons; i++) {
364 if (timer->mouse.button_press_active[i]!=0) {
365 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
366 "Mouse button press", i+1,
"has response value",
367 timer->mouse.button_press_defined[i]);
370 if (timer->mouse.button_release_active[i]!=0) {
371 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
372 "Mouse button release", i+1,
"has response value",
373 timer->mouse.button_release_defined[i]);
378 ts5_log(TS5_LOGLEVEL_0,
"Keyboard is response device: %d\n",
379 timer->keyboard_is_response_device);
381 if (timer->keyboard_is_response_device) {
383 for (i=0; i<timer->keyboard.num_buttons; i++) {
385 if (timer->keyboard.button_press_active[i]!=0) {
386 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
387 "Keyboard button press", i+1,
"has response value",
388 timer->keyboard.button_press_defined[i]);
391 if (timer->keyboard.button_release_active[i]!=0) {
392 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
393 "Keyboard button release", i+1,
"has response value",
394 timer->keyboard.button_release_defined[i]);
399 ts5_log(TS5_LOGLEVEL_0,
"Number of joysticks: %d\n",
400 timer->num_joysticks);
402 ts5_log(TS5_LOGLEVEL_0,
"Joystick is response device: %d\n",
403 timer->joystick_is_response_device);
405 if (timer->joystick_is_response_device) {
407 for (i=0; i<timer->num_joysticks; i++) {
410 for (j=0; j<timer->joystick[i].num_buttons; j++) {
412 if (timer->joystick[i].button_press_active[j]!=0) {
413 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
414 "Joystick", i+1,
"button press", j+1,
415 "has response value",
416 timer->joystick[i].button_press_defined[j]);
419 if (timer->joystick[i].button_release_active[j]!=0) {
420 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
421 "Joystick", i+1,
"button release", j+1,
422 "has response value",
423 timer->joystick[i].button_release_defined[j]);
429 ts5_log(TS5_LOGLEVEL_0,
"Number of cedrusboxes: %d\n",
430 timer->num_cedrusboxes);
432 ts5_log(TS5_LOGLEVEL_0,
"Cedrusbox is response device: %d\n",
433 timer->cedrusbox_is_response_device);
435 if (timer->cedrusbox_is_response_device) {
437 for (i=0; i<timer->num_cedrusboxes; i++) {
439 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
441 "is mapped to serial device",
442 timer->cedrusbox[i].port_num+1);
444 ts5_log(TS5_LOGLEVEL_0,
"Cedrusbox %d is type %d\n",
445 i+1, timer->cedrusbox[i].type);
448 for (j=0; j<timer->cedrusbox[i].num_buttons; j++) {
450 if (timer->cedrusbox[i].button_press_active[j]!=0) {
451 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
452 "Cedrusbox", i+1,
"button press", j+1,
453 "has response value",
454 timer->cedrusbox[i].button_press_defined[j]);
457 if (timer->cedrusbox[i].button_release_active[j]!=0) {
458 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
459 "Cedrusbox", i+1,
"button release", j+1,
460 "has response value",
461 timer->cedrusbox[i].button_release_defined[j]);
467 ts5_log(TS5_LOGLEVEL_0,
"Number of parallel ports: %d\n",
468 timer->num_parports);
470 ts5_log(TS5_LOGLEVEL_0,
"Parallel port is response device: %d\n",
471 timer->parport_is_response_device);
473 if (timer->parport_is_response_device) {
475 for (i=0; i<timer->num_parports; i++) {
478 for (j=0; j<timer->parport[i].num_buttons; j++) {
480 if (timer->parport[i].button_press_active[j]!=0) {
481 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
482 "Parallel box", i+1,
"button press", j+1,
483 "has response value",
484 timer->parport[i].button_press_defined[j]);
487 if (timer->cedrusbox[i].button_release_active[j]!=0) {
488 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
489 "Parallel box", i+1,
"button release", j+1,
490 "has response value",
491 timer->parport[i].button_release_defined[j]);
535 ts5_log(TS5_LOGLEVEL_1,
"ts5_fatal\n");
537 char outbuf[TS5_MAX_CHAR];
539 va_start(args, format);
540 vsnprintf(outbuf, TS5_MAX_CHAR*
sizeof(
char), format, args);
543 fprintf(stdout,
"Tscope5 error: %s", outbuf);
545 #ifndef TS5_RASPBERRYPI
546 if (_ts5_status.num_displays>0) {
548 if (_ts5_status.display[_ts5_status.active_display].display_mode
549 == TS5_FULLSCREEN_WINDOW) {
551 al_toggle_display_flag(
552 _ts5_data.display[_ts5_status.active_display],
553 ALLEGRO_FULLSCREEN_WINDOW, 0);
555 _ts5_status.display[_ts5_status.active_display].display_mode
559 al_show_native_message_box(
560 _ts5_data.display[_ts5_status.active_display],
561 "Tscope5 error",
"Tscope5 error", outbuf, NULL,
562 ALLEGRO_MESSAGEBOX_ERROR);
565 al_show_native_message_box(NULL,
"Tscope5 error",
"Tscope5 error",
566 outbuf, NULL, ALLEGRO_MESSAGEBOX_ERROR);
int _ts5_is_tscope5_installed
Is Tscope5 installed?
int ts5_get_log_level()
Get log level.
TS5_DISPLAY_STATUS ts5_nextdisplay
Settings for the next display that will be opened.
void ts5_log(const unsigned int level, const char *format,...)
Send info to a logging window.
int ts5_set_log_level(const unsigned int loglevel)
Set log level.
void ts5_install_tscope5(char *calling_function)
Install Tscope5.
void ts5_print_status()
Write the status of all Tscope5 subsystem to the log window.
int _ts5_is_textlog_installed
Is text log installed?
void ts5_fatal(const char *format,...)
Exit safely with an error message.