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",
234 ts5_log(TS5_LOGLEVEL_0,
"Number of displays: %d\n",
235 _ts5_status.num_displays);
237 ts5_log(TS5_LOGLEVEL_0,
"Active display: %d\n",
238 _ts5_status.active_display);
240 for (i = 0; i < _ts5_status.num_displays; i++) {
243 "%s %d: %s %d, w=%d, h=%d, x=%d, y=%d, %s=%d, %s=%d, %s=%d\n",
245 "Adapter", _ts5_status.display[i].adapter+1,
246 _ts5_status.display[i].w, _ts5_status.display[i].h,
247 _ts5_status.display[i].x, _ts5_status.display[i].y,
248 "Refreshrate", _ts5_status.display[i].refreshrate,
249 "Dispay mode", _ts5_status.display[i].display_mode,
250 "Vsync mode", _ts5_status.display[i].vsync_mode);
259 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
260 "Coordinate system", _ts5_status.graphics.coordinate_system);
262 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
263 "Coordinate scale", _ts5_status.graphics.coordinate_scale);
265 ts5_log(TS5_LOGLEVEL_0,
"%s: %d x %d\n",
266 "Target bitmap size",
267 _ts5_status.graphics.target_width,
268 _ts5_status.graphics.target_height);
270 al_unmap_rgba_f(_ts5_status.graphics.foreground_color, &r, &g, &b, &a);
271 ts5_log(TS5_LOGLEVEL_0,
"%s: r: %f g: %f b: %f alpha: %f\n",
272 "Foreground color", r, g, b, a);
274 al_unmap_rgba_f(_ts5_status.graphics.background_color, &r, &g, &b, &a);
275 ts5_log(TS5_LOGLEVEL_0,
"%s: r: %f g: %f b: %f alpha: %f\n",
276 "Background color", r, g, b, a);
278 ts5_log(TS5_LOGLEVEL_0,
"%s: %f\n",
279 "Line drawing thickness", _ts5_status.graphics.drawing_thickness);
281 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
282 "Fill mode", _ts5_status.graphics.fill_mode);
284 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
285 "Font type", _ts5_status.graphics.font_type);
287 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
288 "Font style", _ts5_status.graphics.font_style);
290 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
291 "Font size", _ts5_status.graphics.font_size);
293 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
294 "Font number", _ts5_status.graphics.font_index);
296 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
297 "Text alignment", _ts5_status.graphics.text_alignment);
302 TS5_TIMER_STATUS *timer = &_ts5_status.timer;
306 ts5_log(TS5_LOGLEVEL_0,
"Program priority: %+d\n",
309 ts5_log(TS5_LOGLEVEL_0,
"Number of defined response buttons: %d\n",
310 timer->num_defined_buttons);
312 ts5_log(TS5_LOGLEVEL_0,
"Number of active response buttons: %d\n",
313 timer->num_active_buttons);
315 ts5_log(TS5_LOGLEVEL_0,
"Mouse is response device: %d\n",
316 timer->mouse_is_response_device);
318 if (timer->mouse_is_response_device) {
320 for (i=0; i<timer->mouse.num_buttons; i++) {
322 if (timer->mouse.button_press_active[i]!=0) {
323 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
324 "Mouse button press", i+1,
"has response value",
325 timer->mouse.button_press_defined[i]);
328 if (timer->mouse.button_release_active[i]!=0) {
329 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
330 "Mouse button release", i+1,
"has response value",
331 timer->mouse.button_release_defined[i]);
336 ts5_log(TS5_LOGLEVEL_0,
"Keyboard is response device: %d\n",
337 timer->keyboard_is_response_device);
339 if (timer->keyboard_is_response_device) {
341 for (i=0; i<timer->keyboard.num_buttons; i++) {
343 if (timer->keyboard.button_press_active[i]!=0) {
344 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
345 "Keyboard button press", i+1,
"has response value",
346 timer->keyboard.button_press_defined[i]);
349 if (timer->keyboard.button_release_active[i]!=0) {
350 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
351 "Keyboard button release", i+1,
"has response value",
352 timer->keyboard.button_release_defined[i]);
357 ts5_log(TS5_LOGLEVEL_0,
"Number of joysticks: %d\n",
358 timer->num_joysticks);
360 ts5_log(TS5_LOGLEVEL_0,
"Joystick is response device: %d\n",
361 timer->joystick_is_response_device);
363 if (timer->joystick_is_response_device) {
365 for (i=0; i<timer->num_joysticks; i++) {
368 for (j=0; j<timer->joystick[i].num_buttons; j++) {
370 if (timer->joystick[i].button_press_active[j]!=0) {
371 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
372 "Joystick", i+1,
"button press", j+1,
373 "has response value",
374 timer->joystick[i].button_press_defined[j]);
377 if (timer->joystick[i].button_release_active[j]!=0) {
378 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
379 "Joystick", i+1,
"button release", j+1,
380 "has response value",
381 timer->joystick[i].button_release_defined[j]);
387 ts5_log(TS5_LOGLEVEL_0,
"Number of cedrusboxes: %d\n",
388 timer->num_cedrusboxes);
390 ts5_log(TS5_LOGLEVEL_0,
"Cedrusbox is response device: %d\n",
391 timer->cedrusbox_is_response_device);
393 if (timer->cedrusbox_is_response_device) {
395 for (i=0; i<timer->num_cedrusboxes; i++) {
397 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d\n",
399 "is mapped to serial device",
400 timer->cedrusbox[i].port_num+1);
402 ts5_log(TS5_LOGLEVEL_0,
"Cedrusbox %d is type %d\n",
403 i+1, timer->cedrusbox[i].type);
406 for (j=0; j<timer->cedrusbox[i].num_buttons; j++) {
408 if (timer->cedrusbox[i].button_press_active[j]!=0) {
409 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
410 "Cedrusbox", i+1,
"button press", j+1,
411 "has response value",
412 timer->cedrusbox[i].button_press_defined[j]);
415 if (timer->cedrusbox[i].button_release_active[j]!=0) {
416 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
417 "Cedrusbox", i+1,
"button release", j+1,
418 "has response value",
419 timer->cedrusbox[i].button_release_defined[j]);
425 ts5_log(TS5_LOGLEVEL_0,
"Number of parallel ports: %d\n",
426 timer->num_parports);
428 ts5_log(TS5_LOGLEVEL_0,
"Parallel port is response device: %d\n",
429 timer->parport_is_response_device);
431 if (timer->parport_is_response_device) {
433 for (i=0; i<timer->num_parports; i++) {
436 for (j=0; j<timer->parport[i].num_buttons; j++) {
438 if (timer->parport[i].button_press_active[j]!=0) {
439 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
440 "Parallel box", i+1,
"button press", j+1,
441 "has response value",
442 timer->parport[i].button_press_defined[j]);
445 if (timer->cedrusbox[i].button_release_active[j]!=0) {
446 ts5_log(TS5_LOGLEVEL_0,
"%s %d %s %d %s %d\n",
447 "Parallel box", i+1,
"button release", j+1,
448 "has response value",
449 timer->parport[i].button_release_defined[j]);
462 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
463 "Number of audio channels", _ts5_status.audio.channels);
465 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
466 "Sample rate", _ts5_status.audio.frequency);
468 ts5_log(TS5_LOGLEVEL_0,
"%s: %d\n",
469 "Sample format", _ts5_status.audio.depth);
471 ts5_log(TS5_LOGLEVEL_0,
"%s: %f\n",
472 "Audio Gain", _ts5_status.audio.gain);
509 ts5_log(TS5_LOGLEVEL_1,
"ts5_fatal\n");
511 char outbuf[TS5_MAX_CHAR];
513 va_start(args, format);
514 vsnprintf(outbuf, TS5_MAX_CHAR*
sizeof(
char), format, args);
517 fprintf(stdout,
"Tscope5 error: %s", outbuf);
519 if (_ts5_status.num_displays>0) {
521 if (_ts5_status.display[_ts5_status.active_display].display_mode
522 == TS5_FULLSCREEN_WINDOW) {
524 al_toggle_display_flag(
525 _ts5_data.display[_ts5_status.active_display],
526 ALLEGRO_FULLSCREEN_WINDOW, 0);
528 _ts5_status.display[_ts5_status.active_display].display_mode
532 al_show_native_message_box(
533 _ts5_data.display[_ts5_status.active_display],
534 "Tscope5 error",
"Tscope5 error", outbuf, NULL,
535 ALLEGRO_MESSAGEBOX_ERROR);
538 al_show_native_message_box(NULL,
"Tscope5 error",
"Tscope5 error",
539 outbuf, NULL, ALLEGRO_MESSAGEBOX_ERROR);