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