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 <sstream>
22 #include <string>
23 
24 #include "dialogs.h"
25 #include "ICbase.h"
26 #include "trace.h"
27 #include "xml_server.h"
28 
29 #include "XmlRpc.h"
30 
31 Fl_Group *tabXCVR = (Fl_Group *)0;
32 	Fl_ComboBox *selectRig = (Fl_ComboBox *)0;
33 	Fl_Counter *cntRigCatRetries = (Fl_Counter *)0;
34 	Fl_Counter *cntRigCatTimeout = (Fl_Counter *)0;
35 	Fl_Counter *cntRigCatWait = (Fl_Counter *)0;
36 	Fl_Counter *query_interval = (Fl_Counter *)0;
37 	Fl_Counter *byte_interval = (Fl_Counter *)0;
38 	Fl_ComboBox *selectCommPort = (Fl_ComboBox *)0;
39 	Fl_ComboBox *mnuBaudrate = (Fl_ComboBox *)0;
40 	Fl_Check_Button *btnTwoStopBit = (Fl_Check_Button *)0;
41 	Fl_Check_Button *btnOneStopBit = (Fl_Check_Button *)0;
42 	Fl_Check_Button *btnRigCatEcho = (Fl_Check_Button *)0;
43 	Fl_Check_Button *btncatptt = (Fl_Check_Button *)0;
44 	Fl_Check_Button *btnrtsptt = (Fl_Check_Button *)0;
45 	Fl_Check_Button *btndtrptt = (Fl_Check_Button *)0;
46 	Fl_Check_Button *chkrtscts = (Fl_Check_Button *)0;
47 	Fl_Check_Button *btnrtsplus = (Fl_Check_Button *)0;
48 	Fl_Check_Button *btndtrplus = (Fl_Check_Button *)0;
49 	//Fl_Check_Button *btn_notxqsy = (Fl_Check_Button *)0;
50 	Fl_Int_Input *txtCIV = (Fl_Int_Input *)0;
51 	Fl_Button *btnCIVdefault = (Fl_Button *)0;
52 	Fl_Check_Button *btnUSBaudio = (Fl_Check_Button *)0;
53 
54 Fl_Group *tabTCPIP = (Fl_Group *)0;
55 	Fl_Input2 *inp_tcpip_addr = (Fl_Input2 *)0;
56 	Fl_Input2 *inp_tcpip_port = (Fl_Input2 *)0;
57 	Fl_Check_Button *chk_use_tcpip = (Fl_Check_Button *)0;
58 	Fl_Box *box_tcpip_connect = (Fl_Box *)0;
59 	Fl_Counter *inp_tcpip_ping_delay = (Fl_Counter *)0;
60 	Fl_Counter *cntRetryAfter = (Fl_Counter *)0;
61 	Fl_Counter *cntDropsAllowed = (Fl_Counter *)0;
62 
63 Fl_Group *tabPTT = (Fl_Group *)0;
64 	Fl_ComboBox *selectSepPTTPort = (Fl_ComboBox *)0;
65 	Fl_Check_Button *btnSep_SCU_17 = (Fl_Check_Button *)0;
66 	Fl_Check_Button *btnSepRTSptt = (Fl_Check_Button *)0;
67 	Fl_Check_Button *btnSepRTSplus = (Fl_Check_Button *)0;
68 	Fl_Check_Button *btnSepDTRptt = (Fl_Check_Button *)0;
69 	Fl_Check_Button *btnSepDTRplus = (Fl_Check_Button *)0;
70 
71 Fl_Group *tabGPIO = (Fl_Group *)0;
72 	Fl_Check_Button *btn_enable_gpio[17];
73 	Fl_Check_Button *btn_gpio_on[17];
74 	Fl_Counter *cnt_gpio_pulse_width;
75 
76 Fl_Group *tabAUX = (Fl_Group *)0;
77 	Fl_ComboBox *selectAuxPort = (Fl_ComboBox *)0;
78 	Fl_Check_Button *btnAux_SCU_17 = (Fl_Check_Button *)0;
79 
80 Fl_Group *tabSERVER = (Fl_Group *)0;
81 	Fl_Box *server_text = (Fl_Box *)0;
82 	Fl_Input2 *inp_serverport = (Fl_Input2 *)0;
83 	Fl_Box *box_fldigi_connect = (Fl_Box *)0;
84 
85 Fl_Group *tabPOLLING = (Fl_Group *)0;
86 	Fl_Value_Input *poll_smeter = (Fl_Value_Input *)0;
87 	Fl_Value_Input *poll_pout = (Fl_Value_Input *)0;
88 	Fl_Value_Input *poll_swr = (Fl_Value_Input *)0;
89 	Fl_Value_Input *poll_alc = (Fl_Value_Input *)0;
90 	Fl_Value_Input *poll_frequency = (Fl_Value_Input *)0;
91 	Fl_Value_Input *poll_mode = (Fl_Value_Input *)0;
92 	Fl_Value_Input *poll_bandwidth = (Fl_Value_Input *)0;
93 	Fl_Value_Input *poll_volume = (Fl_Value_Input *)0;
94 	Fl_Value_Input *poll_micgain = (Fl_Value_Input *)0;
95 	Fl_Value_Input *poll_rfgain = (Fl_Value_Input *)0;
96 	Fl_Value_Input *poll_power_control = (Fl_Value_Input *)0;
97 	Fl_Value_Input *poll_ifshift = (Fl_Value_Input *)0;
98 	Fl_Value_Input *poll_notch = (Fl_Value_Input *)0;
99 	Fl_Value_Input *poll_auto_notch = (Fl_Value_Input *)0;
100 	Fl_Value_Input *poll_pre_att = (Fl_Value_Input *)0;
101 	Fl_Value_Input *poll_squelch = (Fl_Value_Input *)0;
102 	Fl_Value_Input *poll_split = (Fl_Value_Input *)0;
103 	Fl_Value_Input *poll_noise = (Fl_Value_Input *)0;
104 	Fl_Value_Input *poll_nr = (Fl_Value_Input *)0;
105 	Fl_Value_Input *poll_compression = (Fl_Value_Input *)0;
106 	Fl_Value_Input *poll_tuner = (Fl_Value_Input *)0;
107 	Fl_Value_Input *poll_ptt = (Fl_Value_Input *)0;
108 	Fl_Value_Input *poll_break_in = (Fl_Value_Input *)0;
109 	Fl_Button *btnClearAddControls = (Fl_Button *)0;
110 
111 	Fl_Value_Input *poll_meters = (Fl_Value_Input *)0;
112 	Fl_Button *btnSetMeters = (Fl_Button *)0;
113 	Fl_Value_Input *poll_ops = (Fl_Value_Input *)0;
114 	Fl_Button *btnSetOps = (Fl_Button *)0;
115 	Fl_Value_Input *poll_all = (Fl_Value_Input *)0;
116 	Fl_Button *btnSetAdd = (Fl_Button *)0;
117 
118 Fl_Group *tabSNDCMD = (Fl_Group *)0;
119 	Fl_Input2 *txt_command = (Fl_Input2 *)0;
120 	Fl_Button *btn_icom_pre = (Fl_Button *)0;
121 	Fl_Button *btn_icom_post = (Fl_Button *)0;
122 	Fl_Button *btn_send_command = (Fl_Button *)0;
123 	Fl_Output *txt_response = (Fl_Output *)0;
124 	Fl_Box *box_xcvr_connect = (Fl_Box *)0;
125 
126 Fl_Button *btn_init_ser_port = (Fl_Button *)0;
127 Fl_Button *btn2_init_ser_port = (Fl_Button *)0;
128 
129 Fl_Button *btnCloseCommConfig = (Fl_Button *)0;
130 Fl_Button *btnOkSepSerial = (Fl_Button *)0;
131 Fl_Button *btnOkAuxSerial = (Fl_Button *)0;
132 
133 Fl_Group *tabTRACE = (Fl_Group *)0;
134 	Fl_Check_Button *btn_trace = (Fl_Check_Button *)0;
135 	Fl_Check_Button *btn_xmltrace = (Fl_Check_Button *)0;
136 	Fl_Check_Button *btn_rigtrace = (Fl_Check_Button *)0;
137 	Fl_Check_Button *btn_gettrace = (Fl_Check_Button *)0;
138 	Fl_Check_Button *btn_settrace = (Fl_Check_Button *)0;
139 	Fl_Check_Button *btn_debugtrace = (Fl_Check_Button *)0;
140 	Fl_Check_Button *btn_rpctrace = (Fl_Check_Button *)0;
141 	Fl_Check_Button *btn_start_stop_trace = (Fl_Check_Button *)0;
142 	Fl_ComboBox *selectlevel = (Fl_ComboBox *)0;
143 	Fl_Button *btn_viewtrace = (Fl_Button *)0;
144 
145 Fl_Group *tabCOMMANDS = (Fl_Group *)0;
146 	Fl_Tabs  *tabCmds = (Fl_Tabs *)0;
147 	Fl_Group *tabCmds1 = (Fl_Group *)0;
148 	Fl_Group *tabCmds2 = (Fl_Group *)0;
149 	Fl_Group *tabCmds3 = (Fl_Group *)0;
150 	Fl_Group *tabCmds4 = (Fl_Group *)0;
151 	Fl_Group *tabCmds5 = (Fl_Group *)0;
152 	Fl_Group *tabCmds6 = (Fl_Group *)0;
153 
154 	Fl_Box *bx1a = (Fl_Box *)0;
155 	Fl_Box *bx1b = (Fl_Box *)0;
156 	Fl_Box *bx2a = (Fl_Box *)0;
157 	Fl_Box *bx2b = (Fl_Box *)0;
158 	Fl_Box *bx3a = (Fl_Box *)0;
159 	Fl_Box *bx3b = (Fl_Box *)0;
160 	Fl_Box *bx4a = (Fl_Box *)0;
161 	Fl_Box *bx4b = (Fl_Box *)0;
162 	Fl_Box *bx5a = (Fl_Box *)0;
163 	Fl_Box *bx5b = (Fl_Box *)0;
164 	Fl_Box *bx6a = (Fl_Box *)0;
165 	Fl_Box *bx6b = (Fl_Box *)0;
166 
167 	Fl_Input2 * cmdlbl1 = (Fl_Input2 *)0;
168 	Fl_Input2 * cmdlbl2 = (Fl_Input2 *)0;
169 	Fl_Input2 * cmdlbl3 = (Fl_Input2 *)0;
170 	Fl_Input2 * cmdlbl4 = (Fl_Input2 *)0;
171 	Fl_Input2 * cmdlbl5 = (Fl_Input2 *)0;
172 	Fl_Input2 * cmdlbl6 = (Fl_Input2 *)0;
173 	Fl_Input2 * cmdlbl7 = (Fl_Input2 *)0;
174 	Fl_Input2 * cmdlbl8 = (Fl_Input2 *)0;
175 	Fl_Input2 * cmdlbl9 = (Fl_Input2 *)0;
176 	Fl_Input2 * cmdlbl10 = (Fl_Input2 *)0;
177 	Fl_Input2 * cmdlbl11 = (Fl_Input2 *)0;
178 	Fl_Input2 * cmdlbl12 = (Fl_Input2 *)0;
179 	Fl_Input2 * cmdlbl13 = (Fl_Input2 *)0;
180 	Fl_Input2 * cmdlbl14 = (Fl_Input2 *)0;
181 	Fl_Input2 * cmdlbl15 = (Fl_Input2 *)0;
182 	Fl_Input2 * cmdlbl16 = (Fl_Input2 *)0;
183 	Fl_Input2 * cmdlbl17 = (Fl_Input2 *)0;
184 	Fl_Input2 * cmdlbl18 = (Fl_Input2 *)0;
185 	Fl_Input2 * cmdlbl19 = (Fl_Input2 *)0;
186 	Fl_Input2 * cmdlbl20 = (Fl_Input2 *)0;
187 	Fl_Input2 * cmdlbl21 = (Fl_Input2 *)0;
188 	Fl_Input2 * cmdlbl22 = (Fl_Input2 *)0;
189 	Fl_Input2 * cmdlbl23 = (Fl_Input2 *)0;
190 	Fl_Input2 * cmdlbl24 = (Fl_Input2 *)0;
191 
192 	Fl_Input2 * cmdtext1 = (Fl_Input2 *)0;
193 	Fl_Input2 * cmdtext2 = (Fl_Input2 *)0;
194 	Fl_Input2 * cmdtext3 = (Fl_Input2 *)0;
195 	Fl_Input2 * cmdtext4 = (Fl_Input2 *)0;
196 	Fl_Input2 * cmdtext5 = (Fl_Input2 *)0;
197 	Fl_Input2 * cmdtext6 = (Fl_Input2 *)0;
198 	Fl_Input2 * cmdtext7 = (Fl_Input2 *)0;
199 	Fl_Input2 * cmdtext8 = (Fl_Input2 *)0;
200 	Fl_Input2 * cmdtext9 = (Fl_Input2 *)0;
201 	Fl_Input2 * cmdtext10 = (Fl_Input2 *)0;
202 	Fl_Input2 * cmdtext11 = (Fl_Input2 *)0;
203 	Fl_Input2 * cmdtext12 = (Fl_Input2 *)0;
204 	Fl_Input2 * cmdtext13 = (Fl_Input2 *)0;
205 	Fl_Input2 * cmdtext14 = (Fl_Input2 *)0;
206 	Fl_Input2 * cmdtext15 = (Fl_Input2 *)0;
207 	Fl_Input2 * cmdtext16 = (Fl_Input2 *)0;
208 	Fl_Input2 * cmdtext17 = (Fl_Input2 *)0;
209 	Fl_Input2 * cmdtext18 = (Fl_Input2 *)0;
210 	Fl_Input2 * cmdtext19 = (Fl_Input2 *)0;
211 	Fl_Input2 * cmdtext20 = (Fl_Input2 *)0;
212 	Fl_Input2 * cmdtext21 = (Fl_Input2 *)0;
213 	Fl_Input2 * cmdtext22 = (Fl_Input2 *)0;
214 	Fl_Input2 * cmdtext23 = (Fl_Input2 *)0;
215 	Fl_Input2 * cmdtext24 = (Fl_Input2 *)0;
216 
217 	Fl_Input2 * shftcmdtext1 = (Fl_Input2 *)0;
218 	Fl_Input2 * shftcmdtext2 = (Fl_Input2 *)0;
219 	Fl_Input2 * shftcmdtext3 = (Fl_Input2 *)0;
220 	Fl_Input2 * shftcmdtext4 = (Fl_Input2 *)0;
221 	Fl_Input2 * shftcmdtext5 = (Fl_Input2 *)0;
222 	Fl_Input2 * shftcmdtext6 = (Fl_Input2 *)0;
223 	Fl_Input2 * shftcmdtext7 = (Fl_Input2 *)0;
224 	Fl_Input2 * shftcmdtext8 = (Fl_Input2 *)0;
225 	Fl_Input2 * shftcmdtext9 = (Fl_Input2 *)0;
226 	Fl_Input2 * shftcmdtext10 = (Fl_Input2 *)0;
227 	Fl_Input2 * shftcmdtext11 = (Fl_Input2 *)0;
228 	Fl_Input2 * shftcmdtext12 = (Fl_Input2 *)0;
229 	Fl_Input2 * shftcmdtext13 = (Fl_Input2 *)0;
230 	Fl_Input2 * shftcmdtext14 = (Fl_Input2 *)0;
231 	Fl_Input2 * shftcmdtext15 = (Fl_Input2 *)0;
232 	Fl_Input2 * shftcmdtext16 = (Fl_Input2 *)0;
233 	Fl_Input2 * shftcmdtext17= (Fl_Input2 *)0;
234 	Fl_Input2 * shftcmdtext18 = (Fl_Input2 *)0;
235 	Fl_Input2 * shftcmdtext19 = (Fl_Input2 *)0;
236 	Fl_Input2 * shftcmdtext20 = (Fl_Input2 *)0;
237 	Fl_Input2 * shftcmdtext21 = (Fl_Input2 *)0;
238 	Fl_Input2 * shftcmdtext22 = (Fl_Input2 *)0;
239 	Fl_Input2 * shftcmdtext23 = (Fl_Input2 *)0;
240 	Fl_Input2 * shftcmdtext24 = (Fl_Input2 *)0;
241 
242 	Fl_Output * cmdResponse = (Fl_Output *)0;
243 
244 Fl_Group *tabRESTORE = (Fl_Group *)0;
245 	Fl_Check_Button *btnRestoreFrequency	= (Fl_Check_Button *)0;
246 	Fl_Check_Button *btnRestoreMode			= (Fl_Check_Button *)0;
247 	Fl_Check_Button *btnRestoreBandwidth	= (Fl_Check_Button *)0;
248 	Fl_Check_Button *btnRestoreVolume		= (Fl_Check_Button *)0;
249 	Fl_Check_Button *btnRestoreMicGain		= (Fl_Check_Button *)0;
250 	Fl_Check_Button *btnRestoreRfGain		= (Fl_Check_Button *)0;
251 	Fl_Check_Button *btnRestorePowerControl	= (Fl_Check_Button *)0;
252 	Fl_Check_Button *btnRestoreIFshift		= (Fl_Check_Button *)0;
253 	Fl_Check_Button *btnRestoreNotch		= (Fl_Check_Button *)0;
254 	Fl_Check_Button *btnRestoreAutoNotch	= (Fl_Check_Button *)0;
255 	Fl_Check_Button *btnRestoreSquelch		= (Fl_Check_Button *)0;
256 	Fl_Check_Button *btnRestoreSplit		= (Fl_Check_Button *)0;
257 	Fl_Check_Button *btnRestorePreAtt		= (Fl_Check_Button *)0;
258 	Fl_Check_Button *btnRestoreNoise		= (Fl_Check_Button *)0;
259 	Fl_Check_Button *btnRestoreNR			= (Fl_Check_Button *)0;
260 	Fl_Check_Button *btnRestoreCompOnOff	= (Fl_Check_Button *)0;
261 	Fl_Check_Button *btnRestoreCompLevel	= (Fl_Check_Button *)0;
262 	Fl_Check_Button *btnUseRigData			= (Fl_Check_Button *)0;
263 
cb_btn_trace(Fl_Check_Button *,void *)264 static void cb_btn_trace(Fl_Check_Button *, void *) {
265 	progStatus.trace = btn_trace->value();
266 }
267 
cb_btn_rigtrace(Fl_Check_Button *,void *)268 static void cb_btn_rigtrace(Fl_Check_Button *, void *) {
269 	progStatus.rigtrace = btn_rigtrace->value();
270 }
271 
cb_btn_gettrace(Fl_Check_Button *,void *)272 static void cb_btn_gettrace(Fl_Check_Button *, void *) {
273 	progStatus.gettrace = btn_gettrace->value();
274 }
275 
cb_btn_settrace(Fl_Check_Button *,void *)276 static void cb_btn_settrace(Fl_Check_Button *, void *) {
277 	progStatus.settrace = btn_settrace->value();
278 }
279 
cb_btn_xmltrace(Fl_Check_Button *,void *)280 static void cb_btn_xmltrace(Fl_Check_Button *, void *) {
281 	progStatus.xmltrace = btn_xmltrace->value();
282 }
283 
cb_btn_debugtrace(Fl_Check_Button *,void *)284 static void cb_btn_debugtrace(Fl_Check_Button *, void *) {
285 	progStatus.debugtrace = btn_debugtrace->value();
286 }
287 
cb_btn_rpctrace(Fl_Check_Button *,void *)288 static void cb_btn_rpctrace(Fl_Check_Button *, void *) {
289 	progStatus.rpctrace = btn_rpctrace->value();
290 }
291 
cb_btn_start_stop_trace(Fl_Check_Button *,void *)292 static void cb_btn_start_stop_trace(Fl_Check_Button *, void *) {
293 	progStatus.start_stop_trace = btn_start_stop_trace->value();
294 }
295 
cb_selectlevel(Fl_ComboBox *,void *)296 static void cb_selectlevel(Fl_ComboBox *, void *) {
297 	progStatus.rpc_level = selectlevel->index();
298 	XmlRpc::setVerbosity(progStatus.rpc_level);
299 }
300 
cb_btn_viewtrace(Fl_Button *,void *)301 static void cb_btn_viewtrace(Fl_Button *, void *) {
302 	tracewindow->show();
303 }
304 
cb_selectRig(Fl_ComboBox *,void *)305 static void cb_selectRig(Fl_ComboBox*, void*) {
306 	btn_init_ser_port->labelcolor(FL_RED);
307 	btn_init_ser_port->redraw_label();
308 
309 	btn2_init_ser_port->labelcolor(FL_RED);
310 	btn2_init_ser_port->redraw_label();
311 
312 	initConfigDialog();
313 }
314 
cb_cntRigCatRetries(Fl_Counter * o,void *)315 static void cb_cntRigCatRetries(Fl_Counter* o, void*) {
316 	progStatus.comm_retries = (int)o->value();
317 }
318 
cb_cntRigCatTimeout(Fl_Counter * o,void *)319 static void cb_cntRigCatTimeout(Fl_Counter* o, void*) {
320 	progStatus.comm_timeout = (int)o->value();
321 }
322 
cb_cntRigCatWait(Fl_Counter * o,void *)323 static void cb_cntRigCatWait(Fl_Counter* o, void*) {
324 	progStatus.comm_wait = (int)o->value();
325 }
326 
cb_query_interval(Fl_Counter * o,void *)327 static void cb_query_interval(Fl_Counter* o, void*) {
328 	progStatus.serloop_timing = (int)o->value();
329 }
330 
cb_byte_interval(Fl_Counter * o,void *)331 static void cb_byte_interval(Fl_Counter* o, void*) {
332 	progStatus.byte_interval = (int)o->value();
333 }
334 
cb_selectCommPort(Fl_ComboBox *,void *)335 static void cb_selectCommPort(Fl_ComboBox*, void*) {
336 	btn_init_ser_port->labelcolor(FL_RED);
337 	btn_init_ser_port->redraw_label();
338 
339 	btn2_init_ser_port->labelcolor(FL_RED);
340 	btn2_init_ser_port->redraw_label();
341 }
342 
cb_mnuBaudrate(Fl_ComboBox *,void *)343 static void cb_mnuBaudrate(Fl_ComboBox*, void*) {
344 	btn_init_ser_port->labelcolor(FL_RED);
345 	btn_init_ser_port->redraw_label();
346 
347 	btn2_init_ser_port->labelcolor(FL_RED);
348 	btn2_init_ser_port->redraw_label();
349 }
350 
cb_btnTwoStopBit(Fl_Check_Button * o,void *)351 static void cb_btnTwoStopBit(Fl_Check_Button* o, void*) {
352 	if (o->value() == true) {
353 		btnOneStopBit->value(false);
354 		progStatus.stopbits = 2;
355 	} else
356 		o->value(true);
357 	btn_init_ser_port->labelcolor(FL_RED);
358 	btn_init_ser_port->redraw_label();
359 
360 	btn2_init_ser_port->labelcolor(FL_RED);
361 	btn2_init_ser_port->redraw_label();
362 }
363 
cb_btnOneStopBit(Fl_Check_Button * o,void *)364 static void cb_btnOneStopBit(Fl_Check_Button* o, void*) {
365 	if (o->value() == true) {
366 		btnTwoStopBit->value(false);
367 		progStatus.stopbits = 1;
368 	} else
369 		o->value(true);
370 	btn_init_ser_port->labelcolor(FL_RED);
371 	btn_init_ser_port->redraw_label();
372 
373 	btn2_init_ser_port->labelcolor(FL_RED);
374 	btn2_init_ser_port->redraw_label();
375 }
376 
cb_btnRigCatEcho(Fl_Check_Button *,void *)377 static void cb_btnRigCatEcho(Fl_Check_Button*, void*) {
378 	btn_init_ser_port->labelcolor(FL_RED);
379 	btn_init_ser_port->redraw_label();
380 
381 	btn2_init_ser_port->labelcolor(FL_RED);
382 	btn2_init_ser_port->redraw_label();
383 }
384 
cb_tcpip_addr(Fl_Input2 * o,void *)385 static void cb_tcpip_addr(Fl_Input2* o, void*) {
386 	progStatus.tcpip_addr = o->value();
387 }
388 
cb_tcpip_port(Fl_Input2 * o,void *)389 static void cb_tcpip_port(Fl_Input2* o, void*) {
390 	progStatus.tcpip_port = o->value();
391 }
392 
cb_tcpip_ping_delay(Fl_Counter * o,void *)393 static void cb_tcpip_ping_delay(Fl_Counter* o, void*) {
394 	progStatus.tcpip_ping_delay = o->value();
395 }
396 
cb_use_tcpip(Fl_Check_Button * o,void *)397 static void cb_use_tcpip(Fl_Check_Button* o, void*) {
398 	progStatus.use_tcpip = o->value();
399 	if (!progStatus.use_tcpip)
400 		disconnect_from_remote();
401 	else
402 		try {
403 			connect_to_remote();
404 			initRig();
405 		} catch (...) {
406 			progStatus.use_tcpip = 0;
407 			o->value(0);
408 			return;
409 		}
410 }
411 
cb_cntRetryAfter(Fl_Counter * o,void *)412 static void cb_cntRetryAfter(Fl_Counter* o, void *) {
413 	progStatus.tcpip_reconnect_after = o->value();
414 }
415 
cb_cntDropsAllowed(Fl_Counter * o,void *)416 static void cb_cntDropsAllowed(Fl_Counter* o, void *) {
417 	progStatus.tcpip_drops_allowed = o->value();
418 }
419 
cb_btncatptt(Fl_Check_Button * o,void *)420 static void cb_btncatptt(Fl_Check_Button* o, void*) {
421 	if (o->value()== 1) {
422 		btnrtsptt->value(0);
423 		btndtrptt->value(0);
424 	}
425 	btn_init_ser_port->labelcolor(FL_RED);
426 	btn_init_ser_port->redraw_label();
427 
428 	btn2_init_ser_port->labelcolor(FL_RED);
429 	btn2_init_ser_port->redraw_label();
430 }
431 
cb_btnrtsptt(Fl_Check_Button * o,void *)432 static void cb_btnrtsptt(Fl_Check_Button* o, void*) {
433 	if (o->value() == 1)
434 		btncatptt->value(0);
435 	btn_init_ser_port->labelcolor(FL_RED);
436 	btn_init_ser_port->redraw_label();
437 
438 	btn2_init_ser_port->labelcolor(FL_RED);
439 	btn2_init_ser_port->redraw_label();
440 }
441 
cb_btndtrptt(Fl_Check_Button * o,void *)442 static void cb_btndtrptt(Fl_Check_Button* o, void*) {
443 	if (o->value() == 1)
444 		btncatptt->value(0);
445 	btn_init_ser_port->labelcolor(FL_RED);
446 	btn_init_ser_port->redraw_label();
447 
448 	btn2_init_ser_port->labelcolor(FL_RED);
449 	btn2_init_ser_port->redraw_label();
450 }
451 
cb_chkrtscts(Fl_Check_Button *,void *)452 static void cb_chkrtscts(Fl_Check_Button*, void*) {
453 	btn_init_ser_port->labelcolor(FL_RED);
454 	btn_init_ser_port->redraw_label();
455 
456 	btn2_init_ser_port->labelcolor(FL_RED);
457 	btn2_init_ser_port->redraw_label();
458 }
459 
cb_btnrtsplus(Fl_Check_Button *,void *)460 static void cb_btnrtsplus(Fl_Check_Button*, void*) {
461 	btn_init_ser_port->labelcolor(FL_RED);
462 	btn_init_ser_port->redraw_label();
463 
464 	btn2_init_ser_port->labelcolor(FL_RED);
465 	btn2_init_ser_port->redraw_label();
466 }
467 
cb_btndtrplus(Fl_Check_Button *,void *)468 static void cb_btndtrplus(Fl_Check_Button*, void*) {
469 	btn_init_ser_port->labelcolor(FL_RED);
470 	btn_init_ser_port->redraw_label();
471 
472 	btn2_init_ser_port->labelcolor(FL_RED);
473 	btn2_init_ser_port->redraw_label();
474 }
475 
cb_txtCIV(Fl_Int_Input * o,void *)476 static void cb_txtCIV(Fl_Int_Input* o, void*) {
477 	cbCIV();
478 }
479 
cb_btnCIVdefault(Fl_Button *,void *)480 static void cb_btnCIVdefault(Fl_Button*, void*) {
481 	cbCIVdefault();
482 }
483 
cb_btnUSBaudio(Fl_Check_Button *,void *)484 static void cb_btnUSBaudio(Fl_Check_Button*, void*) {
485 	cbUSBaudio();
486 }
487 
cb_selectSepPTTPort(Fl_ComboBox *,void *)488 static void cb_selectSepPTTPort(Fl_ComboBox*, void*) {
489 	btnOkSepSerial->labelcolor(FL_RED);
490 	btnOkSepSerial->redraw_label();
491 }
492 
cb_btnSepRTSptt(Fl_Check_Button * o,void *)493 static void cb_btnSepRTSptt(Fl_Check_Button* o, void*) {
494 	btnOkSepSerial->labelcolor(FL_RED);
495 	btnOkSepSerial->redraw_label();
496 }
497 
cb_btnSepRTSplus(Fl_Check_Button *,void *)498 static void cb_btnSepRTSplus(Fl_Check_Button*, void*) {
499 	btnOkSepSerial->labelcolor(FL_RED);
500 	btnOkSepSerial->redraw_label();
501 }
502 
cb_btnSepDTRptt(Fl_Check_Button * o,void *)503 static void cb_btnSepDTRptt(Fl_Check_Button* o, void*) {
504 	btnOkSepSerial->labelcolor(FL_RED);
505 	btnOkSepSerial->redraw_label();
506 }
507 
cb_btnSepDTRplus(Fl_Check_Button *,void *)508 static void cb_btnSepDTRplus(Fl_Check_Button*, void*) {
509 	btnOkSepSerial->labelcolor(FL_RED);
510 	btnOkSepSerial->redraw_label();
511 }
512 
cb_btnSep_SCU_17(Fl_Check_Button *,void *)513 static void cb_btnSep_SCU_17(Fl_Check_Button*, void*) {
514 	btnOkSepSerial->labelcolor(FL_RED);
515 	btnOkSepSerial->redraw_label();
516 }
517 
cb_selectAuxPort(Fl_ComboBox *,void *)518 static void cb_selectAuxPort(Fl_ComboBox*, void*) {
519 	btnOkAuxSerial->labelcolor(FL_RED);
520 	btnOkAuxSerial->redraw_label();
521 }
522 
cb_btnAux_SCU_17(Fl_Check_Button *,void *)523 static void cb_btnAux_SCU_17(Fl_Check_Button*, void*) {
524 	btnOkAuxSerial->labelcolor(FL_RED);
525 	btnOkAuxSerial->redraw_label();
526 }
527 
cb_disable_CW_ptt(Fl_Check_Button * btn,void *)528 static void cb_disable_CW_ptt(Fl_Check_Button *btn, void*) {
529 	progStatus.disable_CW_ptt = btn->value();
530 }
531 
cb_server_port(Fl_Input2 * o,void *)532 static void cb_server_port(Fl_Input2* o, void*) {
533 	progStatus.xmlport = o->value();
534 	::xmlport = atoi(progStatus.xmlport.c_str());
535 	set_server_port(::xmlport);
536 }
537 
cb_poll_smeter(Fl_Value_Input * o,void *)538 static void cb_poll_smeter(Fl_Value_Input* o, void*) {
539 	progStatus.poll_smeter = o->value();
540 }
541 
cb_poll_pout(Fl_Value_Input * o,void *)542 static void cb_poll_pout(Fl_Value_Input* o, void*) {
543 	progStatus.poll_pout = o->value();
544 }
545 
cb_poll_swr(Fl_Value_Input * o,void *)546 static void cb_poll_swr(Fl_Value_Input* o, void*) {
547 	progStatus.poll_swr = o->value();
548 }
549 
cb_poll_alc(Fl_Value_Input * o,void *)550 static void cb_poll_alc(Fl_Value_Input* o, void*) {
551 	progStatus.poll_alc = o->value();
552 }
553 
cb_poll_frequency(Fl_Value_Input * o,void *)554 static void cb_poll_frequency(Fl_Value_Input* o, void*) {
555 	progStatus.poll_frequency = o->value();
556 }
557 
cb_poll_mode(Fl_Value_Input * o,void *)558 static void cb_poll_mode(Fl_Value_Input* o, void*) {
559 	progStatus.poll_mode = o->value();
560 }
561 
cb_poll_bandwidth(Fl_Value_Input * o,void *)562 static void cb_poll_bandwidth(Fl_Value_Input* o, void*) {
563 	progStatus.poll_bandwidth = o->value();
564 }
565 
cb_poll_volume(Fl_Value_Input * o,void *)566 static void cb_poll_volume(Fl_Value_Input* o, void*) {
567 	progStatus.poll_volume = o->value();
568 }
569 
cb_poll_micgain(Fl_Value_Input * o,void *)570 static void cb_poll_micgain(Fl_Value_Input* o, void*) {
571 	progStatus.poll_micgain = o->value();
572 }
573 
cb_poll_rfgain(Fl_Value_Input * o,void *)574 static void cb_poll_rfgain(Fl_Value_Input* o, void*) {
575 	progStatus.poll_rfgain = o->value();
576 }
577 
cb_poll_power_control(Fl_Value_Input * o,void *)578 static void cb_poll_power_control(Fl_Value_Input* o, void*) {
579 	progStatus.poll_power_control = o->value();
580 }
581 
cb_poll_ifshift(Fl_Value_Input * o,void *)582 static void cb_poll_ifshift(Fl_Value_Input* o, void*) {
583 	progStatus.poll_ifshift = o->value();
584 }
585 
cb_poll_notch(Fl_Value_Input * o,void *)586 static void cb_poll_notch(Fl_Value_Input* o, void*) {
587 	progStatus.poll_notch = o->value();
588 }
589 
cb_poll_auto_notch(Fl_Value_Input * o,void *)590 static void cb_poll_auto_notch(Fl_Value_Input* o, void*) {
591 	progStatus.poll_auto_notch = o->value();
592 }
593 
cb_poll_pre_att(Fl_Value_Input * o,void *)594 static void cb_poll_pre_att(Fl_Value_Input* o, void*) {
595 	progStatus.poll_pre_att = o->value();
596 }
597 
cb_poll_squelch(Fl_Value_Input * o,void *)598 static void cb_poll_squelch(Fl_Value_Input* o, void*) {
599 	progStatus.poll_squelch = o->value();
600 }
601 
cb_poll_split(Fl_Value_Input * o,void *)602 static void cb_poll_split(Fl_Value_Input* o, void*) {
603 	progStatus.poll_split = o->value();
604 }
605 
cb_poll_noise(Fl_Value_Input * o,void *)606 static void cb_poll_noise(Fl_Value_Input* o, void*) {
607 	progStatus.poll_noise = o->value();
608 }
609 
cb_poll_nr(Fl_Value_Input * o,void *)610 static void cb_poll_nr(Fl_Value_Input* o, void*) {
611 	progStatus.poll_nr = o->value();
612 }
613 
cb_poll_compression(Fl_Value_Input * o,void *)614 static void cb_poll_compression(Fl_Value_Input* o, void *) {
615 	progStatus.poll_compression = o->value();
616 }
617 
cb_poll_tuner(Fl_Value_Input * o,void *)618 static void cb_poll_tuner(Fl_Value_Input* o, void *) {
619 	progStatus.poll_tuner = o->value();
620 }
621 
cb_poll_meters(Fl_Value_Input * o,void *)622 static void cb_poll_meters(Fl_Value_Input* o, void*) {
623 	progStatus.poll_meters = o->value();
624 }
625 
cb_poll_ptt(Fl_Value_Input * o,void *)626 static void cb_poll_ptt(Fl_Value_Input* o, void*) {
627 	progStatus.poll_ptt = o->value();
628 }
629 
cb_poll_break_in(Fl_Value_Input * o,void *)630 static void cb_poll_break_in(Fl_Value_Input* o, void*) {
631 	progStatus.poll_break_in = o->value();
632 }
633 
cb_btnSetMeters(Fl_Button *,void *)634 static void cb_btnSetMeters(Fl_Button*, void*) {
635 	poll_smeter->value(progStatus.poll_meters);
636 	poll_pout->value(progStatus.poll_meters);
637 	poll_swr->value(progStatus.poll_meters);
638 	poll_alc->value(progStatus.poll_meters);
639 
640 	progStatus.poll_smeter = progStatus.poll_meters;
641 	progStatus.poll_pout = progStatus.poll_meters;
642 	progStatus.poll_swr = progStatus.poll_meters;
643 	progStatus.poll_alc = progStatus.poll_meters;
644 }
645 
cb_poll_ops(Fl_Value_Input * o,void *)646 static void cb_poll_ops(Fl_Value_Input* o, void*) {
647 	progStatus.poll_ops = o->value();
648 }
649 
cb_btnSetOps(Fl_Button *,void *)650 static void cb_btnSetOps(Fl_Button*, void*) {
651 	poll_frequency->value(progStatus.poll_ops);
652 	poll_mode->value(progStatus.poll_ops);
653 	poll_bandwidth->value(progStatus.poll_ops);
654 
655 	progStatus.poll_frequency = progStatus.poll_ops;
656 	progStatus.poll_mode = progStatus.poll_ops;
657 	progStatus.poll_bandwidth = progStatus.poll_ops;
658 }
659 
cb_poll_all(Fl_Value_Input * o,void *)660 static void cb_poll_all(Fl_Value_Input* o, void*) {
661 	progStatus.poll_all = o->value();
662 }
663 
cb_btnSetAdd(Fl_Button *,void *)664 static void cb_btnSetAdd(Fl_Button*, void*) {
665 	poll_volume->value(progStatus.poll_all);
666 	poll_micgain->value(progStatus.poll_all);
667 	poll_rfgain->value(progStatus.poll_all);
668 	poll_power_control->value(progStatus.poll_all);
669 	poll_ifshift->value(progStatus.poll_all);
670 	poll_notch->value(progStatus.poll_all);
671 	poll_auto_notch->value(progStatus.poll_all);
672 	poll_pre_att->value(progStatus.poll_all);
673 	poll_squelch->value(progStatus.poll_all);
674 	poll_split->value(progStatus.poll_all);
675 	poll_noise->value(progStatus.poll_all);
676 	poll_nr->value(progStatus.poll_all);
677 	poll_compression->value(progStatus.poll_all);
678 	poll_tuner->value(progStatus.poll_all);
679 	poll_ptt->value(progStatus.poll_all);
680 
681 	progStatus.poll_volume = progStatus.poll_all;
682 	progStatus.poll_micgain = progStatus.poll_all;
683 	progStatus.poll_rfgain = progStatus.poll_all;
684 	progStatus.poll_power_control = progStatus.poll_all;
685 	progStatus.poll_ifshift = progStatus.poll_all;
686 	progStatus.poll_notch = progStatus.poll_all;
687 	progStatus.poll_auto_notch = progStatus.poll_all;
688 	progStatus.poll_pre_att = progStatus.poll_all;
689 	progStatus.poll_squelch = progStatus.poll_all;
690 	progStatus.poll_split = progStatus.poll_all;
691 	progStatus.poll_noise = progStatus.poll_all;
692 	progStatus.poll_nr = progStatus.poll_all;
693 	progStatus.poll_compression = progStatus.poll_all;
694 	progStatus.poll_tuner = progStatus.poll_all;
695 	progStatus.poll_ptt = progStatus.poll_all;
696 }
697 
cb_btn_send_command(Fl_Button * o,void *)698 static void cb_btn_send_command(Fl_Button *o, void*) {
699 	cb_send_command(txt_command->value(), txt_response);
700 }
701 
702 static const char hexsym[] = "0123456789ABCDEF";
str2hex(std::string str)703 static std::string str2hex(std::string str)
704 {
705 	static std::string hexbuf;
706 
707 	size_t len = str.length();
708 
709 	if (!len) return "";
710 
711 	hexbuf.clear();
712 	for (size_t i = 0; i < len; i++) {
713 		hexbuf += 'x';
714 		hexbuf += hexsym[(str[i] & 0xFF) >> 4];
715 		hexbuf += hexsym[str[i] & 0xF];
716 		hexbuf += ' ';
717 	}
718 	return hexbuf;
719 }
720 
cb_btn_icom_pre(Fl_Button * o,void *)721 static void cb_btn_icom_pre(Fl_Button *o, void*) {
722 	if (!selrig->ICOMrig) return;
723 	txt_command->value(str2hex(selrig->pre_to).c_str());
724 }
725 
cb_btn_icom_post(Fl_Button * o,void *)726 static void cb_btn_icom_post(Fl_Button *o, void*) {
727 	if (!selrig->ICOMrig) return;
728 	std::string s = txt_command->value();
729 	s.append(str2hex(selrig->post));
730 	txt_command->value(s.c_str());
731 }
732 
cb_cmdlbl(Fl_Input2 * o,void * d)733 static void cb_cmdlbl(Fl_Input2 *o, void *d) {
734 	long val = reinterpret_cast<long>(d);
735 	struct BPAIR { std::string *plbl; Fl_Button *b; } bpairs[] =
736 	{ { &progStatus.label1, btnUser1 },
737 	  { &progStatus.label2, btnUser2 },
738 	  { &progStatus.label3, btnUser3 },
739 	  { &progStatus.label4, btnUser4 },
740 	  { &progStatus.label5, btnUser5 },
741 	  { &progStatus.label6, btnUser6 },
742 	  { &progStatus.label7, btnUser7 },
743 	  { &progStatus.label8, btnUser8 },
744 	  { &progStatus.label9, btnUser9 },
745 	  { &progStatus.label10, btnUser10 },
746 	  { &progStatus.label11, btnUser11 },
747 	  { &progStatus.label12, btnUser12 },
748 	  { &progStatus.label13, btnUser13 },
749 	  { &progStatus.label14, btnUser14 },
750 	  { &progStatus.label15, btnUser15 },
751 	  { &progStatus.label16, btnUser16 },
752 	  { &progStatus.label17, btnUser17 },
753 	  { &progStatus.label18, btnUser18 },
754 	  { &progStatus.label19, btnUser19 },
755 	  { &progStatus.label20, btnUser20 },
756 	  { &progStatus.label21, btnUser21 },
757 	  { &progStatus.label22, btnUser22 },
758 	  { &progStatus.label23, btnUser23 },
759 	  { &progStatus.label24, btnUser24 } };
760 
761 	if (val < 0) val = 0;
762 	if (val > 23) val = 23;
763 
764 	*bpairs[val].plbl = o->value();
765 	bpairs[val].b->label(o->value());
766 	bpairs[val].b->redraw_label();
767 }
768 
cb_cmdtext(Fl_Input2 * o,void * d)769 static void cb_cmdtext(Fl_Input2 *o, void *d) {
770 	long val = reinterpret_cast<long>(d);
771 	std::string *cmd[] =
772 	{ &progStatus.command1, &progStatus.command2,
773 	  &progStatus.command3, &progStatus.command4,
774 	  &progStatus.command5, &progStatus.command6,
775 	  &progStatus.command7, &progStatus.command8,
776 	  &progStatus.command9, &progStatus.command10,
777 	  &progStatus.command11, &progStatus.command12,
778 	  &progStatus.command13, &progStatus.command14,
779 	  &progStatus.command15, &progStatus.command16,
780 	  &progStatus.command17, &progStatus.command18,
781 	  &progStatus.command19, &progStatus.command20,
782 	  &progStatus.command21, &progStatus.command22,
783 	  &progStatus.command23, &progStatus.command24 };
784 	if (val < 0) val = 0;
785 	if (val > 23) val = 23;
786 
787 	*cmd[val] = o->value();
788 }
789 
cb_shftcmdtext(Fl_Input2 * o,void * d)790 static void cb_shftcmdtext(Fl_Input2 *o, void *d) {
791 	long val = reinterpret_cast<long>(d);
792 	std::string *cmd[] =
793 	{ &progStatus.shftcmd1, &progStatus.shftcmd2,
794 	  &progStatus.shftcmd3, &progStatus.shftcmd4,
795 	  &progStatus.shftcmd5, &progStatus.shftcmd6,
796 	  &progStatus.shftcmd7, &progStatus.shftcmd8,
797 	  &progStatus.shftcmd9, &progStatus.shftcmd10,
798 	  &progStatus.shftcmd11, &progStatus.shftcmd12,
799 	  &progStatus.shftcmd13, &progStatus.shftcmd14,
800 	  &progStatus.shftcmd15, &progStatus.shftcmd16,
801 	  &progStatus.shftcmd17, &progStatus.shftcmd18,
802 	  &progStatus.shftcmd19, &progStatus.shftcmd20,
803 	  &progStatus.shftcmd21, &progStatus.shftcmd22,
804 	  &progStatus.shftcmd23, &progStatus.shftcmd24 };
805 	if (val < 0) val = 0;
806 	if (val > 23) val = 23;
807 
808 	*cmd[val] = o->value();
809 }
810 
cb_init_ser_port(Fl_Return_Button *,void *)811 static void cb_init_ser_port(Fl_Return_Button*, void*) {
812 	string p1 = selectCommPort->value();
813 	string p2 = selectAuxPort->value();
814 	string p3 = selectSepPTTPort->value();
815 
816 	if ( (p1.compare("NONE") != 0) && (p1 == p2 || p1 == p3) ) {
817 		fl_message("Select separate ports");
818 		return;
819 	}
820 
821 	if (progStatus.UIsize == wide_ui) {
822 		btn_show_controls->label("@-22->");
823 		btn_show_controls->redraw_label();
824 		grpTABS->hide();
825 		mainwindow->resizable(grpTABS);
826 		mainwindow->size(mainwindow->w(), WIDE_MAINH);
827 		mainwindow->size_range(WIDE_MAINW, WIDE_MAINH, 0, WIDE_MAINH);
828 	}
829 
830 	// close the current rig control
831 	closeRig();               // local serial comm connection
832 
833 	{ guard_lock gl_serial(&mutex_serial);
834 		RigSerial->ClosePort();
835 		bypass_serial_thread_loop = true;
836 	}
837 
838 	clearList();
839 	saveFreqList();
840 	selrig = rigs[selectRig->index()];
841 	xcvr_name = selrig->name_;
842 
843 	progStatus.xcvr_serial_port = selectCommPort->value();
844 
845 	progStatus.comm_baudrate = mnuBaudrate->index();
846 	progStatus.stopbits = btnOneStopBit->value() ? 1 : 2;
847 	progStatus.comm_retries = (int)cntRigCatRetries->value();
848 	progStatus.comm_timeout = (int)cntRigCatTimeout->value();
849 	progStatus.comm_wait = (int)cntRigCatWait->value();
850 	progStatus.comm_echo = btnRigCatEcho->value();
851 	progStatus.comm_rtsptt = btnrtsptt->value();
852 	progStatus.comm_catptt = btncatptt->value();
853 	progStatus.comm_dtrptt = btndtrptt->value();
854 	progStatus.comm_rtscts = chkrtscts->value();
855 	progStatus.comm_rtsplus = btnrtsplus->value();
856 	progStatus.comm_dtrplus = btndtrplus->value();
857 
858 	progStatus.imode_B  = progStatus.imode_A  = selrig->def_mode;
859 	progStatus.iBW_B    = progStatus.iBW_A    = selrig->def_bw;
860 	progStatus.freq_B   = progStatus.freq_A   = selrig->def_freq;
861 
862 	init_title();
863 
864 	if (!startXcvrSerial()) {
865 		if (progStatus.xcvr_serial_port.compare("NONE") == 0) {
866 			LOG_WARN("No comm port ... test mode");
867 		} else {
868 //			progStatus.xcvr_serial_port = "NONE";
869 //			selectCommPort->value(progStatus.xcvr_serial_port.c_str());
870 		}
871 	}
872 
873 	initRig();
874 
875 	btn_init_ser_port->labelcolor(FL_BLACK);
876 	btn_init_ser_port->redraw_label();
877 
878 	btn2_init_ser_port->labelcolor(FL_BLACK);
879 	btn2_init_ser_port->redraw_label();
880 }
881 
cb_btnOkSepSerial(Fl_Button *,void *)882 static void cb_btnOkSepSerial(Fl_Button*, void*) {
883 	string p2 = selectAuxPort->value();
884 	string p3 = selectSepPTTPort->value();
885 
886 	if ((p3.compare("NONE") != 0) && p2 == p3) {
887 		fl_message("Port used for Aux i/o");
888 		return;
889 	}
890 
891 	progStatus.sep_serial_port = selectSepPTTPort->value();
892 	progStatus.sep_SCU_17 = btnSep_SCU_17->value();
893 
894 	progStatus.sep_dtrplus = btnSepDTRplus->value();
895 	progStatus.sep_dtrptt = btnSepDTRptt->value();
896 	progStatus.sep_rtsplus = btnSepRTSplus->value();
897 	progStatus.sep_rtsptt = btnSepRTSptt->value();
898 
899 	if (!startSepSerial()) {
900 		if (progStatus.sep_serial_port.compare("NONE") != 0) {
901 			progStatus.sep_serial_port = "NONE";
902 			selectSepPTTPort->value(progStatus.sep_serial_port.c_str());
903 		}
904 	}
905 
906 	btnOkSepSerial->labelcolor(FL_BLACK);
907 	btnOkSepSerial->redraw_label();
908 }
909 
cb_btnOkAuxSerial(Fl_Button *,void *)910 static void cb_btnOkAuxSerial(Fl_Button*, void*) {
911 	AuxSerial->ClosePort();
912 
913 	string p2 = selectAuxPort->value();
914 	string p3 = selectSepPTTPort->value();
915 
916 	if ((p2.compare("NONE") != 0) && p2 == p3) {
917 		fl_message("Port used for Sep serial");
918 		return;
919 	}
920 
921 	progStatus.aux_serial_port = selectAuxPort->value();
922 	progStatus.aux_SCU_17 = btnAux_SCU_17->value();
923 
924 	if (!startAuxSerial()) {
925 		if (progStatus.aux_serial_port.compare("NONE") != 0) {
926 			progStatus.aux_serial_port = "NONE";
927 			selectAuxPort->value(progStatus.aux_serial_port.c_str());
928 		}
929 	}
930 
931 	btnOkAuxSerial->labelcolor(FL_BLACK);
932 	btnOkAuxSerial->redraw_label();
933 }
934 
cb_restore(Fl_Check_Button * btn,void *)935 static void cb_restore(Fl_Check_Button *btn, void*)
936 {
937 	progStatus.restore_frequency = btnRestoreFrequency->value();
938 	progStatus.restore_mode = btnRestoreMode->value();
939 	progStatus.restore_bandwidth =  btnRestoreBandwidth->value();
940 	progStatus.restore_volume = btnRestoreVolume->value();
941 	progStatus.restore_mic_gain = btnRestoreMicGain->value();
942 	progStatus.restore_rf_gain = btnRestoreRfGain->value();
943 	progStatus.restore_power_control = btnRestorePowerControl->value();
944 	progStatus.restore_if_shift = btnRestoreIFshift->value();
945 	progStatus.restore_notch = btnRestoreNotch->value();
946 	progStatus.restore_auto_notch = btnRestoreAutoNotch->value();
947 	progStatus.restore_noise = btnRestoreNoise->value();
948 	progStatus.restore_squelch = btnRestoreSquelch->value();
949 	progStatus.restore_split = btnRestoreSplit->value();
950 	progStatus.restore_pre_att = btnRestorePreAtt->value();
951 	progStatus.restore_nr = btnRestoreNR->value();
952 	progStatus.restore_comp_on_off = btnRestoreCompOnOff->value();
953 	progStatus.restore_comp_level = btnRestoreCompLevel->value();
954 	progStatus.use_rig_data = btnUseRigData->value();
955 }
956 
cb_comports(Fl_Button * b,void * d)957 void cb_comports(Fl_Button *b, void* d)
958 {
959 	init_port_combos();
960 }
961 
createXCVR(int X,int Y,int W,int H,const char * label)962 Fl_Group *createXCVR(int X, int Y, int W, int H, const char *label)
963 {
964 	Fl_Group *tabXCVR = new Fl_Group(X, Y, W, H, label);
965 
966 	Fl_Group* xcvr_grp1 = new Fl_Group(X + 2, Y + 2, W - 4, 200);
967 		xcvr_grp1->box(FL_ENGRAVED_FRAME);
968 
969 		selectRig = new Fl_ComboBox(
970 			xcvr_grp1->x() + 60, xcvr_grp1->y() + 4,
971 			xcvr_grp1->w() - 64, 22, _("Rig:"));
972 		selectRig->tooltip(_("Select Transceiver"));
973 		selectRig->box(FL_DOWN_BOX);
974 		selectRig->color(FL_BACKGROUND2_COLOR);
975 		selectRig->selection_color(FL_BACKGROUND_COLOR);
976 		selectRig->labeltype(FL_NORMAL_LABEL);
977 		selectRig->labelfont(0);
978 		selectRig->labelsize(14);
979 		selectRig->labelcolor(FL_FOREGROUND_COLOR);
980 		selectRig->callback((Fl_Callback*)cb_selectRig);
981 		selectRig->align(Fl_Align(FL_ALIGN_LEFT));
982 		selectRig->readonly();
983 		selectRig->when(FL_WHEN_RELEASE);
984 		selectRig->end();
985 
986 		Fl_Button *comports = new Fl_Button(
987 			xcvr_grp1->x() + 4, selectRig->y() + 26,
988 			52, 22, _("Update"));
989 		comports->box(FL_THIN_UP_BOX);
990 		comports->tooltip(_("Update serial port combo"));
991 		comports->callback((Fl_Callback*)cb_comports);
992 		comports->when(FL_WHEN_RELEASE);
993 
994 		selectCommPort = new Fl_ComboBox(
995 			selectRig->x(), comports->y(),
996 			selectRig->w(), 22, "");
997 		selectCommPort->tooltip(_("Xcvr serial port"));
998 		selectCommPort->box(FL_DOWN_BOX);
999 		selectCommPort->color(FL_BACKGROUND2_COLOR);
1000 		selectCommPort->selection_color(FL_BACKGROUND_COLOR);
1001 		selectCommPort->labeltype(FL_NORMAL_LABEL);
1002 		selectCommPort->labelfont(0);
1003 		selectCommPort->labelsize(14);
1004 		selectCommPort->labelcolor(FL_FOREGROUND_COLOR);
1005 		selectCommPort->callback((Fl_Callback*)cb_selectCommPort);
1006 		selectCommPort->align(Fl_Align(FL_ALIGN_CENTER));
1007 		selectCommPort->when(FL_WHEN_RELEASE);
1008 		selectCommPort->end();
1009 
1010 		mnuBaudrate = new Fl_ComboBox(
1011 			selectCommPort->x(), selectCommPort->y() + 26,
1012 			160, 22, _("Baud:"));
1013 		mnuBaudrate->tooltip(_("Xcvr baudrate"));
1014 		mnuBaudrate->box(FL_DOWN_BOX);
1015 		mnuBaudrate->color(FL_BACKGROUND2_COLOR);
1016 		mnuBaudrate->selection_color(FL_BACKGROUND_COLOR);
1017 		mnuBaudrate->labeltype(FL_NORMAL_LABEL);
1018 		mnuBaudrate->labelfont(0);
1019 		mnuBaudrate->labelsize(14);
1020 		mnuBaudrate->labelcolor(FL_FOREGROUND_COLOR);
1021 		mnuBaudrate->callback((Fl_Callback*)cb_mnuBaudrate);
1022 		mnuBaudrate->align(Fl_Align(FL_ALIGN_LEFT));
1023 		mnuBaudrate->readonly();
1024 		mnuBaudrate->when(FL_WHEN_RELEASE);
1025 		mnuBaudrate->end();
1026 
1027 		btnOneStopBit = new Fl_Check_Button(
1028 			mnuBaudrate->x(), mnuBaudrate->y() + 26,
1029 			22, 22, _("1"));
1030 		btnOneStopBit->tooltip(_("One Stop Bit"));
1031 		btnOneStopBit->down_box(FL_DOWN_BOX);
1032 		btnOneStopBit->callback((Fl_Callback*)cb_btnOneStopBit);
1033 		btnOneStopBit->align(Fl_Align(FL_ALIGN_RIGHT));
1034 		btnOneStopBit->value(progStatus.stopbits == 1);
1035 
1036 		btnTwoStopBit = new Fl_Check_Button(
1037 			btnOneStopBit->x() + 120, btnOneStopBit->y(),
1038 			22, 22, _("2 -StopBits"));
1039 		btnTwoStopBit->down_box(FL_DOWN_BOX);
1040 		btnTwoStopBit->callback((Fl_Callback*)cb_btnTwoStopBit);
1041 		btnTwoStopBit->align(Fl_Align(FL_ALIGN_RIGHT));
1042 		btnTwoStopBit->value(progStatus.stopbits == 2);
1043 
1044 		btnRigCatEcho = new Fl_Check_Button(
1045 			btnOneStopBit->x(), btnOneStopBit->y() + 26,
1046 			22, 22, _("Echo "));
1047 		btnRigCatEcho->down_box(FL_DOWN_BOX);
1048 		btnRigCatEcho->callback((Fl_Callback*)cb_btnRigCatEcho);
1049 		btnRigCatEcho->align(Fl_Align(FL_ALIGN_RIGHT));
1050 		btnRigCatEcho->value(progStatus.comm_echo);
1051 
1052 		chkrtscts = new Fl_Check_Button(
1053 			btnTwoStopBit->x(), btnRigCatEcho->y(),
1054 			22, 22, _("RTS/CTS"));
1055 		chkrtscts->tooltip(_("Xcvr uses RTS/CTS handshake"));
1056 		chkrtscts->down_box(FL_DOWN_BOX);
1057 		chkrtscts->callback((Fl_Callback*)cb_chkrtscts);
1058 		chkrtscts->value(progStatus.comm_rtscts);
1059 
1060 		cntRigCatRetries = new Fl_Counter(
1061 			xcvr_grp1->x() + xcvr_grp1->w() - 110 - 4, mnuBaudrate->y(),
1062 			110, 22, _("Retries"));
1063 		cntRigCatRetries->tooltip(_("Number of  times to resend\ncommand before giving up"));
1064 		cntRigCatRetries->minimum(1);
1065 		cntRigCatRetries->maximum(10);
1066 		cntRigCatRetries->step(1);
1067 		cntRigCatRetries->value(5);
1068 		cntRigCatRetries->callback((Fl_Callback*)cb_cntRigCatRetries);
1069 		cntRigCatRetries->align(Fl_Align(FL_ALIGN_LEFT));
1070 		cntRigCatRetries->value(progStatus.comm_retries);
1071 		cntRigCatRetries->lstep(10);
1072 
1073 		cntRigCatTimeout = new Fl_Counter(
1074 			cntRigCatRetries->x(), btnOneStopBit->y(),
1075 			110, 22, _("Retry intvl"));
1076 		cntRigCatTimeout->tooltip(_("Time between retries is msec"));
1077 		cntRigCatTimeout->minimum(2);
1078 		cntRigCatTimeout->maximum(200);
1079 		cntRigCatTimeout->step(1);
1080 		cntRigCatTimeout->value(10);
1081 		cntRigCatTimeout->callback((Fl_Callback*)cb_cntRigCatTimeout);
1082 		cntRigCatTimeout->align(Fl_Align(FL_ALIGN_LEFT));
1083 		cntRigCatTimeout->value(progStatus.comm_timeout);
1084 		cntRigCatTimeout->lstep(10);
1085 
1086 		cntRigCatWait = new Fl_Counter(
1087 			cntRigCatRetries->x(), btnRigCatEcho->y(),
1088 			110, 22, _("Cmds"));
1089 		cntRigCatWait->tooltip(_("Wait millseconds between sequential commands"));
1090 		cntRigCatWait->minimum(0);
1091 		cntRigCatWait->maximum(100);
1092 		cntRigCatWait->step(1);
1093 		cntRigCatWait->value(5);
1094 		cntRigCatWait->callback((Fl_Callback*)cb_cntRigCatWait);
1095 		cntRigCatWait->align(Fl_Align(FL_ALIGN_LEFT));
1096 		cntRigCatWait->value(progStatus.comm_wait);
1097 		cntRigCatWait->lstep(10);
1098 
1099 		query_interval = new Fl_Counter(
1100 			cntRigCatRetries->x(), cntRigCatWait->y() + 26,
1101 			110, 22, _("Poll intvl"));
1102 		query_interval->tooltip(_("Polling interval in msec"));
1103 		query_interval->minimum(10);
1104 		query_interval->maximum(5000);
1105 		query_interval->step(1);
1106 		query_interval->value(50);
1107 		query_interval->callback((Fl_Callback*)cb_query_interval);
1108 		query_interval->align(Fl_Align(FL_ALIGN_LEFT));
1109 		query_interval->value(progStatus.serloop_timing);
1110 		query_interval->lstep(10);
1111 
1112 		byte_interval = new Fl_Counter(
1113 			cntRigCatRetries->x(), query_interval->y() + 26,
1114 			110, 22, _("Byte intvl"));
1115 		byte_interval->tooltip(_("Inter-byte interval (msec)"));
1116 		byte_interval->minimum(0);
1117 		byte_interval->maximum(200);
1118 		byte_interval->step(1);
1119 		byte_interval->value(0);
1120 		byte_interval->callback((Fl_Callback*)cb_byte_interval);
1121 		byte_interval->align(Fl_Align(FL_ALIGN_LEFT));
1122 		byte_interval->value(progStatus.byte_interval);
1123 		byte_interval->lstep(10);
1124 
1125 		Fl_Group* xcvr_grp4 = new Fl_Group(
1126 			xcvr_grp1->x() + 2, xcvr_grp1->y() + xcvr_grp1->h() - 38,
1127 			150, 36);
1128 		xcvr_grp4->box(FL_ENGRAVED_FRAME);
1129 		xcvr_grp4->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
1130 
1131 			txtCIV = new Fl_Int_Input(
1132 				xcvr_grp4->x() + 4, xcvr_grp4->y() + 8,
1133 				58, 22, _("CI-V adr"));
1134 			txtCIV->tooltip(_("Enter hex value, ie: 0x5F"));
1135 			txtCIV->type(2);
1136 			txtCIV->callback((Fl_Callback*)cb_txtCIV);
1137 			txtCIV->align(Fl_Align(FL_ALIGN_RIGHT));
1138 
1139 			btnCIVdefault = new Fl_Button(
1140 				txtCIV->x() + txtCIV->w() + 4, txtCIV->y(),
1141 				70, 22, _("Default"));
1142 			btnCIVdefault->callback((Fl_Callback*)cb_btnCIVdefault);
1143 
1144 		xcvr_grp4->end();
1145 
1146 	xcvr_grp1->end();
1147 
1148 	Fl_Group* xcvr_grp5 = new Fl_Group(
1149 		xcvr_grp1->x(), xcvr_grp1->y() + xcvr_grp1->h() + 2,
1150 		152, H - xcvr_grp1->y() - xcvr_grp1->h() - 4);
1151 	xcvr_grp5->box(FL_ENGRAVED_FRAME);
1152 
1153 		btnUSBaudio = new Fl_Check_Button(
1154 			xcvr_grp5->x() + 4, xcvr_grp5->y() + xcvr_grp5->h()  / 2 - 9,
1155 			100, 18, _("USB audio"));
1156 		btnUSBaudio->down_box(FL_DOWN_BOX);
1157 		btnUSBaudio->callback((Fl_Callback*)cb_btnUSBaudio);
1158 
1159 	xcvr_grp5->end();
1160 
1161 	box_xcvr_connect = new Fl_Box(
1162 		X + W - 90, Y + H - 27,
1163 		18, 18, _("Connected"));
1164 	box_xcvr_connect->tooltip(_("Lit when connected"));
1165 	box_xcvr_connect->box(FL_DIAMOND_DOWN_BOX);
1166 	box_xcvr_connect->color(FL_LIGHT1);
1167 	box_xcvr_connect->align(Fl_Align(FL_ALIGN_LEFT));
1168 
1169 	btn_init_ser_port = new Fl_Button(
1170 		X + W - 60, Y + H - 30,
1171 		50, 24, _("Init"));
1172 	btn_init_ser_port->callback((Fl_Callback*)cb_init_ser_port);
1173 
1174 	tabXCVR->end();
1175 
1176 	return tabXCVR;
1177 }
1178 
createTRACE(int X,int Y,int W,int H,const char * label)1179 Fl_Group *createTRACE(int X, int Y, int W, int H, const char *label)
1180 {
1181 	Fl_Group *tabTRACE = new Fl_Group(X, Y, W, H, label);
1182 
1183 	tabTRACE->hide();
1184 	btn_trace = new Fl_Check_Button(X + 10, Y + 20, 80, 20, _("Trace support code"));
1185 	btn_trace->value(progStatus.trace);
1186 	btn_trace->callback((Fl_Callback*)cb_btn_trace);
1187 	btn_trace->tooltip(_("Enable trace support"));
1188 
1189 	btn_debugtrace = new Fl_Check_Button(X + 10, Y + 50, 80, 20, _("Trace debug code"));
1190 	btn_debugtrace->value(progStatus.debugtrace);
1191 	btn_debugtrace->callback((Fl_Callback*)cb_btn_debugtrace);
1192 	btn_debugtrace->tooltip(_("Display debug output on trace view"));
1193 
1194 	btn_rigtrace = new Fl_Check_Button(X + 10, Y + 80, 80, 20, _("Trace rig class code"));
1195 	btn_rigtrace->value(progStatus.rigtrace);
1196 	btn_rigtrace->callback((Fl_Callback*)cb_btn_rigtrace);
1197 	btn_rigtrace->tooltip(_("Enable trace of rig methods"));
1198 
1199 	btn_gettrace = new Fl_Check_Button(X + 10, Y + 110, 80, 20, _("Trace rig class get code"));
1200 	btn_gettrace->value(progStatus.gettrace);
1201 	btn_gettrace->callback((Fl_Callback*)cb_btn_gettrace);
1202 	btn_gettrace->tooltip(_("Enable trace of rig get methods"));
1203 
1204 	btn_settrace = new Fl_Check_Button(X + 10, Y + 140, 80, 20, _("Trace rig class set code"));
1205 	btn_settrace->value(progStatus.settrace);
1206 	btn_settrace->callback((Fl_Callback*)cb_btn_settrace);
1207 	btn_settrace->tooltip(_("Enable trace of rig set methods"));
1208 
1209 	btn_xmltrace = new Fl_Check_Button(X + 240, Y + 20, 80, 20, _("Trace xml_server code"));
1210 	btn_xmltrace->value(progStatus.xmltrace);
1211 	btn_xmltrace->callback((Fl_Callback*)cb_btn_xmltrace);
1212 	btn_xmltrace->tooltip(_("Enable trace of xmlrpc functions"));
1213 
1214 	btn_rpctrace = new Fl_Check_Button(X + 240, Y + 50, 80, 20, _("Trace xmlrpcpp code"));
1215 	btn_rpctrace->value(progStatus.rpctrace);
1216 	btn_rpctrace->callback((Fl_Callback*)cb_btn_rpctrace);
1217 	btn_rpctrace->tooltip(_("Enable trace of XmlRpc methods"));
1218 
1219 	btn_start_stop_trace = new Fl_Check_Button(X + 240, Y + 80, 80, 20, _("Trace start/stop code"));
1220 	btn_start_stop_trace->value(progStatus.start_stop_trace);
1221 	btn_start_stop_trace->callback((Fl_Callback*)cb_btn_start_stop_trace);
1222 	btn_start_stop_trace->tooltip(_("Enable trace of start/stop operations"));
1223 
1224 	selectlevel = new Fl_ComboBox(X + 240, Y + 110, 80, 20, _("XmlRpc trace level"));
1225 	selectlevel->add("0|1|2|3|4");
1226 	selectlevel->align(FL_ALIGN_RIGHT);
1227 	selectlevel->index(progStatus.rpc_level);
1228 	selectlevel->tooltip(_("0 = off ... 4 maximum depth"));
1229 	selectlevel->readonly();
1230 	selectlevel->callback((Fl_Callback*)cb_selectlevel);
1231 
1232 	btn_viewtrace = new Fl_Button(X + W - 90, Y + H - 30, 85, 24, _("View Trace"));
1233 	btn_viewtrace->callback((Fl_Callback*)cb_btn_viewtrace);
1234 
1235 	tabTRACE->end();
1236 
1237 	return tabTRACE;
1238 }
1239 
createTCPIP(int X,int Y,int W,int H,const char * label)1240 Fl_Group *createTCPIP(int X, int Y, int W, int H, const char *label)
1241 {
1242 	Fl_Group * tabTCPIP = new Fl_Group(X, Y, W, H, label);
1243 		tabTCPIP->hide();
1244 
1245 		inp_tcpip_addr = new Fl_Input2(X + 120, Y + 20, 300, 22, _("TCPIP address:"));
1246 		inp_tcpip_addr->tooltip(_("remote tcpip server address"));
1247 		inp_tcpip_addr->callback((Fl_Callback*)cb_tcpip_addr);
1248 		inp_tcpip_addr->value(progStatus.tcpip_addr.c_str());
1249 
1250 		inp_tcpip_port = new Fl_Input2(X + 120, Y + 44, 100, 22, _("TCPIP port:"));
1251 		inp_tcpip_port->tooltip(_("remote tcpip server port"));
1252 		inp_tcpip_port->type(2);
1253 		inp_tcpip_port->callback((Fl_Callback*)cb_tcpip_port);
1254 		inp_tcpip_port->value(progStatus.tcpip_port.c_str());
1255 
1256 		inp_tcpip_ping_delay = new Fl_Counter(X + 120, Y + 70, 100, 22, _("Ping delay"));
1257 		inp_tcpip_ping_delay->tooltip(_("enter round trip ping delay"));
1258 		inp_tcpip_ping_delay->callback((Fl_Callback*)cb_tcpip_ping_delay);
1259 		inp_tcpip_ping_delay->minimum(0);
1260 		inp_tcpip_ping_delay->maximum(500);
1261 		inp_tcpip_ping_delay->step(5);
1262 		inp_tcpip_ping_delay->lstep(20);
1263 		inp_tcpip_ping_delay->value(progStatus.tcpip_ping_delay);
1264 		inp_tcpip_ping_delay->align(Fl_Align(FL_ALIGN_LEFT));
1265 
1266 		chk_use_tcpip = new Fl_Check_Button(X + 120, Y + 95, 18, 18, _("Use tcpip"));
1267 		chk_use_tcpip->tooltip(_("Rig control via tcpip"));
1268 		chk_use_tcpip->callback((Fl_Callback*)cb_use_tcpip);
1269 		chk_use_tcpip->value(progStatus.use_tcpip);
1270 		chk_use_tcpip->align(Fl_Align(FL_ALIGN_LEFT));
1271 
1272 		box_tcpip_connect = new Fl_Box(X + 120, Y + 120, 18, 18, _("Connected"));
1273 		box_tcpip_connect->tooltip(_("Lit when connected to remote tcpip"));
1274 		box_tcpip_connect->box(FL_DIAMOND_DOWN_BOX);
1275 		box_tcpip_connect->color(FL_LIGHT1);
1276 		box_tcpip_connect->align(Fl_Align(FL_ALIGN_RIGHT));
1277 
1278 		cntRetryAfter = new Fl_Counter(X + 120, Y + 145, 100, 20, _("Retry (secs)"));
1279 		cntRetryAfter->tooltip(_("Retry connection if lost"));
1280 		cntRetryAfter->minimum(1);
1281 		cntRetryAfter->maximum(120);
1282 		cntRetryAfter->step(1);
1283 		cntRetryAfter->lstep(10);
1284 		cntRetryAfter->callback((Fl_Callback*)cb_cntRetryAfter);
1285 		cntRetryAfter->align(Fl_Align(FL_ALIGN_LEFT));
1286 		cntRetryAfter->value(progStatus.tcpip_reconnect_after);
1287 
1288 		cntDropsAllowed = new Fl_Counter(X + 120, Y + 170, 100, 20, _("Allowed drops"));
1289 		cntDropsAllowed->tooltip(_("# tcpip drop-outs before connection declared down"));
1290 		cntDropsAllowed->minimum(1);
1291 		cntDropsAllowed->maximum(25);
1292 		cntDropsAllowed->step(1);
1293 		cntDropsAllowed->lstep(5);
1294 		cntDropsAllowed->callback((Fl_Callback*)cb_cntDropsAllowed);
1295 		cntDropsAllowed->align(Fl_Align(FL_ALIGN_LEFT));
1296 		cntDropsAllowed->value(progStatus.tcpip_drops_allowed);
1297 
1298 	tabTCPIP->end();
1299 
1300 	return tabTCPIP;
1301 }
1302 
createPTT(int X,int Y,int W,int H,const char * label)1303 Fl_Group *createPTT(int X, int Y, int W, int H, const char *label)
1304 {
1305 	Fl_Group *tabPTT = new Fl_Group(X, Y, W, H, label);
1306 	tabPTT->hide();
1307 
1308 	Fl_Group *grp_CW_ptt = new Fl_Group(X + 2, Y + 20, W - 4, 30,
1309 		_("CW mode PTT"));
1310 		grp_CW_ptt->box(FL_ENGRAVED_BOX);
1311 		grp_CW_ptt->align(Fl_Align(FL_ALIGN_TOP_LEFT));
1312 
1313 		Fl_Check_Button *btn_disable_CW_ptt = new Fl_Check_Button(
1314 			grp_CW_ptt->x() + 10, grp_CW_ptt->y() + 4, 200, 22,
1315 			_("disable PTT in CW mode"));
1316 			btn_disable_CW_ptt->value(progStatus.disable_CW_ptt);
1317 			btn_disable_CW_ptt->callback((Fl_Callback*)cb_disable_CW_ptt);
1318 
1319 	grp_CW_ptt->end();
1320 
1321 	Fl_Group *grp_catptt = new Fl_Group (
1322 		grp_CW_ptt->x(), grp_CW_ptt->y() + grp_CW_ptt->h() + 20,
1323 		grp_CW_ptt->w(), 60, _("CAT Port PTT options"));
1324 	grp_catptt->box(FL_ENGRAVED_BOX);
1325 	grp_catptt->align(Fl_Align(FL_ALIGN_TOP_LEFT));
1326 
1327 		int incr = (grp_CW_ptt->w() - 10) / 4;
1328 
1329 		btncatptt = new Fl_Check_Button(
1330 			grp_catptt->x() + 10, grp_catptt->y() + 5, 100, 22, _("PTT via CAT"));
1331 		btncatptt->tooltip(_("PTT is a CAT command (not hardware)"));
1332 		btncatptt->callback((Fl_Callback*)cb_btncatptt);
1333 		btncatptt->value(progStatus.comm_catptt);
1334 
1335 		btnrtsptt = new Fl_Check_Button(
1336 			btncatptt->x() + incr, grp_catptt->y() + 5, 100, 22, _("PTT via RTS"));
1337 		btnrtsptt->tooltip(_("RTS is ptt line"));
1338 		btnrtsptt->callback((Fl_Callback*)cb_btnrtsptt);
1339 		btnrtsptt->value(progStatus.comm_rtsptt);
1340 
1341 		btndtrptt = new Fl_Check_Button(
1342 			btnrtsptt->x() + incr, grp_catptt->y() + 5, 100, 22, _("PTT via DTR"));
1343 		btndtrptt->tooltip(_("DTR is ptt line"));
1344 		btndtrptt->callback((Fl_Callback*)cb_btndtrptt);
1345 		btndtrptt->value(progStatus.comm_dtrptt);
1346 
1347 		btnrtsplus = new Fl_Check_Button(
1348 			btnrtsptt->x(), btnrtsptt->y() + 24, 102, 21, _("RTS +12 v"));
1349 		btnrtsplus->tooltip(_("Initial state of RTS"));
1350 		btnrtsplus->callback((Fl_Callback*)cb_btnrtsplus);
1351 		btnrtsplus->value(progStatus.comm_rtsplus);
1352 
1353 		btndtrplus = new Fl_Check_Button(
1354 			btndtrptt->x(), btndtrptt->y() + 24, 100, 21, _("DTR +12 v"));
1355 		btndtrplus->tooltip(_("Initial state of DTR"));
1356 		btndtrplus->callback((Fl_Callback*)cb_btndtrplus);
1357 		btndtrplus->value(progStatus.comm_dtrplus);
1358 
1359 		btn2_init_ser_port = new Fl_Button(
1360 			btndtrptt->x() + incr, btndtrplus->y(), 50, 24, _("Init"));
1361 		btn2_init_ser_port->callback((Fl_Callback*)cb_init_ser_port);
1362 
1363 	grp_catptt->end();
1364 
1365 	Fl_Group *grp_ptt = new Fl_Group(
1366 		grp_catptt->x(), grp_catptt->y() + grp_catptt->h() + 20,
1367 		grp_catptt->w(), H - (grp_catptt->y() + grp_catptt->h() + 20),
1368 _("PTT control on Separate Serial Port"));
1369 		grp_ptt->box(FL_ENGRAVED_BOX);
1370 		grp_ptt->align(Fl_Align(FL_ALIGN_TOP_LEFT));
1371 
1372 		selectSepPTTPort = new Fl_ComboBox(
1373 			grp_catptt->x() + 50, grp_ptt->y() + 8,
1374 			grp_ptt->w() - 54, 22, _("Port"));
1375 		selectSepPTTPort->tooltip(_("Separate PTT serial port"));
1376 		selectSepPTTPort->box(FL_DOWN_BOX);
1377 		selectSepPTTPort->color(FL_BACKGROUND2_COLOR);
1378 		selectSepPTTPort->selection_color(FL_BACKGROUND_COLOR);
1379 		selectSepPTTPort->labeltype(FL_NORMAL_LABEL);
1380 		selectSepPTTPort->labelfont(0);
1381 		selectSepPTTPort->labelsize(14);
1382 		selectSepPTTPort->labelcolor(FL_FOREGROUND_COLOR);
1383 		selectSepPTTPort->callback((Fl_Callback*)cb_selectSepPTTPort);
1384 		selectSepPTTPort->align(Fl_Align(FL_ALIGN_LEFT));
1385 		selectSepPTTPort->when(FL_WHEN_RELEASE);
1386 		selectSepPTTPort->end();
1387 
1388 		btnSep_SCU_17 = new Fl_Check_Button(
1389 			selectSepPTTPort->x(), selectSepPTTPort->y() + 24,
1390 			128, 22, _("SCU-17"));
1391 		btnSep_SCU_17->tooltip(_("Port is SCU-17 auxilliary\nSet stop bits to ZERO"));
1392 		btnSep_SCU_17->callback((Fl_Callback*)cb_btnSep_SCU_17);
1393 		btnSep_SCU_17->value(progStatus.sep_SCU_17);
1394 
1395 		btnSepRTSptt = new Fl_Check_Button(
1396 			btnrtsptt->x(), selectSepPTTPort->y() + 24, 125, 22, _("PTT via RTS"));
1397 		btnSepRTSptt->tooltip(_("RTS is ptt line"));
1398 		btnSepRTSptt->callback((Fl_Callback*)cb_btnSepRTSptt);
1399 		btnSepRTSptt->value(progStatus.sep_rtsptt);
1400 
1401 		btnSepDTRptt = new Fl_Check_Button(
1402 			btndtrptt->x(), btnSepRTSptt->y(), 125, 22, _("PTT via DTR"));
1403 		btnSepDTRptt->tooltip(_("DTR is ptt line"));
1404 		btnSepDTRptt->callback((Fl_Callback*)cb_btnSepDTRptt);
1405 		btnSepDTRptt->value(progStatus.sep_dtrptt);
1406 
1407 		btnSepRTSplus = new Fl_Check_Button(
1408 			btnrtsptt->x(), btnSepRTSptt->y() + 24, 125, 22, _("RTS +12 v"));
1409 		btnSepRTSplus->tooltip(_("Initial state of RTS"));
1410 		btnSepRTSplus->callback((Fl_Callback*)cb_btnSepRTSplus);
1411 		btnSepRTSplus->value(progStatus.sep_rtsplus);
1412 
1413 		btnSepDTRplus = new Fl_Check_Button(
1414 			btndtrptt->x(), btnSepRTSplus->y(), 125, 22, _("DTR +12 v"));
1415 		btnSepDTRplus->tooltip(_("Initial state of DTR"));
1416 		btnSepDTRplus->callback((Fl_Callback*)cb_btnSepDTRplus);
1417 		btnSepDTRplus->value(progStatus.sep_dtrplus);
1418 
1419 		btnOkSepSerial = new Fl_Button(
1420 			btnSepDTRptt->x() + incr, btnSepDTRplus->y(),
1421 			50, 22, _("Init"));
1422 		btnOkSepSerial->callback((Fl_Callback*)cb_btnOkSepSerial);
1423 
1424 	grp_ptt->end();
1425 
1426 	tabPTT->end();
1427 
1428 	return tabPTT;
1429 }
1430 
createAUX(int X,int Y,int W,int H,const char * label)1431 Fl_Group *createAUX(int X, int Y, int W, int H, const char *label)
1432 {
1433 	Fl_Group * tabAUX = new Fl_Group(X, Y, W, H, label);
1434 	tabAUX->hide();
1435 
1436 	selectAuxPort = new Fl_ComboBox(X + 130, Y + 60, 240, 22, _("Aux"));
1437 	selectAuxPort->tooltip(_("Aux control port"));
1438 	selectAuxPort->box(FL_DOWN_BOX);
1439 	selectAuxPort->color(FL_BACKGROUND2_COLOR);
1440 	selectAuxPort->selection_color(FL_BACKGROUND_COLOR);
1441 	selectAuxPort->labeltype(FL_NORMAL_LABEL);
1442 	selectAuxPort->labelfont(0);
1443 	selectAuxPort->labelsize(14);
1444 	selectAuxPort->labelcolor(FL_FOREGROUND_COLOR);
1445 	selectAuxPort->callback((Fl_Callback*)cb_selectAuxPort);
1446 	selectAuxPort->align(Fl_Align(FL_ALIGN_LEFT));
1447 	selectAuxPort->when(FL_WHEN_RELEASE);
1448 	selectAuxPort->end();
1449 
1450 	btnAux_SCU_17 = new Fl_Check_Button(X + 130, Y + 100, 128, 22, _("  SCU-17 auxiliary\n  Yaesu 2nd USB port"));
1451 	btnAux_SCU_17->tooltip(_("Set stop bits to ZERO"));
1452 	btnAux_SCU_17->callback((Fl_Callback*)cb_btnAux_SCU_17);
1453 	btnAux_SCU_17->value(progStatus.aux_SCU_17);
1454 
1455 	Fl_Box *bxsep = new Fl_Box(X + 55, Y + 10, 400, 40,
1456 _("Use only if your setup requires a separate\nSerial Port for a special Control Signals"));
1457 	bxsep->box(FL_FLAT_BOX);
1458 
1459 	btnOkAuxSerial = new Fl_Button(X + W - 60, Y + H - 30, 50, 24, _("Init"));
1460 	btnOkAuxSerial->callback((Fl_Callback*)cb_btnOkAuxSerial);
1461 
1462 	tabAUX->end();
1463 
1464 	return tabAUX;
1465 }
1466 
createSERVER(int X,int Y,int W,int H,const char * label)1467 Fl_Group *createSERVER(int X, int Y, int W, int H, const char *label)
1468 {
1469 	Fl_Group * tabSERVER = new Fl_Group(X, Y, W, H, label);
1470 	tabSERVER->hide();
1471 
1472 	server_text = new Fl_Box(X + 30, Y + 10, W - 60, 60,
1473 _("\
1474 Change port if multiple instances of flrig / fldigi will\n\
1475 execute concurrently.  Be sure to change the respective\n\
1476 fldigi configuration item for xmlrpc server port."));
1477 	server_text->box(FL_FLAT_BOX);
1478 	server_text->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
1479 
1480 	inp_serverport = new Fl_Input2(X + 120, Y + 80, 100, 22, _("Xmlrpc port:"));
1481 	inp_serverport->tooltip(_("Socket port for xmlrpc server"));
1482 	inp_serverport->type(2);
1483 	inp_serverport->callback((Fl_Callback*)cb_server_port);
1484 	inp_serverport->value(progStatus.xmlport.c_str());
1485 	inp_serverport->when(FL_ENTER);
1486 
1487 	box_fldigi_connect = new Fl_Box(X + 25, Y + 145, 18, 18, _("Xmlrpc Client Connected"));
1488 	box_fldigi_connect->tooltip(_("Lit when connected to external xmlrpc client"));
1489 	box_fldigi_connect->box(FL_DIAMOND_DOWN_BOX);
1490 	box_fldigi_connect->color(FL_LIGHT1);
1491 	box_fldigi_connect->align(Fl_Align(FL_ALIGN_RIGHT));
1492 
1493 	tabSERVER->end();
1494 
1495 	return tabSERVER;
1496 }
1497 
createPOLLING(int X,int Y,int W,int H,const char * label)1498 Fl_Group *createPOLLING(int X, int Y, int W, int H, const char *label)
1499 {
1500 	tabPOLLING = new Fl_Group(X, Y, W, H, label);
1501 	tabPOLLING->hide();
1502 
1503 	Fl_Group* xcvr_grp7 = new Fl_Group(X + 5, Y + 5, W - 10, 45, _("Meters"));
1504 		xcvr_grp7->box(FL_ENGRAVED_BOX);
1505 		xcvr_grp7->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
1506 
1507 		poll_smeter = new Fl_Value_Input(X + 10, Y + 25, 30, 20, _("S-mtr"));
1508 		poll_smeter->tooltip(_("Poll every Nth interval"));
1509 		poll_smeter->maximum(10);
1510 		poll_smeter->step(1);
1511 		poll_smeter->value(1);
1512 		poll_smeter->callback((Fl_Callback*)cb_poll_smeter);
1513 		poll_smeter->align(Fl_Align(FL_ALIGN_RIGHT));
1514 		poll_smeter->value(progStatus.poll_smeter);
1515 
1516 		poll_pout = new Fl_Value_Input(X + 100, Y + 25, 30, 20, _("Pwr out"));
1517 		poll_pout->tooltip(_("Poll every Nth interval"));
1518 		poll_pout->maximum(10);
1519 		poll_pout->step(1);
1520 		poll_pout->value(1);
1521 		poll_pout->callback((Fl_Callback*)cb_poll_pout);
1522 		poll_pout->align(Fl_Align(FL_ALIGN_RIGHT));
1523 		poll_pout->value(progStatus.poll_pout);
1524 
1525 		poll_swr = new Fl_Value_Input(X + 190, Y + 25, 30, 20, _("SWR"));
1526 		poll_swr->tooltip(_("Poll every Nth interval"));
1527 		poll_swr->maximum(10);
1528 		poll_swr->step(1);
1529 		poll_swr->value(1);
1530 		poll_swr->callback((Fl_Callback*)cb_poll_swr);
1531 		poll_swr->align(Fl_Align(FL_ALIGN_RIGHT));
1532 		poll_swr->value(progStatus.poll_swr);
1533 
1534 		poll_alc = new Fl_Value_Input(X + 280, Y + 25, 30, 20, _("ALC"));
1535 		poll_alc->tooltip(_("Poll every Nth interval"));
1536 		poll_alc->maximum(10);
1537 		poll_alc->step(1);
1538 		poll_alc->value(1);
1539 		poll_alc->callback((Fl_Callback*)cb_poll_alc);
1540 		poll_alc->align(Fl_Align(FL_ALIGN_RIGHT));
1541 		poll_alc->value(progStatus.poll_alc);
1542 
1543 		btnSetMeters = new Fl_Button(X + 370, Y + 25, 60, 20, _("Set all"));
1544 		btnSetMeters->tooltip("Set all meter polls");
1545 		btnSetMeters->callback((Fl_Callback*)cb_btnSetMeters);
1546 
1547 		poll_meters = new Fl_Value_Input(X + 435, Y + 25, 30, 20);
1548 		poll_meters->tooltip(_("Poll every Nth interval"));
1549 		poll_meters->maximum(10);
1550 		poll_meters->step(1);
1551 		poll_meters->value(progStatus.poll_meters);
1552 		poll_meters->callback((Fl_Callback*)cb_poll_meters);
1553 		poll_meters->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
1554 		poll_meters->value(progStatus.poll_meters);
1555 
1556 	xcvr_grp7->end();
1557 	Fl_Group* xcvr_grp8 = new Fl_Group(X + 5, Y + 50, W - 10, 45, _("Operating Controls"));
1558 		xcvr_grp8->box(FL_ENGRAVED_BOX);
1559 		xcvr_grp8->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
1560 
1561 		poll_frequency = new Fl_Value_Input(X + 10, Y + 70, 30, 20, _("Freq"));
1562 		poll_frequency->tooltip(_("Poll xcvr frequency"));
1563 		poll_frequency->maximum(10);
1564 		poll_frequency->step(1);
1565 		poll_frequency->value(1);
1566 		poll_frequency->callback((Fl_Callback*)cb_poll_frequency);
1567 		poll_frequency->align(Fl_Align(FL_ALIGN_RIGHT));
1568 		poll_frequency->value(progStatus.poll_frequency);
1569 
1570 		poll_mode = new Fl_Value_Input(X + 100, Y + 70, 30, 20, _("Mode"));
1571 		poll_mode->tooltip(_("Poll xcvr mode"));
1572 		poll_mode->maximum(10);
1573 		poll_mode->step(1);
1574 		poll_mode->value(1);
1575 		poll_mode->callback((Fl_Callback*)cb_poll_mode);
1576 		poll_mode->align(Fl_Align(FL_ALIGN_RIGHT));
1577 		poll_mode->value(progStatus.poll_mode);
1578 
1579 		poll_bandwidth = new Fl_Value_Input(X + 190, Y + 70, 30, 20, _("BW"));
1580 		poll_bandwidth->tooltip(_("Poll xcvr bandwidth"));
1581 		poll_bandwidth->maximum(10);
1582 		poll_bandwidth->step(1);
1583 		poll_bandwidth->value(1);
1584 		poll_bandwidth->callback((Fl_Callback*)cb_poll_bandwidth);
1585 		poll_bandwidth->align(Fl_Align(FL_ALIGN_RIGHT));
1586 		poll_bandwidth->value(progStatus.poll_bandwidth);
1587 
1588 		btnSetOps = new Fl_Button(X + 370, Y + 70, 60, 20, _("Set all"));
1589 		btnSetOps->tooltip("Poll all operating values");
1590 		btnSetOps->callback((Fl_Callback*)cb_btnSetOps);
1591 
1592 		poll_ops = new Fl_Value_Input(X + 435, Y + 70, 30, 20);
1593 		poll_ops->tooltip(_("Poll every Nth interval"));
1594 		poll_ops->maximum(10);
1595 		poll_ops->step(1);
1596 		poll_ops->value(progStatus.poll_ops);
1597 		poll_ops->callback((Fl_Callback*)cb_poll_ops);
1598 		poll_ops->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
1599 		poll_ops->value(progStatus.poll_ops);
1600 
1601 		xcvr_grp8->end();
1602 
1603 	Fl_Group* xcvr_grp9 = new Fl_Group(X + 5, Y + 95, W - 10, 130, _("Additional Controls"));
1604 		xcvr_grp9->box(FL_ENGRAVED_FRAME);
1605 		xcvr_grp9->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
1606 
1607 		poll_volume = new Fl_Value_Input(X + 10, Y + 115, 30, 20, _("Volume"));
1608 		poll_volume->tooltip(_("Volume control"));
1609 		poll_volume->maximum(10);
1610 		poll_volume->step(1);
1611 		poll_volume->callback((Fl_Callback*)cb_poll_volume);
1612 		poll_volume->align(Fl_Align(FL_ALIGN_RIGHT));
1613 		poll_volume->value(progStatus.poll_volume);
1614 
1615 		poll_micgain = new Fl_Value_Input(X + 100, Y + 115, 30, 20, _("Mic"));
1616 		poll_micgain->tooltip(_("Microphone gain"));
1617 		poll_micgain->maximum(10);
1618 		poll_micgain->step(1);
1619 		poll_micgain->callback((Fl_Callback*)cb_poll_micgain);
1620 		poll_micgain->align(Fl_Align(FL_ALIGN_RIGHT));
1621 		poll_micgain->value(progStatus.poll_micgain);
1622 
1623 		poll_rfgain = new Fl_Value_Input(X + 190, Y + 115, 30, 20, _("RF"));
1624 		poll_rfgain->tooltip(_("RF gain"));
1625 		poll_rfgain->maximum(10);
1626 		poll_rfgain->step(1);
1627 		poll_rfgain->callback((Fl_Callback*)cb_poll_rfgain);
1628 		poll_rfgain->align(Fl_Align(FL_ALIGN_RIGHT));
1629 		poll_rfgain->value(progStatus.poll_rfgain);
1630 
1631 		poll_power_control = new Fl_Value_Input(X + 280, Y + 115, 30, 20, _("Power"));
1632 		poll_power_control->tooltip(_("Power output"));
1633 		poll_power_control->maximum(10);
1634 		poll_power_control->step(1);
1635 		poll_power_control->callback((Fl_Callback*)cb_poll_power_control);
1636 		poll_power_control->align(Fl_Align(FL_ALIGN_RIGHT));
1637 		poll_power_control->value(progStatus.poll_power_control);
1638 
1639 		poll_ptt = new Fl_Value_Input(X + 370, Y + 115, 30, 20, _("PTT"));
1640 		poll_ptt->tooltip(_("Push to talk"));
1641 		poll_ptt->maximum(10);
1642 		poll_ptt->step(1);
1643 		poll_ptt->callback((Fl_Callback*)cb_poll_ptt);
1644 		poll_ptt->align(Fl_Align(FL_ALIGN_RIGHT));
1645 		poll_ptt->value(progStatus.poll_ptt);
1646 
1647 		poll_ifshift = new Fl_Value_Input(X + 10, Y + 140, 30, 20, _("IF"));
1648 		poll_ifshift->tooltip(_("IF shift"));
1649 		poll_ifshift->maximum(10);
1650 		poll_ifshift->step(1);
1651 		poll_ifshift->callback((Fl_Callback*)cb_poll_ifshift);
1652 		poll_ifshift->align(Fl_Align(FL_ALIGN_RIGHT));
1653 		poll_ifshift->value(progStatus.poll_ifshift);
1654 
1655 		poll_notch = new Fl_Value_Input(X + 100, Y + 140, 30, 20, _("Notch"));
1656 		poll_notch->tooltip(_("Manual notch"));
1657 		poll_notch->maximum(10);
1658 		poll_notch->step(1);
1659 		poll_notch->callback((Fl_Callback*)cb_poll_notch);
1660 		poll_notch->align(Fl_Align(FL_ALIGN_RIGHT));
1661 		poll_notch->value(progStatus.poll_notch);
1662 
1663 		poll_auto_notch = new Fl_Value_Input(X + 190, Y + 140, 30, 20, _("Auto"));
1664 		poll_auto_notch->tooltip(_("Auto notch"));
1665 		poll_auto_notch->maximum(10);
1666 		poll_auto_notch->step(1);
1667 		poll_auto_notch->callback((Fl_Callback*)cb_poll_auto_notch);
1668 		poll_auto_notch->align(Fl_Align(FL_ALIGN_RIGHT));
1669 		poll_auto_notch->value(progStatus.poll_auto_notch);
1670 
1671 		poll_tuner = new Fl_Value_Input(X + 280, Y + 140, 30, 20, _("Tuner"));
1672 		poll_tuner->tooltip(_("Auto Tuner"));
1673 		poll_tuner->maximum(10);
1674 		poll_tuner->step(1);
1675 		poll_tuner->callback((Fl_Callback*)cb_poll_tuner);
1676 		poll_tuner->align(Fl_Align(FL_ALIGN_RIGHT));
1677 		poll_tuner->value(progStatus.poll_tuner);
1678 
1679 		poll_pre_att = new Fl_Value_Input(X + 10, Y + 165, 30, 20, _("Pre/Att"));
1680 		poll_pre_att->tooltip(_("Preamp / Attenuator"));
1681 		poll_pre_att->maximum(10);
1682 		poll_pre_att->step(1);
1683 		poll_pre_att->callback((Fl_Callback*)cb_poll_pre_att);
1684 		poll_pre_att->align(Fl_Align(FL_ALIGN_RIGHT));
1685 		poll_pre_att->value(progStatus.poll_pre_att);
1686 
1687 		poll_squelch = new Fl_Value_Input(X + 100, Y + 165, 30, 20, _("Squelch"));
1688 		poll_squelch->tooltip(_("Squelch"));
1689 		poll_squelch->maximum(10);
1690 		poll_squelch->step(1);
1691 		poll_squelch->callback((Fl_Callback*)cb_poll_squelch);
1692 		poll_squelch->align(Fl_Align(FL_ALIGN_RIGHT));
1693 		poll_squelch->value(progStatus.poll_squelch);
1694 
1695 		poll_split = new Fl_Value_Input(X + 190, Y + 165, 30, 20, _("Split"));
1696 		poll_split->tooltip(_("Split vfo operation"));
1697 		poll_split->maximum(10);
1698 		poll_split->step(1);
1699 		poll_split->callback((Fl_Callback*)cb_poll_split);
1700 		poll_split->align(Fl_Align(FL_ALIGN_RIGHT));
1701 		poll_split->value(progStatus.poll_split);
1702 
1703 		poll_noise = new Fl_Value_Input(X + 10, Y + 190, 30, 20, _("Blanker"));
1704 		poll_noise->tooltip(_("Noise blanker"));
1705 		poll_noise->maximum(10);
1706 		poll_noise->step(1);
1707 		poll_noise->callback((Fl_Callback*)cb_poll_noise);
1708 		poll_noise->align(Fl_Align(FL_ALIGN_RIGHT));
1709 		poll_noise->value(progStatus.poll_noise);
1710 
1711 		poll_nr = new Fl_Value_Input(X + 100, Y + 190, 30, 20, _("Noise red"));
1712 		poll_nr->tooltip(_("Noise reduction"));
1713 		poll_nr->maximum(10);
1714 		poll_nr->step(1);
1715 		poll_nr->callback((Fl_Callback*)cb_poll_nr);
1716 		poll_nr->align(Fl_Align(FL_ALIGN_RIGHT));
1717 		poll_nr->value(progStatus.poll_nr);
1718 
1719 		poll_compression = new Fl_Value_Input(X + 190, Y + 190, 30, 20, _("Comp'"));
1720 		poll_compression->tooltip(_("Compression"));
1721 		poll_compression->maximum(10);
1722 		poll_compression->step(1);
1723 		poll_compression->callback((Fl_Callback*)cb_poll_compression);
1724 		poll_compression->align(Fl_Align(FL_ALIGN_RIGHT));
1725 		poll_compression->value(progStatus.poll_compression);
1726 
1727 		poll_break_in = new Fl_Value_Input(X + 280, Y + 165, 30, 20, _("QSK"));
1728 		poll_break_in->tooltip(_("Break In"));
1729 		poll_break_in->maximum(10);
1730 		poll_break_in->step(1);
1731 		poll_break_in->callback((Fl_Callback*)cb_poll_break_in);
1732 		poll_break_in->align(Fl_Align(FL_ALIGN_RIGHT));
1733 		poll_break_in->value(progStatus.poll_break_in);
1734 
1735 		btnSetAdd = new Fl_Button(X + 370, Y + 190, 60, 20, _("Set all"));
1736 		btnSetAdd->callback((Fl_Callback*)cb_btnSetAdd);
1737 
1738 		poll_all = new Fl_Value_Input(X + 435, Y + 190, 30, 20);
1739 		poll_all->tooltip(_("Poll every Nth interval"));
1740 		poll_all->maximum(10);
1741 		poll_all->step(1);
1742 		poll_all->value(4);
1743 		poll_all->callback((Fl_Callback*)cb_poll_all);
1744 		poll_all->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE));
1745 		poll_all->value(progStatus.poll_all);
1746 
1747 	xcvr_grp9->end();
1748 
1749 	tabPOLLING->end();
1750 
1751 	return tabPOLLING;
1752 }
1753 
createSNDCMD(int X,int Y,int W,int H,const char * label)1754 Fl_Group *createSNDCMD(int X, int Y, int W, int H, const char *label)
1755 {
1756 	Fl_Group *tabSNDCMD = new Fl_Group(X, Y, W, H, label);
1757 	tabSNDCMD->hide();
1758 
1759 	txt_command = new Fl_Input2(X + 25, Y + 20, 435, 24,
1760 _("Enter text as ASCII string\nOr sequence of hex values, x80 etc separated by spaces"));
1761 	txt_command->box(FL_DOWN_BOX);
1762 	txt_command->color(FL_BACKGROUND2_COLOR);
1763 	txt_command->selection_color(FL_SELECTION_COLOR);
1764 	txt_command->labeltype(FL_NORMAL_LABEL);
1765 	txt_command->labelfont(0);
1766 	txt_command->labelsize(14);
1767 	txt_command->labelcolor(FL_FOREGROUND_COLOR);
1768 	txt_command->align(Fl_Align(FL_ALIGN_BOTTOM_LEFT));
1769 	txt_command->when(FL_WHEN_RELEASE);
1770 
1771 	txt_response = new Fl_Output(X + 25, Y + 80, 435, 24, _("Response to the SEND button"));
1772 	txt_response->align(Fl_Align(FL_ALIGN_BOTTOM_LEFT));
1773 
1774 	btn_icom_pre = new Fl_Button(X + 380, Y + 115, 80, 20, _("ICOM pre"));
1775 	btn_icom_pre->callback((Fl_Callback*)cb_btn_icom_pre);
1776 
1777 	btn_icom_post = new Fl_Button(X + 380, Y + 145, 80, 20, _("ICOM post"));
1778 	btn_icom_post->callback((Fl_Callback*)cb_btn_icom_post);
1779 
1780 	btn_send_command = new Fl_Button(X + 380, Y + 180, 80, 20, _("SEND"));
1781 	btn_send_command->callback((Fl_Callback*)cb_btn_send_command);
1782 
1783 	tabSNDCMD->end();
1784 
1785 	return tabSNDCMD;
1786 }
1787 
createCOMMANDS(int X,int Y,int W,int H,const char * label)1788 Fl_Group *createCOMMANDS(int X, int Y, int W, int H, const char *label)
1789 {
1790 	Fl_Group *tabCOMMANDS = new Fl_Group(X, Y, W, H, label);
1791 
1792 	Fl_Tabs *tabCmds = new Fl_Tabs(X, Y, W, H - 25);
1793 
1794 	std::string *cmdlbls[] = {
1795 		&progStatus.label1,  &progStatus.label2,  &progStatus.label3,  &progStatus.label4,
1796 		&progStatus.label5,  &progStatus.label6,  &progStatus.label7,  &progStatus.label8,
1797 		&progStatus.label9,  &progStatus.label10, &progStatus.label11, &progStatus.label12,
1798 		&progStatus.label13, &progStatus.label14, &progStatus.label15, &progStatus.label16,
1799 		&progStatus.label17, &progStatus.label18, &progStatus.label19, &progStatus.label20,
1800 		&progStatus.label21, &progStatus.label22, &progStatus.label23, &progStatus.label24
1801 		};
1802 
1803 	Fl_Input2 *cmdbtns[] = {
1804 		cmdlbl1,  cmdlbl2,  cmdlbl3,  cmdlbl4,
1805 		cmdlbl5,  cmdlbl6,  cmdlbl7,  cmdlbl8,
1806 		cmdlbl9,  cmdlbl10, cmdlbl11, cmdlbl12,
1807 		cmdlbl13, cmdlbl14, cmdlbl15, cmdlbl16,
1808 		cmdlbl17, cmdlbl18, cmdlbl19, cmdlbl20,
1809 		cmdlbl21, cmdlbl22, cmdlbl23, cmdlbl24
1810 		};
1811 
1812 	Fl_Input2 *cmdtexts[] = {
1813 		cmdtext1,  cmdtext2,  cmdtext3,  cmdtext4,
1814 		cmdtext5,  cmdtext6,  cmdtext7,  cmdtext8,
1815 		cmdtext9,  cmdtext10, cmdtext11, cmdtext12,
1816 		cmdtext13, cmdtext14, cmdtext15, cmdtext16,
1817 		cmdtext17, cmdtext18, cmdtext19, cmdtext20,
1818 		cmdtext21, cmdtext22, cmdtext23, cmdtext24
1819 		};
1820 
1821 	Fl_Input2 *shftcmdtexts[] = {
1822 		shftcmdtext1,  shftcmdtext2,  shftcmdtext3,  shftcmdtext4,
1823 		shftcmdtext5,  shftcmdtext6,  shftcmdtext7,  shftcmdtext8,
1824 		shftcmdtext9,  shftcmdtext10, shftcmdtext11, shftcmdtext12,
1825 		shftcmdtext13, shftcmdtext14, shftcmdtext15, shftcmdtext16,
1826 		shftcmdtext17, shftcmdtext18, shftcmdtext19, shftcmdtext20,
1827 		shftcmdtext21, shftcmdtext22, shftcmdtext23, shftcmdtext24
1828 		};
1829 
1830 	std::string *cmd[] = {
1831 		&progStatus.command1,  &progStatus.command2,  &progStatus.command3,  &progStatus.command4,
1832 		&progStatus.command5,  &progStatus.command6,  &progStatus.command7,  &progStatus.command8,
1833 		&progStatus.command9,  &progStatus.command10, &progStatus.command11, &progStatus.command12,
1834 		&progStatus.command13, &progStatus.command14, &progStatus.command15, &progStatus.command16,
1835 		&progStatus.command17, &progStatus.command18, &progStatus.command19, &progStatus.command20,
1836 		&progStatus.command21, &progStatus.command22, &progStatus.command23, &progStatus.command24
1837 		};
1838 
1839 	std::string *shftcmd[] = {
1840 		&progStatus.shftcmd1,  &progStatus.shftcmd2,  &progStatus.shftcmd3,  &progStatus.shftcmd4,
1841 		&progStatus.shftcmd5,  &progStatus.shftcmd6,  &progStatus.shftcmd7,  &progStatus.shftcmd8,
1842 		&progStatus.shftcmd9,  &progStatus.shftcmd10, &progStatus.shftcmd11, &progStatus.shftcmd12,
1843 		&progStatus.shftcmd13, &progStatus.shftcmd14, &progStatus.shftcmd15, &progStatus.shftcmd16,
1844 		&progStatus.shftcmd17, &progStatus.shftcmd18, &progStatus.shftcmd19, &progStatus.shftcmd20,
1845 		&progStatus.shftcmd21, &progStatus.shftcmd22, &progStatus.shftcmd23, &progStatus.shftcmd24
1846 		};
1847 
1848 	static const char *lbl[24] = {
1849 		"1", "2", "3", "4", "5", "6", "7", "8",
1850 		"9", "10", "11", "12", "13", "14", "15", "16",
1851 		"17", "18", "19", "20", "21", "22", "23", "24"
1852 		};
1853 
1854 	tabCmds1 = new Fl_Group(X, Y + 20, W, H - 50, _("1-4"));
1855 
1856 		bx1a = new Fl_Box(X + 23, Y + 26, 75, 16, "Label");
1857 		bx1a->box(FL_FLAT_BOX);
1858 		bx1a->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
1859 
1860 		bx1b = new Fl_Box(X + 80, Y + 26, W - 80 - 2, 16, "Command");
1861 		bx1b->box(FL_FLAT_BOX);
1862 		bx1b->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
1863 
1864 		for (int n = 0; n < 4; n++) {
1865 			cmdbtns[n] = new Fl_Input2(X + 27, Y + 46 + (n % 4) * 40, 80, 20, lbl[n]);
1866 			cmdbtns[n]->align(FL_ALIGN_LEFT);
1867 			cmdbtns[n]->value(cmdlbls[n]->c_str());
1868 			cmdbtns[n]->callback((Fl_Callback*)cb_cmdlbl, (void *)long(n));
1869 
1870 			cmdtexts[n] = new Fl_Input2(X + 110, Y + 46 + (n % 4) * 40, W - 110 - 2, 20, "");
1871 			cmdtexts[n]->align(FL_ALIGN_LEFT);
1872 			cmdtexts[n]->value(cmd[n]->c_str());
1873 			cmdtexts[n]->callback((Fl_Callback*)cb_cmdtext, (void *)long(n));
1874 
1875 			shftcmdtexts[n] = new Fl_Input2(X + 110, Y + 66 + (n % 4) * 40, W - 110 - 2, 20, "SHIFT");
1876 			shftcmdtexts[n]->align(FL_ALIGN_LEFT);
1877 			shftcmdtexts[n]->value(shftcmd[n]->c_str());
1878 			shftcmdtexts[n]->callback((Fl_Callback*)cb_shftcmdtext, (void *)long(n));
1879 		}
1880 
1881 	tabCmds1->end();
1882 
1883 	tabCmds2 = new Fl_Group(X, Y + 20, W, H - 50, _("5-8"));
1884 
1885 		bx2a = new Fl_Box(X + 23, Y + 26, 75, 16, "Label");
1886 		bx2a->box(FL_FLAT_BOX);
1887 		bx2a->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
1888 
1889 		bx2b = new Fl_Box(X + 80, Y + 26, W - 80 - 2, 16, "Command");
1890 		bx2b->box(FL_FLAT_BOX);
1891 		bx2b->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
1892 
1893 		for (int n = 4; n < 8; n++) {
1894 			cmdbtns[n] = new Fl_Input2(X + 27, Y + 46 + (n % 4) * 40, 80, 20, lbl[n]);
1895 			cmdbtns[n]->align(FL_ALIGN_LEFT);
1896 			cmdbtns[n]->value(cmdlbls[n]->c_str());
1897 			cmdbtns[n]->callback((Fl_Callback*)cb_cmdlbl, (void *)long(n));
1898 
1899 			cmdtexts[n] = new Fl_Input2(X + 110, Y + 46 + (n % 4) * 40, W - 110 - 2, 20, "");
1900 			cmdtexts[n]->align(FL_ALIGN_LEFT);
1901 			cmdtexts[n]->value(cmd[n]->c_str());
1902 			cmdtexts[n]->callback((Fl_Callback*)cb_cmdtext, (void *)long(n));
1903 
1904 			shftcmdtexts[n] = new Fl_Input2(X + 110, Y + 66 + (n % 4) * 40, W - 110 - 2, 20, "SHIFT");
1905 			shftcmdtexts[n]->align(FL_ALIGN_LEFT);
1906 			shftcmdtexts[n]->value(shftcmd[n]->c_str());
1907 			shftcmdtexts[n]->callback((Fl_Callback*)cb_shftcmdtext, (void *)long(n));
1908 		}
1909 
1910 	tabCmds2->end();
1911 
1912 	tabCmds3 = new Fl_Group(X, Y + 20, W, H - 50, _("9-12"));
1913 		tabCmds2->hide();
1914 
1915 		bx3a = new Fl_Box(X + 23, Y + 26, 75, 16, "Label");
1916 		bx3a->box(FL_FLAT_BOX);
1917 		bx3a->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
1918 
1919 		bx3b = new Fl_Box(X + 80, Y + 26, W - 80 - 2, 16, "Command");
1920 		bx3b->box(FL_FLAT_BOX);
1921 		bx3b->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
1922 
1923 		for (int n = 8; n < 12; n++) {
1924 			cmdbtns[n] = new Fl_Input2(X + 27, Y + 46 + (n % 4) * 40, 80, 20, lbl[n]);
1925 			cmdbtns[n]->align(FL_ALIGN_LEFT);
1926 			cmdbtns[n]->value(cmdlbls[n]->c_str());
1927 			cmdbtns[n]->callback((Fl_Callback*)cb_cmdlbl, (void *)long(n));
1928 
1929 			cmdtexts[n] = new Fl_Input2(X + 110, Y + 46 + (n % 4) * 40, W - 110 - 2, 20, "");
1930 			cmdtexts[n]->align(FL_ALIGN_LEFT);
1931 			cmdtexts[n]->value(cmd[n]->c_str());
1932 			cmdtexts[n]->callback((Fl_Callback*)cb_cmdtext, (void *)long(n));
1933 
1934 			shftcmdtexts[n] = new Fl_Input2(X + 110, Y + 66 + (n % 4) * 40, W - 110 - 2, 20, "SHIFT");
1935 			shftcmdtexts[n]->align(FL_ALIGN_LEFT);
1936 			shftcmdtexts[n]->value(shftcmd[n]->c_str());
1937 			shftcmdtexts[n]->callback((Fl_Callback*)cb_shftcmdtext, (void *)long(n));
1938 		}
1939 
1940 	tabCmds3->end();
1941 
1942 	tabCmds4 = new Fl_Group(X, Y + 20, W, H - 50, _("13-16"));
1943 
1944 		bx4a = new Fl_Box(X + 23, Y + 26, 75, 16, "Label");
1945 		bx4a->box(FL_FLAT_BOX);
1946 		bx4a->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
1947 
1948 		bx4b = new Fl_Box(X + 80, Y + 26, W - 80 - 2, 16, "Command");
1949 		bx4b->box(FL_FLAT_BOX);
1950 		bx4b->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
1951 
1952 		for (int n = 12; n < 16; n++) {
1953 			cmdbtns[n] = new Fl_Input2(X + 27, Y + 46 + (n % 4) * 40, 80, 20, lbl[n]);
1954 			cmdbtns[n]->align(FL_ALIGN_LEFT);
1955 			cmdbtns[n]->value(cmdlbls[n]->c_str());
1956 			cmdbtns[n]->callback((Fl_Callback*)cb_cmdlbl, (void *)long(n));
1957 
1958 			cmdtexts[n] = new Fl_Input2(X + 110, Y + 46 + (n % 4) * 40, W - 110 - 2, 20, "");
1959 			cmdtexts[n]->align(FL_ALIGN_LEFT);
1960 			cmdtexts[n]->value(cmd[n]->c_str());
1961 			cmdtexts[n]->callback((Fl_Callback*)cb_cmdtext, (void *)long(n));
1962 
1963 			shftcmdtexts[n] = new Fl_Input2(X + 110, Y + 66 + (n % 4) * 40, W - 110 - 2, 20, "SHIFT");
1964 			shftcmdtexts[n]->align(FL_ALIGN_LEFT);
1965 			shftcmdtexts[n]->value(shftcmd[n]->c_str());
1966 			shftcmdtexts[n]->callback((Fl_Callback*)cb_shftcmdtext, (void *)long(n));
1967 		}
1968 
1969 	tabCmds4->end();
1970 
1971 	tabCmds5 = new Fl_Group(X, Y + 20, W, H - 50, _("17-20"));
1972 
1973 		bx5a = new Fl_Box(X + 23, Y + 26, 75, 16, "Label");
1974 		bx5a->box(FL_FLAT_BOX);
1975 		bx5a->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
1976 
1977 		bx5b = new Fl_Box(X + 80, Y + 26, W - 80 - 2, 16, "Command");
1978 		bx5b->box(FL_FLAT_BOX);
1979 		bx5b->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
1980 
1981 		for (int n = 16; n < 20; n++) {
1982 			cmdbtns[n] = new Fl_Input2(X + 27, Y + 46 + (n % 4) * 40, 80, 20, lbl[n]);
1983 			cmdbtns[n]->align(FL_ALIGN_LEFT);
1984 			cmdbtns[n]->value(cmdlbls[n]->c_str());
1985 			cmdbtns[n]->callback((Fl_Callback*)cb_cmdlbl, (void *)long(n));
1986 
1987 			cmdtexts[n] = new Fl_Input2(X + 110, Y + 46 + (n % 4) * 40, W - 110 - 2, 20, "");
1988 			cmdtexts[n]->align(FL_ALIGN_LEFT);
1989 			cmdtexts[n]->value(cmd[n]->c_str());
1990 			cmdtexts[n]->callback((Fl_Callback*)cb_cmdtext, (void *)long(n));
1991 
1992 			shftcmdtexts[n] = new Fl_Input2(X + 110, Y + 66 + (n % 4) * 40, W - 110 - 2, 20, "SHIFT");
1993 			shftcmdtexts[n]->align(FL_ALIGN_LEFT);
1994 			shftcmdtexts[n]->value(shftcmd[n]->c_str());
1995 			shftcmdtexts[n]->callback((Fl_Callback*)cb_shftcmdtext, (void *)long(n));
1996 		}
1997 
1998 	tabCmds5->end();
1999 
2000 	tabCmds6 = new Fl_Group(X, Y + 20, W, H - 50, _("21-24"));
2001 
2002 		bx6a = new Fl_Box(X + 23, Y + 26, 75, 16, "Label");
2003 		bx6a->box(FL_FLAT_BOX);
2004 		bx6a->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
2005 
2006 		bx6b = new Fl_Box(X + 80, Y + 26, W - 80 - 2, 16, "Command");
2007 		bx6b->box(FL_FLAT_BOX);
2008 		bx6b->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
2009 
2010 		for (int n = 20; n < 24; n++) {
2011 			cmdbtns[n] = new Fl_Input2(X + 27, Y + 46 + (n % 4) * 40, 80, 20, lbl[n]);
2012 			cmdbtns[n]->align(FL_ALIGN_LEFT);
2013 			cmdbtns[n]->value(cmdlbls[n]->c_str());
2014 			cmdbtns[n]->callback((Fl_Callback*)cb_cmdlbl, (void *)long(n));
2015 
2016 			cmdtexts[n] = new Fl_Input2(X + 110, Y + 46 + (n % 4) * 40, W - 110 - 2, 20, "");
2017 			cmdtexts[n]->align(FL_ALIGN_LEFT);
2018 			cmdtexts[n]->value(cmd[n]->c_str());
2019 			cmdtexts[n]->callback((Fl_Callback*)cb_cmdtext, (void *)long(n));
2020 
2021 			shftcmdtexts[n] = new Fl_Input2(X + 110, Y + 66 + (n % 4) * 40, W - 110 - 2, 20, "SHIFT");
2022 			shftcmdtexts[n]->align(FL_ALIGN_LEFT);
2023 			shftcmdtexts[n]->value(shftcmd[n]->c_str());
2024 			shftcmdtexts[n]->callback((Fl_Callback*)cb_shftcmdtext, (void *)long(n));
2025 		}
2026 
2027 	tabCmds6->end();
2028 
2029 	tabCmds->end();
2030 
2031 	cmdResponse = new Fl_Output(cmdtexts[0]->x(), Y + H - 20, cmdtexts[0]->w(), 20, "Response:");
2032 	cmdResponse->align(FL_ALIGN_LEFT);
2033 
2034 	tabCOMMANDS->end();
2035 
2036 	return tabCOMMANDS;
2037 }
2038 
createRestore(int X,int Y,int W,int H,const char * label)2039 Fl_Group *createRestore(int X, int Y, int W, int H, const char *label)
2040 {
2041 	Fl_Group *tabRESTORE = new Fl_Group(X, Y, W, H, label);
2042 
2043 	tabRESTORE->hide();
2044 
2045 	Fl_Box *restore_box = new Fl_Box(X + 8, Y + 5, 455, 30,
2046 		_("Read / Restore these parameters"));
2047 	restore_box->box(FL_ENGRAVED_FRAME);
2048 
2049 	btnRestoreFrequency = new Fl_Check_Button(X + 8, Y + 40, 20, 20, _("Freq"));
2050 	btnRestoreFrequency->tooltip(_("Restore frequency"));
2051 	btnRestoreFrequency->callback((Fl_Callback*)cb_restore);
2052 	btnRestoreFrequency->align(Fl_Align(FL_ALIGN_RIGHT));
2053 	btnRestoreFrequency->value(progStatus.restore_frequency == 1);
2054 
2055 	btnRestoreMode = new Fl_Check_Button(X + 8, Y + 65, 20, 20, _("Mode"));
2056 	btnRestoreMode->tooltip(_("Restore Mode"));
2057 	btnRestoreMode->callback((Fl_Callback*)cb_restore);
2058 	btnRestoreMode->align(Fl_Align(FL_ALIGN_RIGHT));
2059 	btnRestoreMode->value(progStatus.restore_mode == 1);
2060 
2061 	btnRestoreBandwidth = new Fl_Check_Button(X + 8, Y + 90, 20, 20, _("Bandwidth"));
2062 	btnRestoreBandwidth->tooltip(_("Restore bandwidth"));
2063 	btnRestoreBandwidth->callback((Fl_Callback*)cb_restore);
2064 	btnRestoreBandwidth->align(Fl_Align(FL_ALIGN_RIGHT));
2065 	btnRestoreBandwidth->value(progStatus.restore_bandwidth == 1);
2066 
2067 	btnRestoreVolume = new Fl_Check_Button(X + 8, Y + 115, 20, 20, _("Volume"));
2068 	btnRestoreVolume->tooltip(_("Restore volume control"));
2069 	btnRestoreVolume->callback((Fl_Callback*)cb_restore);
2070 	btnRestoreVolume->align(Fl_Align(FL_ALIGN_RIGHT));
2071 	btnRestoreVolume->value(progStatus.restore_volume == 1);
2072 
2073 	btnRestoreMicGain = new Fl_Check_Button(X + 8, Y + 140, 20, 20, _("Mic gain"));
2074 	btnRestoreMicGain->tooltip(_("Restore mic gain"));
2075 	btnRestoreMicGain->callback((Fl_Callback*)cb_restore);
2076 	btnRestoreMicGain->align(Fl_Align(FL_ALIGN_RIGHT));
2077 	btnRestoreMicGain->value(progStatus.restore_mic_gain == 1);
2078 
2079 	btnRestoreRfGain = new Fl_Check_Button(X + 8, Y + 165, 20, 20, _("RF gain"));
2080 	btnRestoreRfGain->tooltip(_("Restore RF gain"));
2081 	btnRestoreRfGain->callback((Fl_Callback*)cb_restore);
2082 	btnRestoreRfGain->align(Fl_Align(FL_ALIGN_RIGHT));
2083 	btnRestoreRfGain->value(progStatus.restore_rf_gain == 1);
2084 
2085 	btnRestorePowerControl = new Fl_Check_Button(X + 8, Y + 190, 20, 20, _("Pwr level"));
2086 	btnRestorePowerControl->tooltip(_("Restore power control"));
2087 	btnRestorePowerControl->callback((Fl_Callback*)cb_restore);
2088 	btnRestorePowerControl->align(Fl_Align(FL_ALIGN_RIGHT));
2089 	btnRestorePowerControl->value(progStatus.restore_power_control == 1);
2090 
2091 	btnRestoreIFshift = new Fl_Check_Button(X + 128, Y + 40, 20, 20, _("IFshift"));
2092 	btnRestoreIFshift->tooltip(_("Restore IF shift control"));
2093 	btnRestoreIFshift->callback((Fl_Callback*)cb_restore);
2094 	btnRestoreIFshift->align(Fl_Align(FL_ALIGN_RIGHT));
2095 	btnRestoreIFshift->value(progStatus.restore_if_shift == 1);
2096 
2097 	btnRestoreNotch = new Fl_Check_Button(X + 128, Y + 65, 20, 20, _("Notch"));
2098 	btnRestoreNotch->tooltip(_("Restore notch control"));
2099 	btnRestoreNotch->callback((Fl_Callback*)cb_restore);
2100 	btnRestoreNotch->align(Fl_Align(FL_ALIGN_RIGHT));
2101 	btnRestoreNotch->value(progStatus.restore_notch == 1);
2102 
2103 	btnRestoreAutoNotch = new Fl_Check_Button(X + 128, Y + 90, 20, 20, _("Auto Ntch"));
2104 	btnRestoreAutoNotch->tooltip(_("Restore auto notch setting"));
2105 	btnRestoreAutoNotch->callback((Fl_Callback*)cb_restore);
2106 	btnRestoreAutoNotch->align(Fl_Align(FL_ALIGN_RIGHT));
2107 	btnRestoreAutoNotch->value(progStatus.restore_auto_notch == 1);
2108 
2109 	btnRestoreSquelch = new Fl_Check_Button(X + 128, Y + 115, 20, 20, _("Squelch"));
2110 	btnRestoreSquelch->tooltip(_("Restore squelch"));
2111 	btnRestoreSquelch->callback((Fl_Callback*)cb_restore);
2112 	btnRestoreSquelch->align(Fl_Align(FL_ALIGN_RIGHT));
2113 	btnRestoreSquelch->value(progStatus.restore_squelch == 1);
2114 
2115 	btnRestoreSplit = new Fl_Check_Button(X + 128, Y + 140, 20, 20, _("Split"));
2116 	btnRestoreSplit->tooltip(_("Restore split"));
2117 	btnRestoreSplit->callback((Fl_Callback*)cb_restore);
2118 	btnRestoreSplit->align(Fl_Align(FL_ALIGN_RIGHT));
2119 	btnRestoreSplit->value(progStatus.restore_split == 1);
2120 
2121 	btnRestorePreAtt = new Fl_Check_Button(X + 128, Y + 165, 20, 20, _("Pre/Att"));
2122 	btnRestorePreAtt->tooltip(_("Restore Pre/Att"));
2123 	btnRestorePreAtt->callback((Fl_Callback*)cb_restore);
2124 	btnRestorePreAtt->align(Fl_Align(FL_ALIGN_RIGHT));
2125 	btnRestorePreAtt->value(progStatus.restore_pre_att == 1);
2126 
2127 	btnRestoreNoise = new Fl_Check_Button(X + 128, Y + 190, 20, 20, _("Blanker"));
2128 	btnRestoreNoise->tooltip(_("Restore noise blanker control"));
2129 	btnRestoreNoise->callback((Fl_Callback*)cb_restore);
2130 	btnRestoreNoise->align(Fl_Align(FL_ALIGN_RIGHT));
2131 	btnRestoreNoise->value(progStatus.restore_noise == 1);
2132 
2133 	btnRestoreNR = new Fl_Check_Button(X + 248, Y + 40, 20, 20, _("Noise Red'"));
2134 	btnRestoreNR->tooltip(_("Restore noise reduction"));
2135 	btnRestoreNR->callback((Fl_Callback*)cb_restore);
2136 	btnRestoreNR->align(Fl_Align(FL_ALIGN_RIGHT));
2137 	btnRestoreNR->value(progStatus.restore_nr == 1);
2138 
2139 	btnRestoreCompOnOff = new Fl_Check_Button(X + 248, Y + 65, 20, 20, _("Comp On/Off"));
2140 	btnRestoreCompOnOff->tooltip(_("Restore Comp On/Off"));
2141 	btnRestoreCompOnOff->callback((Fl_Callback*)cb_restore);
2142 	btnRestoreCompOnOff->align(Fl_Align(FL_ALIGN_RIGHT));
2143 	btnRestoreCompOnOff->value(progStatus.restore_comp_on_off == 1);
2144 
2145 	btnRestoreCompLevel = new Fl_Check_Button(X + 248, Y + 90, 20, 20, _("Comp Level"));
2146 	btnRestoreCompLevel->tooltip(_("Restore comp level"));
2147 	btnRestoreCompLevel->callback((Fl_Callback*)cb_restore);
2148 	btnRestoreCompLevel->align(Fl_Align(FL_ALIGN_RIGHT));
2149 	btnRestoreCompLevel->value(progStatus.restore_comp_level == 1);
2150 
2151 	btnUseRigData = new Fl_Check_Button(X + 248, Y + 190, 20, 20, _("Use xcvr data"));
2152 	btnUseRigData->tooltip(_("Set flrig to xcvr values at startup"));
2153 	btnUseRigData->callback((Fl_Callback*)cb_restore);
2154 	btnUseRigData->align(Fl_Align(FL_ALIGN_RIGHT));
2155 	btnUseRigData->value(progStatus.use_rig_data == 1);
2156 
2157 	tabRESTORE->end();
2158 	return tabRESTORE;
2159 }
2160 
2161 #include "gpio.cxx"
2162 
2163 #include <vector>
2164 
2165 std::vector< Fl_Group* > config_pages;
2166 static Fl_Group *current = 0;
2167 Fl_Tree *tab_tree;
2168 
add_tree_item(Fl_Group * g)2169 void add_tree_item(Fl_Group *g) {
2170   config_pages.push_back(g);
2171   tab_tree->add(g->label());
2172   g->hide();
2173 }
2174 
cleartabs()2175 void cleartabs()
2176 {
2177 	tabXCVR->hide();
2178 	tabTRACE->hide();
2179 	tabTCPIP->hide();
2180 	tabPTT->hide();
2181 	tabAUX->hide();
2182 	tabGPIO->hide();
2183 	tabPOLLING->hide();
2184 	tabSNDCMD->hide();
2185 	tabCOMMANDS->hide();
2186 	tabRESTORE->hide();
2187 	Fl_Tree_Item *item = tab_tree->last_selected_item();
2188 	if (item) tab_tree->deselect(item,0);
2189 }
2190 
select_tab(const char * label)2191 void select_tab(const char *label)
2192 {
2193 	cleartabs();
2194 	tab_tree->select(label);
2195 	dlgXcvrConfig->show();
2196 }
2197 
SelectItem_CB(Fl_Widget * w)2198 void SelectItem_CB(Fl_Widget *w) {
2199 	cleartabs();
2200 	Fl_Tree *tree = (Fl_Tree*)w;
2201 	Fl_Tree_Item *item = tree->callback_item();
2202 	tree->select_only(item, 0);
2203 
2204 	if (tree->callback_reason() == FL_TREE_REASON_SELECTED) {
2205 		std::string pname;
2206 		char pn[200];
2207 		tree->item_pathname(pn, 200, item);
2208 		pname = pn;
2209 		size_t pos = std::string::npos;
2210 		for (size_t i = 0; i < config_pages.size(); i++) {
2211 			if ((pos = pname.find(config_pages[i]->label())) != std::string::npos) {
2212 				if (pname.substr(pos) == config_pages[i]->label()) {
2213 					if (current) current->hide();
2214 					current = config_pages[i];//->grp;
2215 					current->show();
2216 					return;
2217 				}
2218 			}
2219 		}
2220 	}
2221 }
2222 
2223 extern Fl_Double_Window *dlgXcvrConfig;
2224 
XcvrDialog()2225 Fl_Double_Window* XcvrDialog() {
2226 
2227 	int W = 625, H = 240;
2228 
2229 	Fl_Double_Window* w = new Fl_Double_Window(W, H, _("Configuration"));
2230 	w->size_range(W, H, W, H);
2231 
2232 	int xtree = 2;
2233 	int ytree = 2;
2234 	int htree = H - 2*ytree;
2235 	int wtree = 130;
2236 	int wtabs = W - wtree - 2 * xtree;
2237 	int xtabs = xtree + wtree;
2238 
2239 	tab_tree = new Fl_Tree(xtree, ytree, wtree, htree);
2240 	tab_tree->callback((Fl_Callback*)SelectItem_CB);
2241 	Fl_Group::current()->resizable(tab_tree);
2242 	tab_tree->root_label(_("Configure"));
2243 	tab_tree->selectmode(FL_TREE_SELECT_SINGLE);
2244 	tab_tree->connectorstyle(FL_TREE_CONNECTOR_DOTTED);
2245 	tab_tree->connectorwidth(17); // default is 17
2246 
2247 	tabXCVR  = createXCVR(xtabs, ytree, wtabs, htree, _("Xcvr"));
2248 	add_tree_item(tabXCVR);
2249 
2250 	tabTRACE    = createTRACE(xtabs, ytree, wtabs, htree, _("Trace"));
2251 	add_tree_item(tabTRACE);
2252 
2253 	tabTCPIP    = createTCPIP(xtabs, ytree, wtabs, htree, _("TCPIP"));
2254 	add_tree_item(tabTCPIP);
2255 
2256 	tabPTT      = createPTT(xtabs, ytree, wtabs, htree, _("PTT"));
2257 	add_tree_item(tabPTT);
2258 
2259 	tabGPIO     = createGPIO(xtabs, ytree, wtabs, htree, _("GPIO"));
2260 	add_tree_item(tabGPIO);
2261 
2262 	tabAUX      = createAUX(xtabs, ytree, wtabs, htree, _("Auxiliary"));
2263 	add_tree_item(tabAUX);
2264 
2265 	tabSERVER   = createSERVER(xtabs, ytree, wtabs, htree, _("Server"));
2266 	add_tree_item(tabSERVER);
2267 
2268 	tabPOLLING  = createPOLLING(xtabs, ytree, wtabs, htree, _("Poll"));
2269 	add_tree_item(tabPOLLING);
2270 
2271 	tabSNDCMD   = createSNDCMD(xtabs, ytree, wtabs, htree, _("Send"));
2272 	add_tree_item(tabSNDCMD);
2273 
2274 	tabCOMMANDS = createCOMMANDS(xtabs, ytree, wtabs, htree, _("Cmds"));
2275 	add_tree_item(tabCOMMANDS);
2276 
2277 	tabRESTORE  = createRestore(xtabs, ytree, wtabs, htree, _("Restore"));
2278 	add_tree_item(tabRESTORE);
2279 
2280 w->end();
2281 
2282 return w;
2283 
2284 }
2285 
2286