1 // ----------------------------------------------------------------------------
2 // Copyright (C) 2014
3 // David Freese, W1HKJ
4 //
5 // This file is part of flrig.
6 //
7 // flrig is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation; either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // flrig is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program. If not, see <http://www.gnu.org/licenses/>.
19 // ----------------------------------------------------------------------------
20
21 #include <FL/Fl.H>
22 #include <FL/x.H>
23 #include <FL/fl_draw.H>
24 #include <string>
25 #include <iostream>
26 #include <stdio.h>
27 #include <unistd.h>
28 #include <sys/types.h>
29 #include <sys/stat.h>
30
31 #ifndef __WIN32__
32 #include <fcntl.h>
33 #include <sys/ioctl.h>
34 #include <sys/time.h>
35 #include <termios.h>
36 #include <glob.h>
37 #endif
38
39 #include "dialogs.h"
40 #include "rigs.h"
41 #include "util.h"
42 #include "debug.h"
43 #include "serial.h"
44 #include "support.h"
45 #include "rigpanel.h"
46 #include "rigbase.h"
47 #include "font_browser.h"
48 #include "ui.h"
49 #include "status.h"
50 #include "rig.h"
51 #include "socket_io.h"
52 #include "rigpanel.h"
53 #include "gettext.h"
54 #include "cwioUI.h"
55
56 using namespace std;
57
58 Fl_Double_Window *dlgDisplayConfig = NULL;
59 Fl_Double_Window *dlgXcvrConfig = NULL;
60 Fl_Double_Window *dlgMemoryDialog = NULL;
61 Fl_Double_Window *dlgControls = NULL;
62
63 Font_Browser *fntbrowser = NULL;
64
65 Fl_Color flrig_def_color(int);
66
67 //======================================================================
68 // test comm ports
69 //======================================================================
70
clear_combos()71 void clear_combos()
72 {
73 selectCommPort->clear();
74 selectAuxPort->clear();
75 selectSepPTTPort->clear();
76 selectCommPort->add("NONE");
77 selectAuxPort->add("NONE");
78 selectSepPTTPort->add("NONE");
79 select_cwioPORT->add("NONE");
80 }
81
add_combos(char * port)82 void add_combos(char *port)
83 {
84 selectCommPort->add(port);
85 selectAuxPort->add(port);
86 selectSepPTTPort->add(port);
87 select_cwioPORT->add(port);
88 }
89
set_combo_value()90 void set_combo_value()
91 {
92 selectCommPort->value(progStatus.xcvr_serial_port.c_str());
93 selectAuxPort->value(progStatus.aux_serial_port.c_str());
94 selectSepPTTPort->value(progStatus.sep_serial_port.c_str());
95 select_cwioPORT->value(progStatus.cwioPORT.c_str());
96 }
97
98 //======================================================================
99 // WIN32 init_port_combos
100 //======================================================================
101
102 #ifdef __WIN32__
open_serial(const char * dev)103 static bool open_serial(const char* dev)
104 {
105 bool ret = false;
106 HANDLE fd = CreateFile(dev, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
107 if (fd != INVALID_HANDLE_VALUE) {
108 CloseHandle(fd);
109 ret = true;
110 }
111 return ret;
112 }
113
114 # define TTY_MAX 255
init_port_combos()115 void init_port_combos()
116 {
117 clear_combos();
118
119 char ttyname[21];
120 const char tty_fmt[] = "//./COM%u";
121
122 for (unsigned j = 0; j < TTY_MAX; j++) {
123 snprintf(ttyname, sizeof(ttyname), tty_fmt, j);
124 if (!open_serial(ttyname))
125 continue;
126 snprintf(ttyname, sizeof(ttyname), "COM%u", j);
127 LOG_WARN("Found serial port %s", ttyname);
128 add_combos(ttyname);
129 }
130 set_combo_value();
131 }
132 #endif //__WIN32__
133
134 //======================================================================
135 // Linux init_port_combos
136 //======================================================================
137
138 #ifdef __linux__
139 #ifndef PATH_MAX
140 # define PATH_MAX 1024
141 #endif
142 # define TTY_MAX 8
143
init_port_combos()144 void init_port_combos()
145 {
146 struct stat st;
147 char ttyname[PATH_MAX + 1];
148 bool ret = false;
149
150 DIR* sys = NULL;
151 char cwd[PATH_MAX] = { '.', '\0' };
152
153 clear_combos();
154
155 LOG_QUIET("%s","Search for serial ports");
156
157 glob_t gbuf;
158 glob("/dev/serial/by-id/*", 0, NULL, &gbuf);
159 for (size_t j = 0; j < gbuf.gl_pathc; j++) {
160 if ( !(stat(gbuf.gl_pathv[j], &st) == 0 && S_ISCHR(st.st_mode)) ||
161 strstr(gbuf.gl_pathv[j], "modem") )
162 continue;
163 LOG_QUIET("Found serial port %s", gbuf.gl_pathv[j]);
164 add_combos(gbuf.gl_pathv[j]);
165 }
166 globfree(&gbuf);
167
168 glob("/dev/tty*", 0, NULL, &gbuf);
169 for (size_t j = 0; j < gbuf.gl_pathc; j++) {
170 if ( !(stat(gbuf.gl_pathv[j], &st) == 0 && S_ISCHR(st.st_mode)) ||
171 strstr(gbuf.gl_pathv[j], "modem") )
172 continue;
173 LOG_QUIET("Found serial port %s", gbuf.gl_pathv[j]);
174 add_combos(gbuf.gl_pathv[j]);
175 }
176
177 globfree(&gbuf);
178
179 if (getcwd(cwd, sizeof(cwd)) == NULL) goto out;
180
181 if (chdir("/sys/class/tty") == -1) goto check_cuse;
182 if ((sys = opendir(".")) == NULL) goto check_cuse;
183
184 ssize_t len;
185 struct dirent* dp;
186
187 LOG_QUIET("%s", "Searching /sys/class/tty/");
188
189 while ((dp = readdir(sys))) {
190 # ifdef _DIRENT_HAVE_D_TYPE
191 if (dp->d_type != DT_LNK)
192 continue;
193 # endif
194 if ((len = readlink(dp->d_name, ttyname, sizeof(ttyname)-1)) == -1)
195 continue;
196 ttyname[len] = '\0';
197 if (!strstr(ttyname, "/devices/virtual/")) {
198 snprintf(ttyname, sizeof(ttyname), "/dev/%s", dp->d_name);
199 if (stat(ttyname, &st) == -1 || !S_ISCHR(st.st_mode))
200 continue;
201 LOG_QUIET("Found serial port %s", ttyname);
202 add_combos(ttyname);
203 ret = true;
204 }
205 }
206
207 check_cuse:
208 if (sys) {
209 closedir(sys);
210 sys = NULL;
211 }
212 if (chdir("/sys/class/cuse") == -1) goto out;
213 if ((sys = opendir(".")) == NULL) goto out;
214
215 LOG_QUIET("%s", "Searching /sys/class/cuse/");
216
217 while ((dp = readdir(sys))) {
218 # ifdef _DIRENT_HAVE_D_TYPE
219 if (dp->d_type != DT_LNK)
220 continue;
221 # endif
222 if ((len = readlink(dp->d_name, ttyname, sizeof(ttyname)-1)) == -1)
223 continue;
224 ttyname[len] = '\0';
225 if (strstr(ttyname, "/devices/virtual/") && !strncmp(dp->d_name, "mhuxd", 5)) {
226 char *name = strdup(dp->d_name);
227 if(!name)
228 continue;
229 char *p = strchr(name, '!');
230 if(p)
231 *p = '/';
232 snprintf(ttyname, sizeof(ttyname), "/dev/%s", name);
233 free(name);
234 if (stat(ttyname, &st) == -1 || !S_ISCHR(st.st_mode))
235 continue;
236 LOG_QUIET("Found serial port %s", ttyname);
237 add_combos(ttyname);
238 ret = true;
239 }
240 }
241
242 out:
243 std::string tty_virtual = HomeDir;
244 tty_virtual.append("vdev");
245
246 LOG_QUIET("Searching %s", tty_virtual.c_str());
247
248 tty_virtual.append("/ttyS%u");
249 for (unsigned j = 0; j < TTY_MAX; j++) {
250 snprintf(ttyname, sizeof(ttyname), tty_virtual.c_str(), j);
251 if ( !(stat(ttyname, &st) == 0 && S_ISCHR(st.st_mode)) )
252 continue;
253 LOG_QUIET("Found serial port %s", ttyname);
254 add_combos(ttyname);
255 }
256
257 if (sys) closedir(sys);
258 if (chdir(cwd) == -1) return;
259 if (ret) { // do we need to fall back to the probe code below?
260 set_combo_value();
261 return;
262 }
263
264 const char* tty_fmt[] = {
265 "/dev/ttyS%u",
266 "/dev/ttyUSB%u",
267 "/dev/usb/ttyUSB%u"
268 };
269 LOG_QUIET("%s", "Serial port discovery via 'stat'");
270 for (size_t i = 0; i < sizeof(tty_fmt)/sizeof(*tty_fmt); i++) {
271 for (unsigned j = 0; j < TTY_MAX; j++) {
272 snprintf(ttyname, sizeof(ttyname), tty_fmt[i], j);
273 if ( !(stat(ttyname, &st) == 0 && S_ISCHR(st.st_mode)) )
274 continue;
275
276 LOG_WARN("Found serial port %s", ttyname);
277 add_combos(ttyname);
278 }
279 }
280 set_combo_value();
281 }
282 #endif // __linux__
283
284 //======================================================================
285 // APPLE init_port_combos
286 //======================================================================
287
288 #ifdef __APPLE__
289 #ifndef PATH_MAX
290 # define PATH_MAX 1024
291 #endif
292
init_port_combos()293 void init_port_combos()
294 {
295 std::string pname;
296 const char* tty_fmt[] = {
297 "/dev/cu.*",
298 "/dev/tty.*"
299 };
300 struct stat st;
301
302 clear_combos();
303 glob_t gbuf;
304 bool is_serial;
305
306 clear_combos();
307 for (size_t i = 0; i < sizeof(tty_fmt)/sizeof(*tty_fmt); i++) {
308 glob(tty_fmt[i], 0, NULL, &gbuf);
309 for (size_t j = 0; j < gbuf.gl_pathc; j++) {
310 int ret1 = !stat(gbuf.gl_pathv[j], &st);
311 int ret2 = S_ISCHR(st.st_mode);
312 if (ret1) {
313 LOG_INFO("Serial port %s", gbuf.gl_pathv[j]);
314 LOG_INFO(" device mode: %X", st.st_mode);
315 LOG_INFO(" char device? %s", ret2 ? "Y" : "N");
316 } else
317 LOG_INFO("%s does not return stat query", gbuf.gl_pathv[j]);
318 if ( (ret1 && ret2 ) || strstr(gbuf.gl_pathv[j], "modem") )
319 add_combos (gbuf.gl_pathv[j]);
320 }
321 globfree(&gbuf);
322 }
323
324 set_combo_value();
325 }
326 #endif //__APPLE__
327 //======================================================================
328
329 //======================================================================
330 // FreeBSD init_port_combos
331 //======================================================================
332
333 #ifdef __FreeBSD__
334 #ifndef PATH_MAX
335 # define PATH_MAX 1024
336 #endif
337 # define TTY_MAX 8
338
init_port_combos()339 void init_port_combos()
340 {
341 int retval;
342 struct stat st;
343 char ttyname[PATH_MAX + 1];
344 const char* tty_fmt[] = {
345 "/dev/ttyd%u"
346 };
347
348 clear_combos();
349
350 for (size_t i = 0; i < sizeof(tty_fmt)/sizeof(*tty_fmt); i++) {
351 for (unsigned j = 0; j < TTY_MAX; j++) {
352 snprintf(ttyname, sizeof(ttyname), tty_fmt[i], j);
353 if ( !(stat(ttyname, &st) == 0 && S_ISCHR(st.st_mode)) )
354 continue;
355 LOG_WARN("Found serial port %s", ttyname);
356 add_combos(ttyname);
357 }
358 }
359 }
360 #endif //__FreeBSD__
361 //======================================================================
362
363 //======================================================================
364 // OpenBSD init_port_combos
365 //======================================================================
366
367 #ifdef __OpenBSD__
368
369 #ifndef PATH_MAX
370 # define PATH_MAX 1024
371 #endif
372 # define TTY_MAX 8
373
init_port_combos()374 void init_port_combos()
375 {
376 int retval;
377 struct stat st;
378 char ttyname[PATH_MAX + 1];
379 const char* tty_fmt[] = {
380 "/dev/ttyd%u",
381 "/dev/ttyU%u",
382 }
383
384 clear_combos();
385
386 for (size_t i = 0; i < sizeof(tty_fmt)/sizeof(*tty_fmt); i++) {
387 for (unsigned j = 0; j < TTY_MAX; j++) {
388 snprintf(ttyname, sizeof(ttyname), tty_fmt[i], j);
389 if ( !(stat(ttyname, &st) == 0 && S_ISCHR(st.st_mode)) )
390 continue;
391 LOG_WARN("Found serial port %s", ttyname);
392 add_combos(ttyname);
393 }
394 }
395 }
396
397 #endif //__OpenBSD__
398 //======================================================================
399
cbCIVdefault()400 void cbCIVdefault()
401 {
402 char hexstr[8];
403 int picked = selectRig->index();
404 rigbase *srig = rigs[picked];
405 snprintf(hexstr, sizeof(hexstr), "0x%02X", srig->defaultCIV);
406 txtCIV->value(hexstr);
407 progStatus.CIV = srig->defaultCIV;
408 srig->adjustCIV(progStatus.CIV);
409 }
410
cbCIV()411 void cbCIV()
412 {
413 int picked = selectRig->index();
414 int adr = 0;
415 rigbase *srig = rigs[picked];
416 sscanf(txtCIV->value(), "0x%2X", &adr);
417 progStatus.CIV = adr;
418 srig->adjustCIV(progStatus.CIV);
419 }
420
cbUSBaudio()421 void cbUSBaudio()
422 {
423 progStatus.USBaudio = btnUSBaudio->value();
424 }
425
configXcvr()426 void configXcvr()
427 {
428
429 selectCommPort->value(progStatus.xcvr_serial_port.c_str());
430 selectAuxPort->value(progStatus.aux_serial_port.c_str());
431 selectSepPTTPort->value(progStatus.sep_serial_port.c_str());
432
433 if (selrig->CIV) {
434 char hexstr[8];
435 snprintf(hexstr, sizeof(hexstr), "0x%02X", selrig->CIV);
436 txtCIV->value(hexstr);
437 txtCIV->activate();
438 btnCIVdefault->activate();
439 if (xcvr_name == rig_IC7200.name_ ||
440 xcvr_name == rig_IC7300.name_ ||
441 xcvr_name == rig_IC7600.name_ ) {
442 btnUSBaudio->value(progStatus.USBaudio);
443 btnUSBaudio->activate();
444 } else
445 btnUSBaudio->deactivate();
446 } else {
447 txtCIV->value("");
448 txtCIV->deactivate();
449 btnCIVdefault->deactivate();
450 btnUSBaudio->value(0);
451 btnUSBaudio->deactivate();
452 }
453
454 select_tab(_("Xcvr"));
455 }
456
open_poll_tab()457 void open_poll_tab()
458 {
459 select_tab(_("Poll"));
460 }
461
open_trace_tab()462 void open_trace_tab()
463 {
464 select_tab(_("Trace"));
465 }
466
open_commands_tab()467 void open_commands_tab()
468 {
469 select_tab(_("Cmds"));
470 }
471
open_restore_tab()472 void open_restore_tab()
473 {
474 select_tab(_("Restore"));
475 }
476
open_send_command_tab()477 void open_send_command_tab()
478 {
479 select_tab(_("Send"));
480 }
481
open_tcpip_tab()482 void open_tcpip_tab()
483 {
484 select_tab(_("TCPIP"));
485 }
486
open_ptt_tab()487 void open_ptt_tab()
488 {
489 select_tab(_("PTT"));
490 }
491
open_gpio_tab()492 void open_gpio_tab()
493 {
494 select_tab(_("GPIO"));
495 }
496
open_aux_tab()497 void open_aux_tab()
498 {
499 select_tab(_("Aux"));
500 }
501
open_server_tab()502 void open_server_tab()
503 {
504 select_tab(_("Server"));
505 }
506
createXcvrDialog()507 void createXcvrDialog()
508 {
509 dlgXcvrConfig = XcvrDialog();
510
511 init_port_combos();
512
513 mnuBaudrate->clear();
514 for (int i = 0; szBaudRates[i] != NULL; i++)
515 mnuBaudrate->add(szBaudRates[i]);
516
517 cbo_tt550_agc_level->add("slow");
518 cbo_tt550_agc_level->add("med");
519 cbo_tt550_agc_level->add("fast");
520 cbo_tt550_agc_level->index(progStatus.tt550_agc_level);
521
522 cbo_tt550_nb_level->add("NONE");
523 cbo_tt550_nb_level->add("1");
524 cbo_tt550_nb_level->add("2");
525 cbo_tt550_nb_level->add("3");
526 cbo_tt550_nb_level->add("4");
527 cbo_tt550_nb_level->add("5");
528 cbo_tt550_nb_level->add("6");
529 cbo_tt550_nb_level->add("7");
530 cbo_tt550_nb_level->index(progStatus.tt550_nb_level);
531
532 initRigCombo();
533 }
534
535 // Frequency display font / colors
536 Fl_Font selfont;
537
cbFreqControlFontBrowser(Fl_Widget *,void *)538 void cbFreqControlFontBrowser(Fl_Widget*, void*) {
539 selfont = fntbrowser->fontNumber();
540 lblTest->labelfont(selfont);
541 dlgDisplayConfig->redraw();
542 fntbrowser->hide();
543 }
544
cbPrefFont()545 void cbPrefFont()
546 {
547 fntbrowser->fontNumber(progStatus.fontnbr);
548 // fntbrowser->fontFilter(Font_Browser::FIXED_WIDTH);
549 // fntbrowser->fontFilter(Font_Browser::ALL_TYPES);
550 fntbrowser->callback(cbFreqControlFontBrowser);
551 fntbrowser->show();
552 }
553
554 uchar fg_red, fg_green, fg_blue;
555 uchar bg_red, bg_green, bg_blue;
556 uchar smeterRed, smeterGreen, smeterBlue;
557 uchar peakRed, peakGreen, peakBlue;
558 uchar pwrRed, pwrGreen, pwrBlue;
559 uchar swrRed, swrGreen, swrBlue;
560
561 Fl_Color bgclr;
562 Fl_Color fgclr;
563
564 Fl_Color fgsys;
565 static uchar fg_sys_red, fg_sys_green, fg_sys_blue;
566
567 Fl_Color bgsys;
568 static uchar bg_sys_red, bg_sys_green, bg_sys_blue;
569
570 Fl_Color bg2sys;
571 static uchar bg2_sys_red, bg2_sys_green, bg2_sys_blue;
572
573 Fl_Color bg_slider;
574 static uchar bg_slider_red, bg_slider_green, bg_slider_blue;
575
576 Fl_Color btn_slider;
577 static uchar btn_slider_red, btn_slider_green, btn_slider_blue;
578
579 Fl_Color btn_lt_color;
580 static uchar btn_lt_color_red, btn_lt_color_green, btn_lt_color_blue;
581
cb_lighted_button()582 void cb_lighted_button()
583 {
584 uchar r = btn_lt_color_red, g = btn_lt_color_green, b = btn_lt_color_blue;
585 if (fl_color_chooser("Foreground color", r, g, b)) {
586 btn_lt_color_red = r; btn_lt_color_green = g; btn_lt_color_blue = b;
587 btn_lt_color = fl_rgb_color(r, g, b);
588 btn_lighted->selection_color(btn_lt_color);
589 btn_lighted->value(1);
590 btn_lighted->redraw();
591 }
592 }
593
cb_lighted_default()594 void cb_lighted_default()
595 {
596 btn_lt_color = flrig_def_color(FL_YELLOW);
597 btn_lt_color_red = ((btn_lt_color >> 24) & 0xFF);
598 btn_lt_color_green = ((btn_lt_color >> 16) & 0xFF);
599 btn_lt_color_blue = ((btn_lt_color >> 8) & 0xFF);
600 btn_lighted->selection_color(btn_lt_color);
601 btn_lighted->value(1);
602 btn_lighted->redraw();
603 }
604
cb_change_hrd_button()605 void cb_change_hrd_button()
606 {
607 progStatus.hrd_buttons = !progStatus.hrd_buttons;
608 FreqDispA->set_hrd(progStatus.hrd_buttons);
609 FreqDispB->set_hrd(progStatus.hrd_buttons);
610 }
611
set_sliders_when()612 void set_sliders_when()
613 {
614 if (sldrSQUELCH)
615 sldrSQUELCH->when(progStatus.sliders_button);
616 if (sldrMICGAIN)
617 sldrMICGAIN->when(progStatus.sliders_button);
618 if (sldrIFSHIFT)
619 sldrIFSHIFT->when(progStatus.sliders_button);
620 if (sldrNR)
621 sldrNR->when(progStatus.sliders_button);
622 if (sldrNOTCH)
623 sldrNOTCH->when(progStatus.sliders_button);
624 if (sldrRFGAIN)
625 sldrRFGAIN->when(progStatus.sliders_button);
626 if (sldrINNER)
627 sldrINNER->when(progStatus.sliders_button);
628 if (sldrOUTER)
629 sldrOUTER->when(progStatus.sliders_button);
630 if (sldrPOWER)
631 sldrPOWER->when(progStatus.sliders_button);
632 if (sldrVOLUME)
633 sldrVOLUME->when(progStatus.sliders_button);
634 if (ic7610_digi_sel_val)
635 ic7610_digi_sel_val->when(progStatus.sliders_button);
636 if (sldr_nb_level)
637 sldr_nb_level->when(progStatus.sliders_button);
638 }
639
cb_change_sliders_button()640 void cb_change_sliders_button()
641 {
642 if (progStatus.sliders_button == FL_WHEN_CHANGED)
643 progStatus.sliders_button = FL_WHEN_RELEASE;
644 else
645 progStatus.sliders_button = FL_WHEN_CHANGED;
646 set_sliders_when();
647 }
648
cb_slider_defaults()649 void cb_slider_defaults()
650 {
651 bg_slider_red = 232;
652 bg_slider_green = 255;
653 bg_slider_blue = 232;
654
655 btn_slider_red = 0;
656 btn_slider_green = 0;
657 btn_slider_blue = 128;
658
659 bg_slider = fl_rgb_color( 232, 255, 232);
660 btn_slider = fl_rgb_color( 0, 0, 128);
661
662 sldrColors->color(bg_slider);
663 sldrColors->selection_color(btn_slider);
664 sldrColors->redraw();
665 }
666
cb_slider_background()667 void cb_slider_background()
668 {
669 uchar r = bg_slider_red, g = bg_slider_green, b = bg_slider_blue;
670 if (fl_color_chooser("Foreground color", r, g, b)) {
671 bg_slider_red = r; bg_slider_green = g; bg_slider_blue = b;
672 bg_slider = fl_rgb_color(r, g, b);
673 sldrColors->color(bg_slider);
674 sldrColors->selection_color(btn_slider);
675 sldrColors->redraw();
676 }
677 }
678
cb_slider_select()679 void cb_slider_select()
680 {
681 uchar r = btn_slider_red, g = btn_slider_green, b = btn_slider_blue;
682 if (fl_color_chooser("Foreground color", r, g, b)) {
683 btn_slider_red = r; btn_slider_green = g; btn_slider_blue = b;
684 btn_slider = fl_rgb_color(r, g, b);
685 sldrColors->color(bg_slider);
686 sldrColors->selection_color(btn_slider);
687 sldrColors->redraw();
688 }
689 }
690
cb_sys_defaults()691 void cb_sys_defaults()
692 {
693 bgsys = flrig_def_color(FL_BACKGROUND_COLOR);
694 bg_sys_red = ((bgsys >> 24) & 0xFF);
695 bg_sys_green = ((bgsys >> 16) & 0xFF);
696 bg_sys_blue = ((bgsys >> 8) & 0xFF);
697
698 bg2sys = flrig_def_color(FL_BACKGROUND2_COLOR);
699 bg2_sys_red = ((bg2sys) >> 24 & 0xFF);
700 bg2_sys_green = ((bg2sys) >> 16 & 0xFF);
701 bg2_sys_blue = ((bg2sys) >> 8 & 0xFF);
702
703 fgsys = flrig_def_color(FL_FOREGROUND_COLOR);
704 fg_sys_red = (fgsys >> 24) & 0xFF;
705 fg_sys_green = (fgsys >> 16) & 0xFF;
706 fg_sys_blue = (fgsys >> 8) & 0xFF;
707
708 Fl::background(bg_sys_red, bg_sys_green, bg_sys_blue);
709 Fl::background2(bg2_sys_red, bg2_sys_green, bg2_sys_blue);
710 Fl::foreground(fg_sys_red, fg_sys_green, fg_sys_blue);
711
712 dlgDisplayConfig->redraw();
713 mainwindow->redraw();
714 }
715
cb_sys_foreground()716 void cb_sys_foreground()
717 {
718 uchar r = fg_sys_red, g = fg_sys_green, b = fg_sys_blue;
719 if (fl_color_chooser("Foreground color", r, g, b)) {
720 fg_sys_red = r; fg_sys_green = g; fg_sys_blue = b;
721 fgsys = fl_rgb_color(r, g, b);
722 Fl::foreground(r, g, b);
723 dlgDisplayConfig->redraw();
724 mainwindow->redraw();
725 }
726 }
727
cb_sys_background()728 void cb_sys_background()
729 {
730 uchar r = bg_sys_red, g = bg_sys_green, b = bg_sys_blue;
731 if (fl_color_chooser("Background color", r, g, b)) {
732 bg_sys_red = r; bg_sys_green = g; bg_sys_blue = b;
733 bgsys = fl_rgb_color(r, g, b);
734 Fl::background(r, g, b);
735 dlgDisplayConfig->redraw();
736 mainwindow->redraw();
737 }
738 }
739
cb_sys_background2()740 void cb_sys_background2()
741 {
742 uchar r = bg2_sys_red, g = bg2_sys_green, b = bg2_sys_blue;
743 if (fl_color_chooser("Background2 color", r, g, b)) {
744 bg2_sys_red = r; bg2_sys_green = g; bg2_sys_blue = b;
745 bg2sys = fl_rgb_color(r, g, b);
746 Fl::background2(r, g, b);
747 dlgDisplayConfig->redraw();
748 mainwindow->redraw();
749 }
750 }
751
cbBacklightColor()752 void cbBacklightColor()
753 {
754 uchar r = bg_red, g = bg_green, b = bg_blue;
755 if (fl_color_chooser("Background color", r, g, b)) {
756 bg_red = r; bg_green = g; bg_blue = b;
757 bgclr = fl_rgb_color(r, g, b);
758 lblTest->color(bgclr);
759 sldrRcvSignalColor->color( fl_rgb_color (smeterRed, smeterGreen, smeterBlue), bgclr );
760 sldrPWRcolor->color(fl_rgb_color (pwrRed, pwrGreen, pwrBlue), bgclr);
761 sldrSWRcolor->color(fl_rgb_color (swrRed, swrGreen, swrBlue), bgclr);
762 scaleSmeterColor->color(bgclr);
763 scalePWRcolor->color(bgclr);
764 scaleSWRcolor->color(bgclr);
765 grpMeterColor->color(bgclr);
766 dlgDisplayConfig->redraw();
767 }
768 }
769
cbPrefForeground()770 void cbPrefForeground()
771 {
772 uchar r = fg_red, g = fg_green, b = fg_blue;
773 if (fl_color_chooser("Foreground color", r, g, b)) {
774 fg_red = r; fg_green = g; fg_blue = b;
775 fgclr = fl_rgb_color(r, g, b);
776 lblTest->labelcolor(fgclr);
777 scaleSmeterColor->labelcolor(fgclr);
778 scalePWRcolor->labelcolor(fgclr);
779 scaleSWRcolor->labelcolor(fgclr);
780 grpMeterColor->labelcolor(fgclr);
781 dlgDisplayConfig->redraw();
782 }
783 }
784
default_meters()785 void default_meters()
786 {
787 Fl_Color c;
788 bg_red = 232; bg_green = 255; bg_blue = 232;
789 bgclr = fl_rgb_color( bg_red, bg_green, bg_blue);
790 lblTest->color(bgclr);
791 sldrRcvSignalColor->color( fl_rgb_color (smeterRed, smeterGreen, smeterBlue), bgclr );
792 sldrPWRcolor->color(fl_rgb_color (pwrRed, pwrGreen, pwrBlue), bgclr);
793 sldrSWRcolor->color(fl_rgb_color (swrRed, swrGreen, swrBlue), bgclr);
794 scaleSmeterColor->color(bgclr);
795 scalePWRcolor->color(bgclr);
796 scaleSWRcolor->color(bgclr);
797 grpMeterColor->color(bgclr);
798 fg_red = 0; fg_green = 0; fg_blue = 0;
799 fgclr = (Fl_Color)0;
800 lblTest->labelcolor(fgclr);
801 scaleSmeterColor->labelcolor(fgclr);
802 scalePWRcolor->labelcolor(fgclr);
803 scaleSWRcolor->labelcolor(fgclr);
804 grpMeterColor->labelcolor(fgclr);
805 smeterRed = 0; smeterGreen = 180; smeterBlue = 0;
806 c = fl_rgb_color (smeterRed, smeterGreen, smeterBlue);
807 sldrRcvSignalColor->color(c, bgclr );
808 peakRed = 255; peakGreen = 0; peakBlue = 0;
809 c = fl_rgb_color( peakRed, peakGreen, peakBlue );
810 sldrRcvSignalColor->PeakColor(c);
811 sldrPWRcolor->PeakColor(c);
812 sldrSWRcolor->PeakColor(c);
813 pwrRed = 180; pwrGreen = 0; pwrBlue = 0;
814 c = fl_rgb_color( pwrRed, pwrGreen, pwrBlue );
815 sldrPWRcolor->color(c, bgclr);
816 swrRed = 148; swrGreen = 0; swrBlue = 148;
817 c = fl_rgb_color(swrRed, swrGreen, swrBlue);
818 sldrSWRcolor->color(c, bgclr);
819 dlgDisplayConfig->redraw();
820 }
821
cbSMeterColor()822 void cbSMeterColor()
823 {
824 uchar r = smeterRed, g = smeterGreen, b = smeterBlue;
825 if (fl_color_chooser("S Meter color", r, g, b)) {
826 smeterRed = r; smeterGreen = g; smeterBlue = b;
827 sldrRcvSignalColor->color(
828 fl_rgb_color (r, g, b),
829 bgclr );
830 dlgDisplayConfig->redraw();
831 }
832 }
833
cbPeakMeterColor()834 void cbPeakMeterColor()
835 {
836 uchar r = peakRed, g = peakGreen, b = peakBlue;
837 if (fl_color_chooser("Peak value color", r, g, b)) {
838 peakRed = r; peakGreen = g; peakBlue = b;
839 sldrRcvSignalColor->PeakColor(fl_rgb_color (r, g, b));
840 sldrPWRcolor->PeakColor(fl_rgb_color (r, g, b));
841 sldrSWRcolor->PeakColor(fl_rgb_color (r, g, b));
842 dlgDisplayConfig->redraw();
843 }
844 }
845
cbPwrMeterColor()846 void cbPwrMeterColor()
847 {
848 uchar r = pwrRed, g = pwrGreen, b = pwrBlue;
849 if (fl_color_chooser("Power color", r, g, b)) {
850 pwrRed = r; pwrGreen = g; pwrBlue = b;
851 sldrPWRcolor->color(
852 fl_rgb_color (r, g, b),
853 bgclr );
854 dlgDisplayConfig->redraw();
855 }
856 }
857
cbSWRMeterColor()858 void cbSWRMeterColor()
859 {
860 uchar r = swrRed, g = swrGreen, b = swrBlue;
861 if (fl_color_chooser("Power color", r, g, b)) {
862 swrRed = r; swrGreen = g; swrBlue = b;
863 sldrSWRcolor->color(
864 fl_rgb_color (swrRed, swrGreen, swrBlue),
865 bgclr );
866 dlgDisplayConfig->redraw();
867 }
868 }
869
setColors()870 void setColors()
871 {
872 progStatus.swrRed = swrRed;
873 progStatus.swrGreen = swrGreen;
874 progStatus.swrBlue = swrBlue;
875
876 progStatus.pwrRed = pwrRed;
877 progStatus.pwrGreen = pwrGreen;
878 progStatus.pwrBlue = pwrBlue;
879
880 progStatus.smeterRed = smeterRed;
881 progStatus.smeterGreen = smeterGreen;
882 progStatus.smeterBlue = smeterBlue;
883
884 progStatus.peakRed = peakRed;
885 progStatus.peakGreen = peakGreen;
886 progStatus.peakBlue = peakBlue;
887
888 progStatus.fg_red = fg_red;
889 progStatus.fg_green = fg_green;
890 progStatus.fg_blue = fg_blue;
891
892 progStatus.bg_red = bg_red;
893 progStatus.bg_green = bg_green;
894 progStatus.bg_blue = bg_blue;
895
896 progStatus.fontnbr = selfont;
897 FreqDispA->font(selfont);
898 FreqDispB->font(selfont);
899
900 progStatus.fg_sys_red = fg_sys_red;
901 progStatus.fg_sys_green = fg_sys_green;
902 progStatus.fg_sys_blue = fg_sys_blue;
903
904 progStatus.bg_sys_red = bg_sys_red;
905 progStatus.bg_sys_green = bg_sys_green;
906 progStatus.bg_sys_blue = bg_sys_blue;
907
908 progStatus.bg2_sys_red = bg2_sys_red;
909 progStatus.bg2_sys_green = bg2_sys_green;
910 progStatus.bg2_sys_blue = bg2_sys_blue;
911
912 progStatus.slider_red = bg_slider_red;
913 progStatus.slider_green = bg_slider_green;
914 progStatus.slider_blue = bg_slider_blue;
915
916 progStatus.slider_btn_red = btn_slider_red;
917 progStatus.slider_btn_green = btn_slider_green;
918 progStatus.slider_btn_blue = btn_slider_blue;
919
920 progStatus.lighted_btn_red = btn_lt_color_red;
921 progStatus.lighted_btn_green = btn_lt_color_green;
922 progStatus.lighted_btn_blue = btn_lt_color_blue;
923
924 if (useB) {
925 FreqDispB->SetONOFFCOLOR( fl_rgb_color(fg_red, fg_green, fg_blue), bgclr);
926 FreqDispA->SetONOFFCOLOR(
927 fl_rgb_color(fg_red, fg_green, fg_blue),
928 fl_color_average(bgclr, FL_BLACK, 0.87));
929 } else {
930 FreqDispA->SetONOFFCOLOR( fl_rgb_color(fg_red, fg_green, fg_blue), bgclr);
931 FreqDispB->SetONOFFCOLOR(
932 fl_rgb_color(fg_red, fg_green, fg_blue),
933 fl_color_average(bgclr, FL_BLACK, 0.87));
934 }
935
936 grpMeters->color(bgclr);
937
938 meter_fill_box->color(bgclr);
939
940 scaleSmeter->color(bgclr);
941 scaleSmeter->labelcolor(fgclr);
942
943 scalePower->color(bgclr);
944 scalePower->labelcolor(fgclr);
945
946 btnALC_SWR->color(bgclr);
947 btnALC_SWR->labelcolor(fgclr);
948 btnALC_SWR->redraw();
949
950 sldrFwdPwr->color(fl_rgb_color (pwrRed, pwrGreen, pwrBlue), bgclr);
951 sldrFwdPwr->PeakColor(fl_rgb_color(peakRed, peakGreen, peakBlue));
952
953 sldrRcvSignal->color(fl_rgb_color (smeterRed, smeterGreen, smeterBlue), bgclr);
954 sldrRcvSignal->PeakColor(fl_rgb_color(peakRed, peakGreen, peakBlue));
955
956 sldrALC->color(fl_rgb_color (swrRed, swrGreen, swrBlue), bgclr);
957 sldrALC->PeakColor(fl_rgb_color(peakRed, peakGreen, peakBlue));
958
959 sldrSWR->color(fl_rgb_color (swrRed, swrGreen, swrBlue), bgclr);
960 sldrSWR->PeakColor(fl_rgb_color(peakRed, peakGreen, peakBlue));
961
962 grpMeters->redraw();
963
964 if (btnVol) btnVol->selection_color(btn_lt_color);
965 if (btnNR) btnNR->selection_color(btn_lt_color);
966 if (btnIFsh) btnIFsh->selection_color(btn_lt_color);
967 if (btnNotch) btnNotch->selection_color(btn_lt_color);
968 if (btnA) btnA->selection_color(btn_lt_color);
969 if (btnB) btnB->selection_color(btn_lt_color);
970 if (btnSplit) btnSplit->selection_color(btn_lt_color);
971 if (btnAttenuator) btnAttenuator->selection_color(btn_lt_color);
972 if (btnPreamp) btnPreamp->selection_color(btn_lt_color);
973 if (btnNOISE) btnNOISE->selection_color(btn_lt_color);
974 if (btnAutoNotch) btnAutoNotch->selection_color(btn_lt_color);
975 if (btnTune) btnTune->selection_color(btn_lt_color);
976 if (btnPTT) btnPTT->selection_color(btn_lt_color);
977 if (btnLOCK) btnLOCK->selection_color(btn_lt_color);
978 if (btnAuxRTS) btnAuxRTS->selection_color(btn_lt_color);
979 if (btnAuxDTR) btnAuxDTR->selection_color(btn_lt_color);
980 if (btnSpot) btnSpot->selection_color(btn_lt_color);
981 if (btn_vox) btn_vox->selection_color(btn_lt_color);
982 if (btnCompON) btnCompON->selection_color(btn_lt_color);
983 if (btn_tt550_vox) btn_tt550_vox->selection_color(btn_lt_color);
984 if (btn_tt550_CompON) btn_tt550_CompON->selection_color(btn_lt_color);
985
986 if (sldrVOLUME) sldrVOLUME->color(bg_slider);
987 if (sldrVOLUME) sldrVOLUME->selection_color(btn_slider);
988 if (sldrRFGAIN) sldrRFGAIN->color(bg_slider);
989 if (sldrRFGAIN) sldrRFGAIN->selection_color(btn_slider);
990 if (sldrSQUELCH) sldrSQUELCH->color(bg_slider);
991 if (sldrSQUELCH) sldrSQUELCH->selection_color(btn_slider);
992 if (sldrNR) sldrNR->color(bg_slider);
993 if (sldrNR) sldrNR->selection_color(btn_slider);
994 if (sldrIFSHIFT) sldrIFSHIFT->color(bg_slider);
995 if (sldrIFSHIFT) sldrIFSHIFT->selection_color(btn_slider);
996 if (sldrINNER) sldrINNER->color(bg_slider);
997 if (sldrINNER) sldrINNER->selection_color(btn_slider);
998 if (sldrOUTER) sldrOUTER->color(bg_slider);
999 if (sldrOUTER) sldrOUTER->selection_color(btn_slider);
1000 if (sldrNOTCH) sldrNOTCH->color(bg_slider);
1001 if (sldrNOTCH) sldrNOTCH->selection_color(btn_slider);
1002 if (sldrMICGAIN) sldrMICGAIN->color(bg_slider);
1003 if (sldrMICGAIN) sldrMICGAIN->selection_color(btn_slider);
1004 if (sldrPOWER) sldrPOWER->color(bg_slider);
1005 if (sldrPOWER) sldrPOWER->selection_color(btn_slider);
1006
1007 if (spnrPOWER) spnrPOWER->color(bg_slider);
1008 if (spnrVOLUME) spnrVOLUME->color(bg_slider);
1009
1010 mainwindow->redraw();
1011 }
1012
cb_reset_display_dialog()1013 void cb_reset_display_dialog()
1014 {
1015 cb_sys_defaults();
1016 cb_lighted_default();
1017 cb_slider_defaults();
1018 default_meters();
1019 setColors();
1020 }
1021
cbOkDisplayDialog()1022 void cbOkDisplayDialog()
1023 {
1024 setColors();
1025 dlgDisplayConfig->hide();
1026 }
1027
cbCancelDisplayDialog()1028 void cbCancelDisplayDialog()
1029 {
1030 dlgDisplayConfig->hide();
1031 }
1032
setDisplayColors()1033 void setDisplayColors()
1034 {
1035 if (dlgDisplayConfig == NULL)
1036 return;
1037
1038 swrRed = progStatus.swrRed;
1039 swrGreen = progStatus.swrGreen;
1040 swrBlue = progStatus.swrBlue;
1041
1042 pwrRed = progStatus.pwrRed;
1043 pwrGreen = progStatus.pwrGreen;
1044 pwrBlue = progStatus.pwrBlue;
1045
1046 smeterRed = progStatus.smeterRed;
1047 smeterGreen = progStatus.smeterGreen;
1048 smeterBlue = progStatus.smeterBlue;
1049
1050 peakRed = progStatus.peakRed;
1051 peakGreen = progStatus.peakGreen;
1052 peakBlue = progStatus.peakBlue;
1053
1054 fg_red = progStatus.fg_red;
1055 fg_green = progStatus.fg_green;
1056 fg_blue = progStatus.fg_blue;
1057
1058 bg_red = progStatus.bg_red;
1059 bg_green = progStatus.bg_green;
1060 bg_blue = progStatus.bg_blue;
1061
1062 bgclr = fl_rgb_color(bg_red, bg_green, bg_blue);
1063 fgclr = fl_rgb_color(fg_red, fg_green, fg_blue);
1064
1065 fg_sys_red = progStatus.fg_sys_red;
1066 fg_sys_green = progStatus.fg_sys_green;
1067 fg_sys_blue = progStatus.fg_sys_blue;
1068
1069 bg_sys_red = progStatus.bg_sys_red;
1070 bg_sys_green = progStatus.bg_sys_green;
1071 bg_sys_blue = progStatus.bg_sys_blue;
1072
1073 bg2_sys_red = progStatus.bg2_sys_red;
1074 bg2_sys_green = progStatus.bg2_sys_green;
1075 bg2_sys_blue = progStatus.bg2_sys_blue;
1076
1077 bg_slider_red = progStatus.slider_red;
1078 bg_slider_green = progStatus.slider_green;
1079 bg_slider_blue = progStatus.slider_blue;
1080
1081 btn_slider_red = progStatus.slider_btn_red;
1082 btn_slider_green = progStatus.slider_btn_green;
1083 btn_slider_blue = progStatus.slider_btn_blue;
1084
1085 sldrColors->color(fl_rgb_color(bg_slider_red, bg_slider_green, bg_slider_blue));
1086 sldrColors->selection_color(fl_rgb_color(btn_slider_red, btn_slider_green, btn_slider_blue));
1087
1088 btn_lt_color_red = progStatus.lighted_btn_red;
1089 btn_lt_color_green = progStatus.lighted_btn_green;
1090 btn_lt_color_blue = progStatus.lighted_btn_blue;
1091
1092 lblTest->labelcolor(fl_rgb_color(fg_red, fg_green, fg_blue));
1093 lblTest->color(bgclr);
1094
1095 scaleSmeterColor->color(bgclr);
1096 scaleSmeterColor->labelcolor(fgclr);
1097 scalePWRcolor->color(bgclr);
1098 scalePWRcolor->labelcolor(fgclr);
1099 scaleSWRcolor->color(bgclr);
1100 scaleSWRcolor->labelcolor(fgclr);
1101 grpMeterColor->color(bgclr);
1102 grpMeterColor->labelcolor(fgclr);
1103
1104 sldrRcvSignalColor->color(
1105 fl_rgb_color (smeterRed, smeterGreen, smeterBlue),
1106 bgclr );
1107 sldrPWRcolor->color(
1108 fl_rgb_color (pwrRed, pwrGreen, pwrBlue),
1109 bgclr );
1110 sldrSWRcolor->color(
1111 fl_rgb_color (swrRed, swrGreen, swrBlue),
1112 bgclr );
1113
1114 sldrRcvSignalColor->minimum(0);
1115 sldrRcvSignalColor->maximum(100);
1116 sldrRcvSignalColor->value(25);
1117
1118 sldrPWRcolor->minimum(0);
1119 sldrPWRcolor->maximum(100);
1120 sldrPWRcolor->value(25);
1121
1122 sldrSWRcolor->minimum(0);
1123 sldrSWRcolor->maximum(100);
1124 sldrSWRcolor->value(25);
1125
1126 btn_lt_color = fl_rgb_color( btn_lt_color_red, btn_lt_color_green, btn_lt_color_blue);
1127 btn_slider = fl_rgb_color( btn_slider_red, btn_slider_green, btn_slider_blue);
1128 bg_slider = fl_rgb_color(bg_slider_red, bg_slider_green, bg_slider_blue);
1129
1130 btn_lighted->value(1);
1131 btn_lighted->selection_color(btn_lt_color);
1132
1133 sldrColors->color(bg_slider);
1134 sldrColors->selection_color(btn_slider);
1135
1136 mnuScheme->value(mnuScheme->find_item(progStatus.ui_scheme.c_str()));
1137
1138 dlgDisplayConfig->show();
1139 }
1140
cbCloseMemory()1141 void cbCloseMemory()
1142 {
1143 dlgMemoryDialog->hide();
1144 }
1145
openMemoryDialog()1146 void openMemoryDialog()
1147 {
1148 if (dlgMemoryDialog == NULL)
1149 return;
1150 dlgMemoryDialog->show();
1151 }
1152
show_controls()1153 void show_controls()
1154 {
1155 switch (progStatus.UIsize) {
1156 case touch_ui :
1157 if (selrig->name_ == rig_TT550.name_) {
1158 tabs550->show();
1159 tabsGeneric->hide();
1160 } else {
1161 tabs550->hide();
1162 tabsGeneric->show();
1163 }
1164 tabs550->redraw();
1165 tabsGeneric->redraw();
1166 mainwindow->redraw();
1167 break;
1168 case wide_ui :
1169 case small_ui :
1170 if (selrig->name_ == rig_TT550.name_) {
1171 tabsGeneric->hide();
1172 tabs550->show();
1173 } else {
1174 tabs550->hide();
1175 tabsGeneric->show();
1176 }
1177 if (tabs_dialog->visible())
1178 tabs_dialog->hide();
1179 else {
1180 tabs_dialog->resize(
1181 mainwindow->x(), mainwindow->y() + mainwindow->decorated_h(),
1182 mainwindow->w(), tabs_dialog->h());
1183 tabs_dialog->show();
1184 }
1185 break;
1186 default :
1187 break;
1188 }
1189 }
1190
1191 // a replica of the default color map used by Fltk
1192
1193 static unsigned flrig_cmap[256] = {
1194 0x00000000,
1195 0xff000000,
1196 0x00ff0000,
1197 0xffff0000,
1198 0x0000ff00,
1199 0xff00ff00,
1200 0x00ffff00,
1201 0xffffff00,
1202 0x55555500,
1203 0xc6717100,
1204 0x71c67100,
1205 0x8e8e3800,
1206 0x7171c600,
1207 0x8e388e00,
1208 0x388e8e00,
1209 0x00008000,
1210 0xa8a89800,
1211 0xe8e8d800,
1212 0x68685800,
1213 0x98a8a800,
1214 0xd8e8e800,
1215 0x58686800,
1216 0x9c9ca800,
1217 0xdcdce800,
1218 0x5c5c6800,
1219 0x9ca89c00,
1220 0xdce8dc00,
1221 0x5c685c00,
1222 0x90909000,
1223 0xc0c0c000,
1224 0x50505000,
1225 0xa0a0a000,
1226 0x00000000,
1227 0x0d0d0d00,
1228 0x1a1a1a00,
1229 0x26262600,
1230 0x31313100,
1231 0x3d3d3d00,
1232 0x48484800,
1233 0x55555500,
1234 0x5f5f5f00,
1235 0x6a6a6a00,
1236 0x75757500,
1237 0x80808000,
1238 0x8a8a8a00,
1239 0x95959500,
1240 0xa0a0a000,
1241 0xaaaaaa00,
1242 0xb5b5b500,
1243 0xc0c0c000,
1244 0xcbcbcb00,
1245 0xd5d5d500,
1246 0xe0e0e000,
1247 0xeaeaea00,
1248 0xf5f5f500,
1249 0xffffff00,
1250 0x00000000,
1251 0x00240000,
1252 0x00480000,
1253 0x006d0000,
1254 0x00910000,
1255 0x00b60000,
1256 0x00da0000,
1257 0x00ff0000,
1258 0x3f000000,
1259 0x3f240000,
1260 0x3f480000,
1261 0x3f6d0000,
1262 0x3f910000,
1263 0x3fb60000,
1264 0x3fda0000,
1265 0x3fff0000,
1266 0x7f000000,
1267 0x7f240000,
1268 0x7f480000,
1269 0x7f6d0000,
1270 0x7f910000,
1271 0x7fb60000,
1272 0x7fda0000,
1273 0x7fff0000,
1274 0xbf000000,
1275 0xbf240000,
1276 0xbf480000,
1277 0xbf6d0000,
1278 0xbf910000,
1279 0xbfb60000,
1280 0xbfda0000,
1281 0xbfff0000,
1282 0xff000000,
1283 0xff240000,
1284 0xff480000,
1285 0xff6d0000,
1286 0xff910000,
1287 0xffb60000,
1288 0xffda0000,
1289 0xffff0000,
1290 0x00003f00,
1291 0x00243f00,
1292 0x00483f00,
1293 0x006d3f00,
1294 0x00913f00,
1295 0x00b63f00,
1296 0x00da3f00,
1297 0x00ff3f00,
1298 0x3f003f00,
1299 0x3f243f00,
1300 0x3f483f00,
1301 0x3f6d3f00,
1302 0x3f913f00,
1303 0x3fb63f00,
1304 0x3fda3f00,
1305 0x3fff3f00,
1306 0x7f003f00,
1307 0x7f243f00,
1308 0x7f483f00,
1309 0x7f6d3f00,
1310 0x7f913f00,
1311 0x7fb63f00,
1312 0x7fda3f00,
1313 0x7fff3f00,
1314 0xbf003f00,
1315 0xbf243f00,
1316 0xbf483f00,
1317 0xbf6d3f00,
1318 0xbf913f00,
1319 0xbfb63f00,
1320 0xbfda3f00,
1321 0xbfff3f00,
1322 0xff003f00,
1323 0xff243f00,
1324 0xff483f00,
1325 0xff6d3f00,
1326 0xff913f00,
1327 0xffb63f00,
1328 0xffda3f00,
1329 0xffff3f00,
1330 0x00007f00,
1331 0x00247f00,
1332 0x00487f00,
1333 0x006d7f00,
1334 0x00917f00,
1335 0x00b67f00,
1336 0x00da7f00,
1337 0x00ff7f00,
1338 0x3f007f00,
1339 0x3f247f00,
1340 0x3f487f00,
1341 0x3f6d7f00,
1342 0x3f917f00,
1343 0x3fb67f00,
1344 0x3fda7f00,
1345 0x3fff7f00,
1346 0x7f007f00,
1347 0x7f247f00,
1348 0x7f487f00,
1349 0x7f6d7f00,
1350 0x7f917f00,
1351 0x7fb67f00,
1352 0x7fda7f00,
1353 0x7fff7f00,
1354 0xbf007f00,
1355 0xbf247f00,
1356 0xbf487f00,
1357 0xbf6d7f00,
1358 0xbf917f00,
1359 0xbfb67f00,
1360 0xbfda7f00,
1361 0xbfff7f00,
1362 0xff007f00,
1363 0xff247f00,
1364 0xff487f00,
1365 0xff6d7f00,
1366 0xff917f00,
1367 0xffb67f00,
1368 0xffda7f00,
1369 0xffff7f00,
1370 0x0000bf00,
1371 0x0024bf00,
1372 0x0048bf00,
1373 0x006dbf00,
1374 0x0091bf00,
1375 0x00b6bf00,
1376 0x00dabf00,
1377 0x00ffbf00,
1378 0x3f00bf00,
1379 0x3f24bf00,
1380 0x3f48bf00,
1381 0x3f6dbf00,
1382 0x3f91bf00,
1383 0x3fb6bf00,
1384 0x3fdabf00,
1385 0x3fffbf00,
1386 0x7f00bf00,
1387 0x7f24bf00,
1388 0x7f48bf00,
1389 0x7f6dbf00,
1390 0x7f91bf00,
1391 0x7fb6bf00,
1392 0x7fdabf00,
1393 0x7fffbf00,
1394 0xbf00bf00,
1395 0xbf24bf00,
1396 0xbf48bf00,
1397 0xbf6dbf00,
1398 0xbf91bf00,
1399 0xbfb6bf00,
1400 0xbfdabf00,
1401 0xbfffbf00,
1402 0xff00bf00,
1403 0xff24bf00,
1404 0xff48bf00,
1405 0xff6dbf00,
1406 0xff91bf00,
1407 0xffb6bf00,
1408 0xffdabf00,
1409 0xffffbf00,
1410 0x0000ff00,
1411 0x0024ff00,
1412 0x0048ff00,
1413 0x006dff00,
1414 0x0091ff00,
1415 0x00b6ff00,
1416 0x00daff00,
1417 0x00ffff00,
1418 0x3f00ff00,
1419 0x3f24ff00,
1420 0x3f48ff00,
1421 0x3f6dff00,
1422 0x3f91ff00,
1423 0x3fb6ff00,
1424 0x3fdaff00,
1425 0x3fffff00,
1426 0x7f00ff00,
1427 0x7f24ff00,
1428 0x7f48ff00,
1429 0x7f6dff00,
1430 0x7f91ff00,
1431 0x7fb6ff00,
1432 0x7fdaff00,
1433 0x7fffff00,
1434 0xbf00ff00,
1435 0xbf24ff00,
1436 0xbf48ff00,
1437 0xbf6dff00,
1438 0xbf91ff00,
1439 0xbfb6ff00,
1440 0xbfdaff00,
1441 0xbfffff00,
1442 0xff00ff00,
1443 0xff24ff00,
1444 0xff48ff00,
1445 0xff6dff00,
1446 0xff91ff00,
1447 0xffb6ff00,
1448 0xffdaff00,
1449 0xffffff00
1450 };
1451
flrig_def_color(int n)1452 Fl_Color flrig_def_color(int n)
1453 {
1454 if ( n > 255 ) n = 255;
1455 if (n < 0) n = 0;
1456 return (Fl_Color)flrig_cmap[n];
1457 }
1458
1459
cb_send_command(string command,Fl_Output * resp)1460 void cb_send_command(string command, Fl_Output *resp)
1461 {
1462 if (command.empty()) return;
1463 bool usehex = false;
1464 if (command.empty()) return;
1465 string cmd = "";
1466 if (command.find("x") != string::npos) { // hex strings
1467 size_t p = 0;
1468 usehex = true;
1469 unsigned int val;
1470 while (( p = command.find("x", p)) != string::npos) {
1471 sscanf(&command[p+1], "%x", &val);
1472 cmd += (unsigned char) val;
1473 p += 3;
1474 }
1475 } else
1476 cmd = command;
1477
1478 if (resp) {
1479 resp->value("");
1480 resp->redraw();
1481 }
1482
1483 // lock out polling loops until done
1484 guard_lock lock1(&mutex_srvc_reqs);
1485 guard_lock lock2(&mutex_serial);
1486
1487 sendCommand(cmd, 0);//cmd.length());
1488 set_trace(2, "command: ", command.c_str());
1489 waitResponse(100);
1490
1491 std::string retstr = usehex ?
1492 str2hex(respstr.c_str(), respstr.length()) :
1493 respstr;
1494 set_trace(2, "response: ", retstr.c_str());
1495
1496 if (resp) {
1497 resp->value(retstr.c_str());
1498 resp->redraw();
1499 }
1500 }
1501