ubb-la/gui.c |
41 | 41 | #define MAP_BUF_RGBA 0x808080ff /* buffer in the map */ |
42 | 42 | #define MAP_VIEW_RGBA 0xffffffff /* current view in the map */ |
43 | 43 | #define CENTER_RGBA 0x5080ffff /* center marker */ |
| 44 | #define USER_REF_RGBA 0x00ff40ff /* user reference marker */ |
44 | 45 | #define LEVEL_RGBA 0xffff00ff /* constant level or single change */ |
45 | 46 | #define BOUNCE_RGBA 0xff8080ff /* bouncing signal */ |
46 | 47 | #define LABEL_RGBA 0xffffffff /* channel label */ |
... | ... | |
60 | 61 | |
61 | 62 | #define CENTER_W 8 |
62 | 63 | #define CENTER_Y0 20 |
63 | | #define CENTER_Y1 24 |
| 64 | #define CENTER_Y1 (CENTER_Y0+4) |
| 65 | |
| 66 | #define USER_REF_W 8 |
| 67 | #define USER_REF_Y0 92 |
| 68 | #define USER_REF_Y1 (USER_REF_Y0+4) |
64 | 69 | |
65 | 70 | #define CH_XOFF 30 |
66 | 71 | #define CH_YOFF 30 |
... | ... | |
74 | 79 | |
75 | 80 | #define UNIT_GAP 2 /* space between number and unit */ |
76 | 81 | |
77 | | #define POS_T_X 176 |
78 | | #define POS_SAMP_X 264 |
| 82 | #define POS_T_X 182 |
| 83 | #define POS_SAMP_X 270 |
79 | 84 | #define POS_Y (MEAS_DIV_Y-8-3) |
80 | 85 | |
81 | 86 | #define MEAS_DIV_Y (FREQ_Y-3-1) |
... | ... | |
89 | 94 | #define DIV_INT_X 80 |
90 | 95 | #define DIV_INT_Y INTERVAL_Y |
91 | 96 | |
| 97 | #define USER_T_X POS_T_X |
| 98 | #define USER_T_Y FREQ_Y |
| 99 | #define USER_SAMP_X POS_SAMP_X |
| 100 | #define USER_SAMP_Y USER_T_Y |
| 101 | #define USER_FREQ_X POS_T_X |
| 102 | #define USER_FREQ_Y (USER_T_Y+8+2) |
| 103 | |
92 | 104 | |
93 | 105 | /* ----- Miscellaneous definitions ----------------------------------------- */ |
94 | 106 | |
... | ... | |
97 | 109 | #define REPEAT_INTERVAL_MS 30 |
98 | 110 | |
99 | 111 | static SDL_Surface *surf; |
| 112 | static int user_ref = -1; |
100 | 113 | |
101 | 114 | |
102 | 115 | /* ----- SDL initialization and screen-wide functions ---------------------- */ |
... | ... | |
294 | 307 | } |
295 | 308 | |
296 | 309 | |
| 310 | static void user_ref_marker(int x0, int x1, int x) |
| 311 | { |
| 312 | if (x < 0 || x > x1-x0) |
| 313 | return; |
| 314 | filledTrigonColor(surf, x0+x, USER_REF_Y0, |
| 315 | x0+x-USER_REF_W/2, USER_REF_Y1, |
| 316 | x0+x+USER_REF_W/2, USER_REF_Y1, USER_REF_RGBA); |
| 317 | } |
| 318 | |
| 319 | |
297 | 320 | static void show_buffer(const uint8_t *buf, int skip, int nibbles, |
298 | 321 | int x0, int x1, int zoom, int pos) |
299 | 322 | { |
300 | 323 | int xm, w, s, p0, p1; |
301 | | int d, dp; |
| 324 | int d, dp, ref; |
302 | 325 | |
303 | 326 | xm = (x0+x1) >> 1; |
304 | 327 | dp = pos-((nibbles-skip) >> 1); |
| 328 | ref = user_ref+skip; |
305 | 329 | DEBUG("show: %d-%d Sa; %d-%d pix; pos %d dp %d; xm %d xcenter %d\n", |
306 | 330 | skip, nibbles, x0, x1, pos, dp, xm, XCENTER); |
307 | 331 | if (zoom < 0) { |
... | ... | |
319 | 343 | p1 = x1; |
320 | 344 | } |
321 | 345 | show_buffer_zoom_out(buf, skip, nibbles, p0, p1); |
| 346 | if (user_ref != -1) |
| 347 | user_ref_marker(p0, p1, (ref-skip) >> -zoom); |
322 | 348 | } else { |
323 | 349 | s = (x1-x0) >> zoom; |
324 | 350 | show_map(skip, nibbles, pos-s/2, pos+s/2); |
... | ... | |
336 | 362 | p1 -= d << zoom; |
337 | 363 | } |
338 | 364 | show_buffer_zoom_in(buf, skip, nibbles, p0, p1); |
| 365 | if (user_ref != -1) |
| 366 | user_ref_marker(p0, p1, (ref-skip) << zoom); |
339 | 367 | } |
340 | 368 | } |
341 | 369 | |
... | ... | |
404 | 432 | } |
405 | 433 | |
406 | 434 | |
| 435 | static void show_user_ref(double freq, int pos, int user_ref) |
| 436 | { |
| 437 | si_text(USER_T_X, USER_T_Y, fabs(user_ref-pos)/freq, "s", 7); |
| 438 | |
| 439 | textf(USER_SAMP_X,USER_SAMP_Y, TEXT_RGBA, "%4d", |
| 440 | pos > user_ref ? pos-user_ref : user_ref-pos); |
| 441 | textf(USER_SAMP_X+4*8+UNIT_GAP, USER_SAMP_Y, UNIT_RGBA, "Sa", div); |
| 442 | |
| 443 | if (pos != user_ref) |
| 444 | si_text(USER_FREQ_X, USER_FREQ_Y, |
| 445 | freq/fabs(user_ref-pos), "Hz", 7); |
| 446 | } |
| 447 | |
| 448 | |
407 | 449 | /* ----- Show divisions ---------------------------------------------------- */ |
408 | 450 | |
409 | 451 | |
... | ... | |
450 | 492 | show_buffer(buf, skip, nibbles, CH_XOFF, XRES, zoom, pos); |
451 | 493 | show_freq(freq, zoom); |
452 | 494 | show_position(freq, pos); |
| 495 | if (user_ref != -1) |
| 496 | show_user_ref(freq, pos, user_ref); |
453 | 497 | update(); |
454 | 498 | |
455 | 499 | while (1) { |
... | ... | |
475 | 519 | if (pos > nibbles-skip-1) |
476 | 520 | pos = nibbles-skip-1; |
477 | 521 | break; |
| 522 | case SDLK_SPACE: |
| 523 | if (pos == user_ref) |
| 524 | user_ref = -1; |
| 525 | else |
| 526 | user_ref = pos; |
| 527 | break; |
478 | 528 | case SDLK_RETURN: |
479 | 529 | case SDLK_q: |
480 | 530 | return; |