KISS, 8PSK, FLARQ icon Modifications

* KISS TCP/IP
    - Add TCP/IP KISS interface
    - Add Start/Stop (UDP/IP) and Connect/Disconnect (TCP/IP) option.
    - Add Listen/Bind Option.
  * Operator selectable 4/8/16PSK preamble duration
    - Add code to allow user to change the preamble duration to improve
      throughput when not operating via repeater. (KL4YFD).
    - Add user selectable checkbox on PSK (8PSK) modem configuration
      interface panel for above addition (KK5VD).
 * Update FLARQ icons
pull/4/head
Robert Stiles 2016-04-12 13:28:00 -05:00 zatwierdzone przez David Freese
rodzic 68d9b32284
commit 4ab48d41e4
15 zmienionych plików z 620 dodań i 169 usunięć

Wyświetl plik

@ -58,7 +58,7 @@ static void cbRxFontBrowser(Fl_Widget*, void*) {
ReceiveText->setFont(font); ReceiveText->setFont(font);
ReceiveText->setFontSize(size); ReceiveText->setFontSize(size);
ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV);
fsq_rx_text->setFont(font); fsq_rx_text->setFont(font);
fsq_rx_text->setFontSize(size); fsq_rx_text->setFontSize(size);
fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV);
@ -113,12 +113,12 @@ static void cbMacroEditFontBrowser(Fl_Widget*, void*) {
progdefaults.MacroEditFontnbr = font; progdefaults.MacroEditFontnbr = font;
progdefaults.MacroEditFontsize = size; progdefaults.MacroEditFontsize = size;
update_macroedit_font(); update_macroedit_font();
MacroText->textfont(font); MacroText->textfont(font);
MacroText->textsize(size); MacroText->textsize(size);
font_browser->hide(); font_browser->hide();
progdefaults.changed = true; progdefaults.changed = true;
@ -141,7 +141,7 @@ static void cbMacroBtnFontBrowser(Fl_Widget*, void*) {
progdefaults.MacroBtnFontcolor = font_browser->fontColor(); progdefaults.MacroBtnFontcolor = font_browser->fontColor();
font_browser->hide(); font_browser->hide();
btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor);
btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr);
btnGroup1->labelsize(progdefaults.MacroBtnFontsize); btnGroup1->labelsize(progdefaults.MacroBtnFontsize);
@ -1586,7 +1586,7 @@ static void cb_btnSmeter_bg_color(Fl_Button*, void*) {
progdefaults.Smeter_bg_color.R = r; progdefaults.Smeter_bg_color.R = r;
progdefaults.Smeter_bg_color.G = g; progdefaults.Smeter_bg_color.G = g;
progdefaults.Smeter_bg_color.B = b; progdefaults.Smeter_bg_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true; progdefaults.changed = true;
@ -1606,7 +1606,7 @@ static void cb_btnSmeter_scale_color(Fl_Button*, void*) {
progdefaults.Smeter_scale_color.R = r; progdefaults.Smeter_scale_color.R = r;
progdefaults.Smeter_scale_color.G = g; progdefaults.Smeter_scale_color.G = g;
progdefaults.Smeter_scale_color.B = b; progdefaults.Smeter_scale_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true; progdefaults.changed = true;
@ -1626,7 +1626,7 @@ static void cb_btnSmeter_meter_color(Fl_Button*, void*) {
progdefaults.Smeter_meter_color.R = r; progdefaults.Smeter_meter_color.R = r;
progdefaults.Smeter_meter_color.G = g; progdefaults.Smeter_meter_color.G = g;
progdefaults.Smeter_meter_color.B = b; progdefaults.Smeter_meter_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true; progdefaults.changed = true;
@ -1646,7 +1646,7 @@ static void cb_btnPWR_bg_color(Fl_Button*, void*) {
progdefaults.PWRmeter_bg_color.R = r; progdefaults.PWRmeter_bg_color.R = r;
progdefaults.PWRmeter_bg_color.G = g; progdefaults.PWRmeter_bg_color.G = g;
progdefaults.PWRmeter_bg_color.B = b; progdefaults.PWRmeter_bg_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true; progdefaults.changed = true;
@ -1666,7 +1666,7 @@ static void cb_btnPWR_scale_color(Fl_Button*, void*) {
progdefaults.PWRmeter_scale_color.R = r; progdefaults.PWRmeter_scale_color.R = r;
progdefaults.PWRmeter_scale_color.G = g; progdefaults.PWRmeter_scale_color.G = g;
progdefaults.PWRmeter_scale_color.B = b; progdefaults.PWRmeter_scale_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true; progdefaults.changed = true;
@ -1686,7 +1686,7 @@ static void cb_btnPWR_meter_Color(Fl_Button*, void*) {
progdefaults.PWRmeter_meter_color.R = r; progdefaults.PWRmeter_meter_color.R = r;
progdefaults.PWRmeter_meter_color.G = g; progdefaults.PWRmeter_meter_color.G = g;
progdefaults.PWRmeter_meter_color.B = b; progdefaults.PWRmeter_meter_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true; progdefaults.changed = true;
@ -3404,6 +3404,12 @@ static void cb_cnt_pilot_power(Fl_Counter2* o, void*) {
progdefaults.changed = true; progdefaults.changed = true;
} }
Fl_Check_Button *btnPSK8Preamble=(Fl_Check_Button *)0;
static void cb_btnPSK8Preamble(Fl_Check_Button* o, void*) {
progStatus.psk8DCDShortFlag = o->value();
}
Fl_Group *tabRTTY=(Fl_Group *)0; Fl_Group *tabRTTY=(Fl_Group *)0;
Fl_Tabs *tabsRTTY=(Fl_Tabs *)0; Fl_Tabs *tabsRTTY=(Fl_Tabs *)0;
@ -5627,6 +5633,7 @@ if(o->value())
disable_config_p2p_io_widgets(); disable_config_p2p_io_widgets();
else else
enable_config_p2p_io_widgets(); enable_config_p2p_io_widgets();
kiss_io_set_button_state(0);
} }
Fl_Check_Button *btnEnable_arq=(Fl_Check_Button *)0; Fl_Check_Button *btnEnable_arq=(Fl_Check_Button *)0;
@ -5745,6 +5752,51 @@ static void cb_btn_restart_kiss(Fl_Button*, void*) {
//restart_kiss_server(); //restart_kiss_server();
} }
Fl_Button *btn_connect_kiss_io=(Fl_Button *)0;
static void cb_btn_connect_kiss_io(Fl_Button*, void*) {
connect_to_kiss_io();
}
Fl_Check_Button *btnKissTCPIO=(Fl_Check_Button *)0;
static void cb_btnKissTCPIO(Fl_Check_Button* o, void*) {
if(o->value()) {
progdefaults.kiss_tcp_io = true;
progStatus.kiss_tcp_io = true;
} else {
progStatus.kiss_tcp_io = false;
progdefaults.kiss_tcp_io = false;
}
kiss_io_set_button_state(0);
}
Fl_Check_Button *btnKissUDPIO=(Fl_Check_Button *)0;
static void cb_btnKissUDPIO(Fl_Check_Button* o, void*) {
if(o->value()) {
progdefaults.kiss_tcp_io = false;
progStatus.kiss_tcp_io = false;
} else {
progStatus.kiss_tcp_io = true;
progdefaults.kiss_tcp_io = true;
}
kiss_io_set_button_state(0);
}
Fl_Check_Button *btnKissTCPListen=(Fl_Check_Button *)0;
static void cb_btnKissTCPListen(Fl_Check_Button* o, void*) {
if(o->value()) {
progdefaults.kiss_tcp_listen = true;
progStatus.kiss_tcp_listen = true;
} else {
progStatus.kiss_tcp_listen = false;
progdefaults.kiss_tcp_listen = false;
};
}
Fl_Input2 *txtArq_ip_address=(Fl_Input2 *)0; Fl_Input2 *txtArq_ip_address=(Fl_Input2 *)0;
static void cb_txtArq_ip_address(Fl_Input2* o, void*) { static void cb_txtArq_ip_address(Fl_Input2* o, void*) {
@ -5899,6 +5951,7 @@ Fl_Double_Window* ConfigureDialog() {
tabOperator->tooltip(_("Operator information")); tabOperator->tooltip(_("Operator information"));
tabOperator->callback((Fl_Callback*)cb_tabOperator); tabOperator->callback((Fl_Callback*)cb_tabOperator);
tabOperator->when(FL_WHEN_CHANGED); tabOperator->when(FL_WHEN_CHANGED);
tabOperator->hide();
{ Fl_Group* o = new Fl_Group(55, 35, 490, 170, _("Station")); { Fl_Group* o = new Fl_Group(55, 35, 490, 170, _("Station"));
o->box(FL_ENGRAVED_FRAME); o->box(FL_ENGRAVED_FRAME);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
@ -7694,6 +7747,7 @@ i on a\ntouch screen device such as a tablet."));
tabsModems->selection_color(FL_LIGHT1); tabsModems->selection_color(FL_LIGHT1);
tabsModems->align(Fl_Align(FL_ALIGN_TOP_RIGHT)); tabsModems->align(Fl_Align(FL_ALIGN_TOP_RIGHT));
{ tabCW = new Fl_Group(0, 50, 600, 330, _("CW")); { tabCW = new Fl_Group(0, 50, 600, 330, _("CW"));
tabCW->hide();
{ tabsCW = new Fl_Tabs(0, 50, 600, 330); { tabsCW = new Fl_Tabs(0, 50, 600, 330);
tabsCW->selection_color(FL_LIGHT1); tabsCW->selection_color(FL_LIGHT1);
{ Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("General")); { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("General"));
@ -8983,7 +9037,6 @@ i on a\ntouch screen device such as a tablet."));
tabContestia->end(); tabContestia->end();
} // Fl_Group* tabContestia } // Fl_Group* tabContestia
{ tabPSK = new Fl_Group(0, 50, 600, 330, _("PSK")); { tabPSK = new Fl_Group(0, 50, 600, 330, _("PSK"));
tabPSK->hide();
{ tabsPSK = new Fl_Tabs(0, 50, 600, 330); { tabsPSK = new Fl_Tabs(0, 50, 600, 330);
tabsPSK->selection_color(FL_LIGHT1); tabsPSK->selection_color(FL_LIGHT1);
{ grpPSK = new Fl_Group(0, 75, 600, 305, _("General")); { grpPSK = new Fl_Group(0, 75, 600, 305, _("General"));
@ -9090,13 +9143,13 @@ i on a\ntouch screen device such as a tablet."));
{ Fl_Group* o = new Fl_Group(55, 327, 490, 47, _("8 psk")); { Fl_Group* o = new Fl_Group(55, 327, 490, 47, _("8 psk"));
o->box(FL_ENGRAVED_FRAME); o->box(FL_ENGRAVED_FRAME);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
{ Fl_Check_Button* o = btnPSKpilot = new Fl_Check_Button(141, 342, 113, 20, _("Pilot tone")); { Fl_Check_Button* o = btnPSKpilot = new Fl_Check_Button(100, 340, 113, 20, _("Pilot tone"));
btnPSKpilot->tooltip(_("Enable encode/decode vestigial pilot tone")); btnPSKpilot->tooltip(_("Enable encode/decode vestigial pilot tone"));
btnPSKpilot->down_box(FL_DOWN_BOX); btnPSKpilot->down_box(FL_DOWN_BOX);
btnPSKpilot->callback((Fl_Callback*)cb_btnPSKpilot); btnPSKpilot->callback((Fl_Callback*)cb_btnPSKpilot);
o->value(progdefaults.pskpilot); o->value(progdefaults.pskpilot);
} // Fl_Check_Button* btnPSKpilot } // Fl_Check_Button* btnPSKpilot
{ Fl_Counter2* o = cnt_pilot_power = new Fl_Counter2(305, 342, 75, 20, _("pilot power (dB)")); { Fl_Counter2* o = cnt_pilot_power = new Fl_Counter2(205, 340, 75, 20, _("pilot power (dB)"));
cnt_pilot_power->tooltip(_("Pilot tone power relative to signal")); cnt_pilot_power->tooltip(_("Pilot tone power relative to signal"));
cnt_pilot_power->type(1); cnt_pilot_power->type(1);
cnt_pilot_power->box(FL_UP_BOX); cnt_pilot_power->box(FL_UP_BOX);
@ -9116,6 +9169,12 @@ i on a\ntouch screen device such as a tablet."));
o->value(progdefaults.pilot_power); o->value(progdefaults.pilot_power);
o->labelsize(FL_NORMAL_SIZE); o->labelsize(FL_NORMAL_SIZE);
} // Fl_Counter2* cnt_pilot_power } // Fl_Counter2* cnt_pilot_power
{ Fl_Check_Button* o = btnPSK8Preamble = new Fl_Check_Button(410, 340, 113, 20, _("Short Preamble"));
btnPSK8Preamble->tooltip(_("Enable encode/decode vestigial pilot tone"));
btnPSK8Preamble->down_box(FL_DOWN_BOX);
btnPSK8Preamble->callback((Fl_Callback*)cb_btnPSK8Preamble);
o->value(progStatus.psk8DCDShortFlag);
} // Fl_Check_Button* btnPSK8Preamble
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
grpPSK->end(); grpPSK->end();
@ -11907,7 +11966,6 @@ and restarted if needed."));
{ tabIO = new Fl_Group(0, 25, 600, 355, _("IO")); { tabIO = new Fl_Group(0, 25, 600, 355, _("IO"));
tabIO->tooltip(_("Program to Program Communications")); tabIO->tooltip(_("Program to Program Communications"));
tabIO->callback((Fl_Callback*)cb_tabIO); tabIO->callback((Fl_Callback*)cb_tabIO);
tabIO->hide();
{ Fl_Group* o = new Fl_Group(6, 34, 588, 102); { Fl_Group* o = new Fl_Group(6, 34, 588, 102);
o->box(FL_ENGRAVED_BOX); o->box(FL_ENGRAVED_BOX);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
@ -11948,9 +12006,9 @@ and restarted if needed."));
progStatus.ip_lock ? o->deactivate() : o->activate(); progStatus.ip_lock ? o->deactivate() : o->activate();
} // Fl_Check_Button* btnEnable_csma } // Fl_Check_Button* btnEnable_csma
{ new Fl_Box(8, 37, 582, 72, _("Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\nEnable KIS\ { new Fl_Box(8, 37, 582, 72, _("Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\nEnable KIS\
S for programs that supports UDP and TNC-2 KISS protocol.\nOnly one interface \ S for programs that supports TCP/UDP and TNC-2 KISS protocol.\nOnly one interf\
(ARQ/KISS) can be active at any given time.\nKISS/ARQ/XML Addr/Port changes re\ ace (ARQ/KISS) can be active at any given time.\nKISS/ARQ/XML Addr/Port change\
quire program restart.")); s require program restart."));
} // Fl_Box* o } // Fl_Box* o
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
@ -12020,7 +12078,7 @@ quire program restart."));
o->step(1,10); o->step(1,10);
progStatus.ip_lock ? o->deactivate() : o->activate(); progStatus.ip_lock ? o->deactivate() : o->activate();
} // Fl_Counter* cntBusyChannelSeconds } // Fl_Counter* cntBusyChannelSeconds
{ Fl_Check_Button* o = btnEnableBusyChannel = new Fl_Check_Button(425, 147, 65, 15, _("Busy")); { Fl_Check_Button* o = btnEnableBusyChannel = new Fl_Check_Button(331, 145, 65, 15, _("Busy"));
btnEnableBusyChannel->tooltip(_("Enable Busy Channel")); btnEnableBusyChannel->tooltip(_("Enable Busy Channel"));
btnEnableBusyChannel->down_box(FL_DOWN_BOX); btnEnableBusyChannel->down_box(FL_DOWN_BOX);
btnEnableBusyChannel->callback((Fl_Callback*)cb_btnEnableBusyChannel); btnEnableBusyChannel->callback((Fl_Callback*)cb_btnEnableBusyChannel);
@ -12044,7 +12102,7 @@ quire program restart."));
o->value(progdefaults.kiss_out_port.c_str()); o->value(progdefaults.kiss_out_port.c_str());
progStatus.ip_lock ? o->deactivate() : o->activate(); progStatus.ip_lock ? o->deactivate() : o->activate();
} // Fl_Input2* txtKiss_ip_out_port_no } // Fl_Input2* txtKiss_ip_out_port_no
{ Fl_Check_Button* o = btnEnable_dual_port = new Fl_Check_Button(425, 168, 90, 16, _("Dual Port")); { Fl_Check_Button* o = btnEnable_dual_port = new Fl_Check_Button(485, 169, 90, 16, _("Dual Port"));
btnEnable_dual_port->tooltip(_("Enable when both programs are using the same IP address")); btnEnable_dual_port->tooltip(_("Enable when both programs are using the same IP address"));
btnEnable_dual_port->down_box(FL_DOWN_BOX); btnEnable_dual_port->down_box(FL_DOWN_BOX);
btnEnable_dual_port->callback((Fl_Callback*)cb_btnEnable_dual_port); btnEnable_dual_port->callback((Fl_Callback*)cb_btnEnable_dual_port);
@ -12056,6 +12114,32 @@ quire program restart."));
btn_restart_kiss->hide(); btn_restart_kiss->hide();
progStatus.ip_lock ? o->deactivate() : o->activate(); progStatus.ip_lock ? o->deactivate() : o->activate();
} // Fl_Button* btn_restart_kiss } // Fl_Button* btn_restart_kiss
{ Fl_Button* o = btn_connect_kiss_io = new Fl_Button(504, 193, 82, 25, _("Connect"));
btn_connect_kiss_io->tooltip(_("Return KISS TCP IO connection to a Listening state"));
btn_connect_kiss_io->callback((Fl_Callback*)cb_btn_connect_kiss_io);
(progStatus.ip_lock || !progStatus.kiss_tcp_io) ? o->deactivate() : o->activate();
} // Fl_Button* btn_connect_kiss_io
{ Fl_Check_Button* o = btnKissTCPIO = new Fl_Check_Button(425, 145, 60, 15, _("TCP"));
btnKissTCPIO->tooltip(_("Check to enable TCP/IP IO Connection"));
btnKissTCPIO->down_box(FL_DOWN_BOX);
btnKissTCPIO->callback((Fl_Callback*)cb_btnKissTCPIO);
if(progStatus.kiss_tcp_io) o->value(true); else o->value(false);
progStatus.ip_lock ? o->deactivate() : o->activate();
} // Fl_Check_Button* btnKissTCPIO
{ Fl_Check_Button* o = btnKissUDPIO = new Fl_Check_Button(425, 170, 60, 15, _("UDP"));
btnKissUDPIO->tooltip(_("Check to enable UDP/IP IO"));
btnKissUDPIO->down_box(FL_DOWN_BOX);
btnKissUDPIO->callback((Fl_Callback*)cb_btnKissUDPIO);
if(progStatus.kiss_tcp_io) o->value(true); else o->value(false);
progStatus.ip_lock ? o->deactivate() : o->activate();
} // Fl_Check_Button* btnKissUDPIO
{ Fl_Check_Button* o = btnKissTCPListen = new Fl_Check_Button(485, 145, 95, 15, _("Listen / Bind"));
btnKissTCPListen->tooltip(_("Monitor for TCP connection"));
btnKissTCPListen->down_box(FL_DOWN_BOX);
btnKissTCPListen->callback((Fl_Callback*)cb_btnKissTCPListen);
if(progStatus.kiss_tcp_listen) o->value(true); else o->value(false);
progStatus.ip_lock ? o->deactivate() : o->activate();
} // Fl_Check_Button* btnKissTCPListen
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
{ Fl_Group* o = new Fl_Group(6, 225, 588, 35, _("ARQ")); { Fl_Group* o = new Fl_Group(6, 225, 588, 35, _("ARQ"));

Wyświetl plik

@ -1,122 +1,122 @@
# data file for the Fltk User Interface Designer (fluid) # data file for the Fltk User Interface Designer (fluid)
version 1.0303 version 1.0303
i18n_type 1 i18n_type 1
i18n_include "gettext.h" i18n_include "gettext.h"
i18n_function _ i18n_function _
header_name {.h} header_name {.h}
code_name {.cxx} code_name {.cxx}
decl {\#include <config.h>} {private local decl {\#include <config.h>} {private local
} }
decl {\#include <FL/Fl_Tooltip.H>} {private local decl {\#include <FL/Fl_Tooltip.H>} {private local
} }
decl {\#include <FL/Fl_Box.H>} {private local decl {\#include <FL/Fl_Box.H>} {private local
} }
decl {\#include <FL/filename.H>} {private local decl {\#include <FL/filename.H>} {private local
} }
decl {\#include <FL/Fl_File_Chooser.H>} {private local decl {\#include <FL/Fl_File_Chooser.H>} {private local
} }
decl {\#include <FL/fl_show_colormap.H>} {private local decl {\#include <FL/fl_show_colormap.H>} {private local
} }
decl {\#include "main.h"} {private local decl {\#include "main.h"} {private local
} }
decl {\#include "fl_digi.h"} {private local decl {\#include "fl_digi.h"} {private local
} }
decl {\#include "data_io.h"} {private local decl {\#include "data_io.h"} {private local
} }
decl {\#include "Viewer.h"} {private global decl {\#include "Viewer.h"} {private global
} }
decl {\#include "font_browser.h"} {public global decl {\#include "font_browser.h"} {public global
} }
decl {\#include "soundconf.h"} {private local decl {\#include "soundconf.h"} {private local
} }
decl {\#include "globals.h"} {public local decl {\#include "globals.h"} {public local
} }
decl {\#include "modem.h"} {public local decl {\#include "modem.h"} {public local
} }
decl {\#include "configuration.h"} {public local decl {\#include "configuration.h"} {public local
} }
decl {\#include "combo.h"} {public local decl {\#include "combo.h"} {public local
} }
decl {\#include "waterfall.h"} {private local decl {\#include "waterfall.h"} {private local
} }
decl {\#include "rigxml.h"} {private local decl {\#include "rigxml.h"} {private local
} }
decl {\#include "lookupcall.h"} {private local decl {\#include "lookupcall.h"} {private local
} }
decl {\#include "icons.h"} {private local decl {\#include "icons.h"} {private local
} }
decl {\#include "Viewer.h"} {private local decl {\#include "Viewer.h"} {private local
} }
decl {\#include "pskrep.h"} {private global decl {\#include "pskrep.h"} {private global
} }
decl {\#include "flinput2.h"} {public local decl {\#include "flinput2.h"} {public local
} }
decl {\#include "flslider2.h"} {public local decl {\#include "flslider2.h"} {public local
} }
decl {\#include "flmisc.h"} {public local decl {\#include "flmisc.h"} {public local
} }
decl {\#include "logsupport.h"} {private local decl {\#include "logsupport.h"} {private local
} }
decl {\#include "notify.h"} {private local decl {\#include "notify.h"} {private local
} }
decl {\#include "debug.h"} {private local decl {\#include "debug.h"} {private local
} }
decl {\#include "status.h"} {private local decl {\#include "status.h"} {private local
} }
decl {\#include "rx_extract.h"} {private local decl {\#include "rx_extract.h"} {private local
} }
decl {\#include "kmlserver.h"} {private local decl {\#include "kmlserver.h"} {private local
} }
decl {\#include "macroedit.h"} {private local decl {\#include "macroedit.h"} {private local
} }
decl {\#include "fileselect.h"} {private local decl {\#include "fileselect.h"} {private local
} }
decl {extern void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata);} {private local decl {extern void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata);} {private local
} }
decl {\#if USE_HAMLIB decl {\#if USE_HAMLIB
\#include "hamlib.h" \#include "hamlib.h"
\#endif} {private local \#endif} {private local
} }
decl {Fl_Double_Window *dlgConfig;} {public local decl {Fl_Double_Window *dlgConfig;} {public local
} }
decl {Mode_Browser* mode_browser;} {public local decl {Mode_Browser* mode_browser;} {public local
} }
Function {choose_color(Fl_Color & c)} {private return_type void Function {choose_color(Fl_Color & c)} {private return_type void
} { } {
@ -124,7 +124,7 @@ Function {choose_color(Fl_Color & c)} {private return_type void
Fl::get_color(c, r, g, b); Fl::get_color(c, r, g, b);
if (fl_color_chooser("Font color", r, g, b)) if (fl_color_chooser("Font color", r, g, b))
c = fl_rgb_color(r, g, b);} {} c = fl_rgb_color(r, g, b);} {}
} }
Function {cbRxFontBrowser(Fl_Widget*, void*)} {open private return_type void Function {cbRxFontBrowser(Fl_Widget*, void*)} {open private return_type void
} { } {
@ -144,7 +144,7 @@ Function {cbRxFontBrowser(Fl_Widget*, void*)} {open private return_type void
ReceiveText->setFont(font); ReceiveText->setFont(font);
ReceiveText->setFontSize(size); ReceiveText->setFontSize(size);
ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV);
fsq_rx_text->setFont(font); fsq_rx_text->setFont(font);
fsq_rx_text->setFontSize(size); fsq_rx_text->setFontSize(size);
fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV);
@ -156,7 +156,7 @@ Function {cbRxFontBrowser(Fl_Widget*, void*)} {open private return_type void
font_browser->hide(); font_browser->hide();
progdefaults.changed = true;} {} progdefaults.changed = true;} {}
} }
Function {cbTxFontBrowser(Fl_Widget*, void*)} {open private return_type void Function {cbTxFontBrowser(Fl_Widget*, void*)} {open private return_type void
} { } {
@ -188,7 +188,7 @@ Function {cbTxFontBrowser(Fl_Widget*, void*)} {open private return_type void
font_browser->hide(); font_browser->hide();
progdefaults.changed = true;} {} progdefaults.changed = true;} {}
} }
Function {cbMacroEditFontBrowser(Fl_Widget*, void*)} {private return_type void Function {cbMacroEditFontBrowser(Fl_Widget*, void*)} {private return_type void
} { } {
@ -201,16 +201,16 @@ Function {cbMacroEditFontBrowser(Fl_Widget*, void*)} {private return_type void
progdefaults.MacroEditFontnbr = font; progdefaults.MacroEditFontnbr = font;
progdefaults.MacroEditFontsize = size; progdefaults.MacroEditFontsize = size;
update_macroedit_font(); update_macroedit_font();
MacroText->textfont(font); MacroText->textfont(font);
MacroText->textsize(size); MacroText->textsize(size);
font_browser->hide(); font_browser->hide();
progdefaults.changed = true;} {} progdefaults.changed = true;} {}
} }
Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {return_type void Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {return_type void
} { } {
@ -222,7 +222,7 @@ Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {return_type void
progdefaults.changed = true; progdefaults.changed = true;
font_browser->hide();} {} font_browser->hide();} {}
} }
Function {cbMacroBtnFontBrowser(Fl_Widget*, void*)} {private return_type void Function {cbMacroBtnFontBrowser(Fl_Widget*, void*)} {private return_type void
} { } {
@ -231,7 +231,7 @@ Function {cbMacroBtnFontBrowser(Fl_Widget*, void*)} {private return_type void
progdefaults.MacroBtnFontcolor = font_browser->fontColor(); progdefaults.MacroBtnFontcolor = font_browser->fontColor();
font_browser->hide(); font_browser->hide();
btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor);
btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr);
btnGroup1->labelsize(progdefaults.MacroBtnFontsize); btnGroup1->labelsize(progdefaults.MacroBtnFontsize);
@ -249,7 +249,7 @@ Function {cbMacroBtnFontBrowser(Fl_Widget*, void*)} {private return_type void
progdefaults.changed = true; progdefaults.changed = true;
colorize_macros();} {} colorize_macros();} {}
} }
Function {cbViewerFontBrowser(Fl_Widget*, void*)} {return_type void Function {cbViewerFontBrowser(Fl_Widget*, void*)} {return_type void
} { } {
@ -259,7 +259,7 @@ Function {cbViewerFontBrowser(Fl_Widget*, void*)} {return_type void
progdefaults.changed = true; progdefaults.changed = true;
font_browser->hide();} {} font_browser->hide();} {}
} }
Function {cbFreqControlFontBrowser(Fl_Widget*, void*)} {return_type void Function {cbFreqControlFontBrowser(Fl_Widget*, void*)} {return_type void
} { } {
@ -277,7 +277,7 @@ Function {cbFreqControlFontBrowser(Fl_Widget*, void*)} {return_type void
qsoFreqDisp3->redraw(); qsoFreqDisp3->redraw();
font_browser->hide();} {} font_browser->hide();} {}
} }
Function {cbLOGGINGFontBrowser(Fl_Widget*, void*)} {private return_type void Function {cbLOGGINGFontBrowser(Fl_Widget*, void*)} {private return_type void
} { } {
@ -299,7 +299,7 @@ Function {cbLOGGINGFontBrowser(Fl_Widget*, void*)} {private return_type void
font_browser->hide(); font_browser->hide();
progdefaults.changed = true;} {} progdefaults.changed = true;} {}
} }
Function {cbLOGBOOKFontBrowser(Fl_Widget*, void*)} {private return_type void Function {cbLOGBOOKFontBrowser(Fl_Widget*, void*)} {private return_type void
} { } {
@ -321,7 +321,7 @@ Function {cbLOGBOOKFontBrowser(Fl_Widget*, void*)} {private return_type void
font_browser->hide(); font_browser->hide();
progdefaults.changed = true;} {} progdefaults.changed = true;} {}
} }
Function {set_qrzxml_buttons(Fl_Button* b)} {return_type void Function {set_qrzxml_buttons(Fl_Button* b)} {return_type void
} { } {
@ -331,7 +331,7 @@ Function {set_qrzxml_buttons(Fl_Button* b)} {return_type void
for (size_t i = 0; i < sizeof(qrzbxml)/sizeof(*qrzbxml); i++) for (size_t i = 0; i < sizeof(qrzbxml)/sizeof(*qrzbxml); i++)
qrzbxml[i]->value(b == qrzbxml[i]);} {} qrzbxml[i]->value(b == qrzbxml[i]);} {}
} }
Function {set_qrzweb_buttons(Fl_Button* b)} {return_type void Function {set_qrzweb_buttons(Fl_Button* b)} {return_type void
} { } {
@ -341,7 +341,7 @@ Function {set_qrzweb_buttons(Fl_Button* b)} {return_type void
for (size_t i = 0; i < sizeof(qrzbweb)/sizeof(*qrzbweb); i++) for (size_t i = 0; i < sizeof(qrzbweb)/sizeof(*qrzbweb); i++)
qrzbweb[i]->value(b == qrzbweb[i]);} {} qrzbweb[i]->value(b == qrzbweb[i]);} {}
} }
Function {ConfigureDialog()} {open Function {ConfigureDialog()} {open
} { } {
@ -366,8 +366,8 @@ static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {}
} { } {
Fl_Group tabOperator { Fl_Group tabOperator {
label Operator label Operator
callback {progdefaults.changed = true;} open selected callback {progdefaults.changed = true;} open
tooltip {Operator information} xywh {0 25 600 355} when 1 tooltip {Operator information} xywh {0 25 600 355} when 1 hide
} { } {
Fl_Group {} { Fl_Group {} {
label Station open label Station open
@ -1912,7 +1912,7 @@ font_browser->show();}
progdefaults.Smeter_bg_color.R = r; progdefaults.Smeter_bg_color.R = r;
progdefaults.Smeter_bg_color.G = g; progdefaults.Smeter_bg_color.G = g;
progdefaults.Smeter_bg_color.B = b; progdefaults.Smeter_bg_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true;} progdefaults.changed = true;}
@ -1931,7 +1931,7 @@ font_browser->show();}
progdefaults.Smeter_scale_color.R = r; progdefaults.Smeter_scale_color.R = r;
progdefaults.Smeter_scale_color.G = g; progdefaults.Smeter_scale_color.G = g;
progdefaults.Smeter_scale_color.B = b; progdefaults.Smeter_scale_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true;} progdefaults.changed = true;}
@ -1950,7 +1950,7 @@ font_browser->show();}
progdefaults.Smeter_meter_color.R = r; progdefaults.Smeter_meter_color.R = r;
progdefaults.Smeter_meter_color.G = g; progdefaults.Smeter_meter_color.G = g;
progdefaults.Smeter_meter_color.B = b; progdefaults.Smeter_meter_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true;} progdefaults.changed = true;}
@ -1974,7 +1974,7 @@ font_browser->show();}
progdefaults.PWRmeter_bg_color.R = r; progdefaults.PWRmeter_bg_color.R = r;
progdefaults.PWRmeter_bg_color.G = g; progdefaults.PWRmeter_bg_color.G = g;
progdefaults.PWRmeter_bg_color.B = b; progdefaults.PWRmeter_bg_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true;} progdefaults.changed = true;}
@ -1993,7 +1993,7 @@ font_browser->show();}
progdefaults.PWRmeter_scale_color.R = r; progdefaults.PWRmeter_scale_color.R = r;
progdefaults.PWRmeter_scale_color.G = g; progdefaults.PWRmeter_scale_color.G = g;
progdefaults.PWRmeter_scale_color.B = b; progdefaults.PWRmeter_scale_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true;} progdefaults.changed = true;}
@ -2012,7 +2012,7 @@ font_browser->show();}
progdefaults.PWRmeter_meter_color.R = r; progdefaults.PWRmeter_meter_color.R = r;
progdefaults.PWRmeter_meter_color.G = g; progdefaults.PWRmeter_meter_color.G = g;
progdefaults.PWRmeter_meter_color.B = b; progdefaults.PWRmeter_meter_color.B = b;
set_smeter_colors(); set_smeter_colors();
progdefaults.changed = true;} progdefaults.changed = true;}
@ -2957,7 +2957,7 @@ behaves inside the waterfall} xywh {65 207 150 22} box DOWN_BOX color 7 align 8
} { } {
Fl_Group tabCW { Fl_Group tabCW {
label CW open label CW open
xywh {0 50 600 330} xywh {0 50 600 330} hide
} { } {
Fl_Tabs tabsCW {open Fl_Tabs tabsCW {open
xywh {0 50 600 330} selection_color 50 xywh {0 50 600 330} selection_color 50
@ -4160,7 +4160,7 @@ progdefaults.changed = true;}
} }
Fl_Group tabPSK { Fl_Group tabPSK {
label PSK open label PSK open
xywh {0 50 600 330} hide xywh {0 50 600 330}
} { } {
Fl_Tabs tabsPSK {open Fl_Tabs tabsPSK {open
xywh {0 50 600 330} selection_color 50 xywh {0 50 600 330} selection_color 50
@ -4241,18 +4241,24 @@ progdefaults.changed = true;}
label {Pilot tone} label {Pilot tone}
callback {progdefaults.pskpilot = o->value(); callback {progdefaults.pskpilot = o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
tooltip {Enable encode/decode vestigial pilot tone} xywh {141 342 113 20} down_box DOWN_BOX tooltip {Enable encode/decode vestigial pilot tone} xywh {100 340 113 20} down_box DOWN_BOX
code0 {o->value(progdefaults.pskpilot);} code0 {o->value(progdefaults.pskpilot);}
} }
Fl_Counter cnt_pilot_power { Fl_Counter cnt_pilot_power {
label {pilot power (dB)} label {pilot power (dB)}
callback {progdefaults.pilot_power = o->value(); callback {progdefaults.pilot_power = o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
tooltip {Pilot tone power relative to signal} xywh {305 342 75 20} type Simple align 8 minimum -60 maximum -20 step 1 value -30 tooltip {Pilot tone power relative to signal} xywh {205 340 75 20} type Simple align 8 minimum -60 maximum -20 step 1 value -30
code0 {o->value(progdefaults.pilot_power);} code0 {o->value(progdefaults.pilot_power);}
code1 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->labelsize(FL_NORMAL_SIZE);}
class Fl_Counter2 class Fl_Counter2
} }
Fl_Check_Button btnPSK8Preamble {
label {Short Preamble}
callback {progStatus.psk8DCDShortFlag = o->value();}
tooltip {Enable encode/decode vestigial pilot tone} xywh {410 340 113 20} down_box DOWN_BOX
code0 {o->value(progStatus.psk8DCDShortFlag);}
}
} }
} }
} }
@ -6987,8 +6993,8 @@ progdefaults.changed = true;}
} }
Fl_Group tabIO { Fl_Group tabIO {
label IO label IO
callback {btnDisable_p2p_io_widgets->value(1);} open callback {btnDisable_p2p_io_widgets->value(1);} open selected
tooltip {Program to Program Communications} xywh {0 25 600 355} hide tooltip {Program to Program Communications} xywh {0 25 600 355}
code0 {btnDisable_p2p_io_widgets->value(1);} code0 {btnDisable_p2p_io_widgets->value(1);}
} { } {
Fl_Group {} {open Fl_Group {} {open
@ -6996,11 +7002,12 @@ progdefaults.changed = true;}
} { } {
Fl_Check_Button btnDisable_p2p_io_widgets { Fl_Check_Button btnDisable_p2p_io_widgets {
label Lock user_data_type long label Lock user_data_type long
callback {progStatus.ip_lock = o->value(); callback { progStatus.ip_lock = o->value();
if(o->value()) if(o->value())
disable_config_p2p_io_widgets(); disable_config_p2p_io_widgets();
else else
enable_config_p2p_io_widgets();} enable_config_p2p_io_widgets();
kiss_io_set_button_state(0);}
tooltip {Allow/Disallow Changes} xywh {12 112 85 20} down_box DOWN_BOX tooltip {Allow/Disallow Changes} xywh {12 112 85 20} down_box DOWN_BOX
code0 {o->value(progStatus.ip_lock);} code0 {o->value(progStatus.ip_lock);}
} }
@ -7056,7 +7063,7 @@ progdefaults.changed = true;}
} }
Fl_Box {} { Fl_Box {} {
label {Enable ARQ for programs that support TCP and FLDIGI ARQ protocol. label {Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.
Enable KISS for programs that supports UDP and TNC-2 KISS protocol. Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.
Only one interface (ARQ/KISS) can be active at any given time. Only one interface (ARQ/KISS) can be active at any given time.
KISS/ARQ/XML Addr/Port changes require program restart.} KISS/ARQ/XML Addr/Port changes require program restart.}
xywh {8 37 582 72} xywh {8 37 582 72}
@ -7123,7 +7130,7 @@ progdefaults.changed = true;}
else else
progdefaults.enableBusyChannel = false; progdefaults.enableBusyChannel = false;
progdefaults.changed = true;} progdefaults.changed = true;}
tooltip {Enable Busy Channel} xywh {425 147 65 15} down_box DOWN_BOX tooltip {Enable Busy Channel} xywh {331 145 65 15} down_box DOWN_BOX
code0 {if(progdefaults.enableBusyChannel) o->value(true);} code0 {if(progdefaults.enableBusyChannel) o->value(true);}
code1 {else o->value(false);} code1 {else o->value(false);}
code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();}
@ -7146,7 +7153,7 @@ else
progdefaults.kiss_dual_port_enabled = false; progdefaults.kiss_dual_port_enabled = false;
progdefaults.changed = true;} progdefaults.changed = true;}
tooltip {Enable when both programs are using the same IP address} xywh {425 168 90 16} down_box DOWN_BOX tooltip {Enable when both programs are using the same IP address} xywh {485 169 90 16} down_box DOWN_BOX
code0 {if(progdefaults.kiss_dual_port_enabled) o->value(true); else o->value(false);} code0 {if(progdefaults.kiss_dual_port_enabled) o->value(true); else o->value(false);}
code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();}
} }
@ -7156,6 +7163,54 @@ progdefaults.changed = true;}
xywh {505 193 82 25} hide xywh {505 193 82 25} hide
code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();}
} }
Fl_Button btn_connect_kiss_io {
label Connect
callback {connect_to_kiss_io();}
tooltip {Return KISS TCP IO connection to a Listening state} xywh {504 193 82 25}
code0 {(progStatus.ip_lock || !progStatus.kiss_tcp_io) ? o->deactivate() : o->activate();}
}
Fl_Check_Button btnKissTCPIO {
label TCP
callback {if(o->value()) {
progdefaults.kiss_tcp_io = true;
progStatus.kiss_tcp_io = true;
} else {
progStatus.kiss_tcp_io = false;
progdefaults.kiss_tcp_io = false;
}
kiss_io_set_button_state(0);}
tooltip {Check to enable TCP/IP IO Connection} xywh {425 145 60 15} down_box DOWN_BOX
code0 {if(progStatus.kiss_tcp_io) o->value(true); else o->value(false);}
code1 {progStatus.ip_lock ? o->deactivate() : o->activate();}
}
Fl_Check_Button btnKissUDPIO {
label UDP
callback {if(o->value()) {
progdefaults.kiss_tcp_io = false;
progStatus.kiss_tcp_io = false;
} else {
progStatus.kiss_tcp_io = true;
progdefaults.kiss_tcp_io = true;
}
kiss_io_set_button_state(0);}
tooltip {Check to enable UDP/IP IO} xywh {425 170 60 15} down_box DOWN_BOX
code0 {if(progStatus.kiss_tcp_io) o->value(true); else o->value(false);}
code1 {progStatus.ip_lock ? o->deactivate() : o->activate();}
}
Fl_Check_Button btnKissTCPListen {
label {Listen / Bind}
callback {if(o->value()) {
progdefaults.kiss_tcp_listen = true;
progStatus.kiss_tcp_listen = true;
} else {
progStatus.kiss_tcp_listen = false;
progdefaults.kiss_tcp_listen = false;
}}
tooltip {Monitor for TCP connection} xywh {485 145 95 15} down_box DOWN_BOX
code0 {if(progStatus.kiss_tcp_listen) o->value(true); else o->value(false);}
code1 {progStatus.ip_lock ? o->deactivate() : o->activate();}
}
} }
Fl_Group {} { Fl_Group {} {
label ARQ open label ARQ open
@ -7340,18 +7395,18 @@ progdefaults.changed = false;}
xywh {20 388 130 22} xywh {20 388 130 22}
} }
} }
} }
Function {openConfig()} {return_type void Function {openConfig()} {return_type void
} { } {
code {if (!dlgConfig) createConfig(); code {if (!dlgConfig) createConfig();
progdefaults.loadDefaults();} {} progdefaults.loadDefaults();} {}
} }
Function {closeDialog()} {return_type void Function {closeDialog()} {return_type void
} { } {
code {if (dlgConfig) dlgConfig->hide();} {} code {if (dlgConfig) dlgConfig->hide();} {}
} }
Function {createConfig()} {return_type void Function {createConfig()} {return_type void
} { } {
@ -7359,10 +7414,10 @@ Function {createConfig()} {return_type void
dlgConfig = ConfigureDialog(); dlgConfig = ConfigureDialog();
dlgConfig->xclass(PACKAGE_NAME); dlgConfig->xclass(PACKAGE_NAME);
}} {} }} {}
} }
decl {class Fl_File_Chooser ;} {public global decl {class Fl_File_Chooser ;} {public global
} }
Function {WefaxDestDirSet(Fl_File_Chooser *w, void *userdata)} {return_type void Function {WefaxDestDirSet(Fl_File_Chooser *w, void *userdata)} {return_type void
} { } {
@ -7372,7 +7427,7 @@ if( ( w->value() != NULL ) && ( ! w->shown() ) ) {
btnWefaxSaveDir->redraw(); btnWefaxSaveDir->redraw();
cb_btnWefaxSaveDir( btnWefaxSaveDir, NULL ); cb_btnWefaxSaveDir( btnWefaxSaveDir, NULL );
}} {} }} {}
} }
Function {KmlDestDirSet(Fl_File_Chooser *w, void *userdata)} {open return_type void Function {KmlDestDirSet(Fl_File_Chooser *w, void *userdata)} {open return_type void
} { } {
@ -7382,9 +7437,9 @@ if( ( w->value() != NULL ) && ( ! w->shown() ) ) {
btnKmlSaveDir->redraw(); btnKmlSaveDir->redraw();
cb_btnKmlSaveDir( btnKmlSaveDir, NULL ); cb_btnKmlSaveDir( btnKmlSaveDir, NULL );
}} {} }} {}
} }
Function {make_window()} {} {} Function {make_window()} {} {}
Function {make_window()} {open Function {make_window()} {open
} {} } {}

Wyświetl plik

@ -1418,6 +1418,8 @@ void update_scope()
active_modem->refresh_scope(); active_modem->refresh_scope();
} }
extern bool valid_kiss_modem(std::string modem_name);
void init_modem(trx_mode mode, int freq) void init_modem(trx_mode mode, int freq)
{ {
ENSURE_THREAD(FLMAIN_TID); ENSURE_THREAD(FLMAIN_TID);
@ -1441,10 +1443,26 @@ void init_modem(trx_mode mode, int freq)
stopMacroTimer(); stopMacroTimer();
if (data_io_enabled == KISS_IO) { if (data_io_enabled == KISS_IO) {
if(!bcast_rsid_kiss_frame(freq, mode, (int) active_modem->get_txfreq(), active_modem->get_mode(), trx_mode current_mode = active_modem->get_mode();
if(!bcast_rsid_kiss_frame(freq, mode, (int) active_modem->get_txfreq(), current_mode,
progdefaults.rsid_notify_only ? RSID_KISS_NOTIFY : RSID_KISS_ACTIVE)) { progdefaults.rsid_notify_only ? RSID_KISS_NOTIFY : RSID_KISS_ACTIVE)) {
LOG_INFO("Invaild Modem for KISS I/O (%s)", mode_info[mode].sname); LOG_INFO("Invaild Modem for KISS I/O (%s)", mode_info[mode].sname);
return;
if(!fl_choice2(_("Switch to ARQ I/O"), _("Yes"), _("No"), NULL)) {
btnEnable_kiss->value(false);
btnEnable_kiss->do_callback();
btnEnable_arq->value(true);
btnEnable_arq->do_callback();
} else {
std::string modem_name;
modem_name.assign(mode_info[current_mode].sname);
bool valid = valid_kiss_modem(modem_name);
if(!valid)
current_mode = MODE_PSK250;
mode = current_mode;
}
} }
} }
@ -5808,7 +5826,7 @@ void create_fl_digi_main_primary() {
smeter->w(), smeter->h()); smeter->w(), smeter->h());
pwr_level = new Fl_Value_Slider2( pwr_level = new Fl_Value_Slider2(
pwrlevel_grp->x(), pwrlevel_grp->y(), pwrlevel_grp->x(), pwrlevel_grp->y(),
pwrlevel_grp->w() - 50, pwrlevel_grp->h()); pwrlevel_grp->w() - 50, pwrlevel_grp->h());
pwr_level->type(FL_HOR_NICE_SLIDER); pwr_level->type(FL_HOR_NICE_SLIDER);
pwr_level->range(0, 100.0); pwr_level->range(0, 100.0);
@ -6027,7 +6045,7 @@ void create_fl_digi_main_primary() {
opUsage = new Fl_Input2( opUsage = new Fl_Input2(
opOutUsage->x() + opOutUsage->w() + pad, opOutUsage->x() + opOutUsage->w() + pad,
opOutUsage->y(), opOutUsage->y(),
opUsageFrame->w() - opOutUsage->w() - 50 - 3 * pad, opUsageFrame->w() - opOutUsage->w() - 50 - 3 * pad,
Hentry); Hentry);
opUsageEnter = new Fl_Button( opUsageEnter = new Fl_Button(
@ -6165,7 +6183,7 @@ void create_fl_digi_main_primary() {
outSerNo1->type(FL_NORMAL_OUTPUT); outSerNo1->type(FL_NORMAL_OUTPUT);
inpSerNo1 = new Fl_Input2( inpSerNo1 = new Fl_Input2(
rightof(outSerNo1) + pad, y3, rightof(outSerNo1) + pad, y3,
40, Hentry, 40, Hentry,
"# R"); "# R");
inpSerNo1->align(FL_ALIGN_LEFT); inpSerNo1->align(FL_ALIGN_LEFT);
@ -9219,6 +9237,52 @@ void set_ip_to_default(int which_io)
} }
} }
void kiss_io_set_button_state(void *ptr)
{
if(progStatus.kiss_tcp_io) {
btn_connect_kiss_io->activate();
btn_connect_kiss_io->redraw();
btnKissTCPIO->activate();
btnKissTCPIO->value(true);
btnKissTCPListen->activate();
btnKissUDPIO->value(false);
btnKissUDPIO->activate();
btnEnable_dual_port->deactivate();
} else {
btn_connect_kiss_io->activate();
btnKissTCPIO->value(false);
btnKissTCPIO->activate();
btnKissTCPListen->activate();
btnKissUDPIO->value(true);
btnKissUDPIO->activate();
btnEnable_dual_port->activate();
}
char *label = (char *)0;
if(ptr)
label = (char *)ptr;
if(label) {
btn_connect_kiss_io->label(label);
btn_connect_kiss_io->redraw();
}
if(progStatus.ip_lock) {
btn_connect_kiss_io->deactivate();
btnKissTCPIO->deactivate();
btnKissUDPIO->deactivate();
btnKissTCPListen->deactivate();
btnEnable_dual_port->deactivate();
}
}
void set_CSV(int start) void set_CSV(int start)
{ {
if (! (active_modem->get_mode() == MODE_ANALYSIS || if (! (active_modem->get_mode() == MODE_ANALYSIS ||

Wyświetl plik

@ -392,6 +392,7 @@ extern Fl_ListBox *listbox_psk_status_timeout;
extern Fl_Check_Button *btnEnablePSKbrowsing; extern Fl_Check_Button *btnEnablePSKbrowsing;
extern Fl_Check_Button *btnPSKpilot; extern Fl_Check_Button *btnPSKpilot;
extern Fl_Counter2 *cnt_pilot_power; extern Fl_Counter2 *cnt_pilot_power;
extern Fl_Check_Button *btnPSK8Preamble;
extern Fl_Group *tabRTTY; extern Fl_Group *tabRTTY;
extern Fl_Tabs *tabsRTTY; extern Fl_Tabs *tabsRTTY;
extern Fl_ListBox *selShift; extern Fl_ListBox *selShift;
@ -721,6 +722,10 @@ extern Fl_Check_Button *btnEnableBusyChannel;
extern Fl_Input2 *txtKiss_ip_out_port_no; extern Fl_Input2 *txtKiss_ip_out_port_no;
extern Fl_Check_Button *btnEnable_dual_port; extern Fl_Check_Button *btnEnable_dual_port;
extern Fl_Button *btn_restart_kiss; extern Fl_Button *btn_restart_kiss;
extern Fl_Button *btn_connect_kiss_io;
extern Fl_Check_Button *btnKissTCPIO;
extern Fl_Check_Button *btnKissUDPIO;
extern Fl_Check_Button *btnKissTCPListen;
extern Fl_Input2 *txtArq_ip_address; extern Fl_Input2 *txtArq_ip_address;
extern Fl_Input2 *txtArq_ip_port_no; extern Fl_Input2 *txtArq_ip_port_no;
extern Fl_Button *btnDefault_arq_ip; extern Fl_Button *btnDefault_arq_ip;

Wyświetl plik

@ -1682,6 +1682,12 @@
ELEM_(bool, csma_enabled, "CSMA_ENABLED", \ ELEM_(bool, csma_enabled, "CSMA_ENABLED", \
"Use CSMA on heavy traffic channels (AX25)", \ "Use CSMA on heavy traffic channels (AX25)", \
true) \ true) \
ELEM_(bool, kiss_tcp_io, "KISS_TCP_IO", \
"Connect kiss io via TCP/IP vise UDP/IP", \
false) \
ELEM_(bool, kiss_tcp_listen, "KISS_TCP_LISTEN", \
"Listen for TCP connection (Server mode)", \
false) \
ELEM_(std::string, flrig_ip_address, "FLRIG_IP_ADDRESS", \ ELEM_(std::string, flrig_ip_address, "FLRIG_IP_ADDRESS", \
"IP Address of flrig server", \ "IP Address of flrig server", \
DEFAULT_FLRIG_IP_ADDRESS) \ DEFAULT_FLRIG_IP_ADDRESS) \
@ -1891,9 +1897,12 @@
ELEM_(bool, us_units, "US_UNITS", \ ELEM_(bool, us_units, "US_UNITS", \
"Use US units of distance for QRB", \ "Use US units of distance for QRB", \
false) \ false) \
ELEM_(int, MacroEditFontsize, "MACROEDITFONTSIZE", \ ELEM_(int, MacroEditFontsize, "MACROEDITFONTSIZE", \
"RX text font size", \ "RX text font size", \
16) 16) \
ELEM_(bool, psk8DCDShortFlag, "PSK8DCDSHORTFLAG", \
"Flag: Change DCD pre-ample length", \
false)
// declare the struct // declare the struct

Wyświetl plik

@ -27,6 +27,13 @@
#ifndef fldigi_data_io_h #ifndef fldigi_data_io_h
#define fldigi_data_io_h #define fldigi_data_io_h
#include "gettext.h"
#define IO_CONNECT_STR _("Connect")
#define IO_DISCONNECT_STR _("Disc")
#define IO_START_STR _("Start")
#define IO_STOP_STR _("Stop")
#define DEFAULT_ARQ_IP_ADDRESS "127.0.0.1" #define DEFAULT_ARQ_IP_ADDRESS "127.0.0.1"
#define DEFAULT_ARQ_IP_PORT "7322" #define DEFAULT_ARQ_IP_PORT "7322"
@ -49,20 +56,25 @@ enum {DISABLED_IO, ARQ_IO, KISS_IO, XMLRPC_IO, FLRIG_IO, FLLOG_IO};
#define RSID_KISS_ACTIVE 0x02 #define RSID_KISS_ACTIVE 0x02
#define RSID_KISS_USER 0x03 #define RSID_KISS_USER 0x03
#define DATA_IO_NA 0x00
#define DATA_IO_TCP 0x01
#define DATA_IO_UDP 0x02
// This variable indepent of progdefaults.data_io_enabled // This variable indepent of progdefaults.data_io_enabled
// and progStatus.data_io_enabled // and progStatus.data_io_enabled
// Only on start de we assign this variable with progStatus.data_io_enabled. // Only on start de we assign this variable with progStatus.data_io_enabled.
// This is one way assignment as we dont want to save all of the available states // This is one way assignment as we dont want to save all of the available states
// this variable will have. // this variable will have.
extern int data_io_enabled; // Located in kiss_io.cxx extern int data_io_enabled; // Located in kiss_io.cxx
extern int data_io_type; // Located in kiss_io.cxx
extern void disable_config_p2p_io_widgets(void); extern void disable_config_p2p_io_widgets(void);
extern void enable_config_p2p_io_widgets(void); extern void enable_config_p2p_io_widgets(void);
extern void set_ip_to_default(int which_io); extern void set_ip_to_default(int which_io);
// KISS implementation // KISS implementation
extern void kiss_init(void); extern void kiss_init(bool connect_flag);
extern void kiss_close(void); extern void kiss_close(bool override_flag);
extern void kiss_reset(void); extern void kiss_reset(void);
extern void WriteKISS(const char data); extern void WriteKISS(const char data);
extern void WriteKISS(const char *data); extern void WriteKISS(const char *data);
@ -78,6 +90,8 @@ extern bool kiss_bcast_trx_toggle;
extern bool bcast_rsid_kiss_frame(int new_wf_pos, int new_mode, int old_wf_pos, int old_mode, int notify); extern bool bcast_rsid_kiss_frame(int new_wf_pos, int new_mode, int old_wf_pos, int old_mode, int notify);
extern void bcast_trxc_kiss_frame(void); extern void bcast_trxc_kiss_frame(void);
extern void update_kpsql_fractional_gain(int value); extern void update_kpsql_fractional_gain(int value);
extern void kiss_io_set_button_state(void *);
extern void connect_to_kiss_io(void);
// ARQ implementation // ARQ implementation
extern void arq_init(void); extern void arq_init(void);

Wyświetl plik

@ -83,7 +83,7 @@ bool bcast_rsid_kiss_frame(int new_wf_pos, int new_mode, int old_wf_pos, int old
inline std::string uppercase_string(std::string str); inline std::string uppercase_string(std::string str);
static double detect_signal(int freq, int bw, double *low, double *high); static double detect_signal(int freq, int bw, double *low, double *high);
static bool kiss_queue_frame(KISS_QUEUE_FRAME * frame, std::string cmd); static bool kiss_queue_frame(KISS_QUEUE_FRAME * frame, std::string cmd);
static bool valid_kiss_modem(std::string _modem); bool valid_kiss_modem(std::string _modem);
static KISS_QUEUE_FRAME *encap_kiss_frame(char *buffer, size_t size, int frame_type, int kiss_port_no); static KISS_QUEUE_FRAME *encap_kiss_frame(char *buffer, size_t size, int frame_type, int kiss_port_no);
static KISS_QUEUE_FRAME *encap_kiss_frame(std::string data, int kiss_frame_type, int port); static KISS_QUEUE_FRAME *encap_kiss_frame(std::string data, int kiss_frame_type, int port);
static KISS_QUEUE_FRAME *encap_kiss_frame(std::string package, int frame_type, int kiss_port_no); static KISS_QUEUE_FRAME *encap_kiss_frame(std::string package, int frame_type, int kiss_port_no);

Wyświetl plik

@ -138,10 +138,12 @@ public:
void listen(int backlog = SOMAXCONN); void listen(int backlog = SOMAXCONN);
Socket accept(void); Socket accept(void);
Socket accept1(void); Socket accept1(void);
Socket * accept2(void);
// Client // Client
void connect(const Address& addr); void connect(const Address& addr);
void connect(void); void connect(void);
bool connect1(void);
// Data Transimission // Data Transimission
size_t send(const void* buf, size_t len); size_t send(const void* buf, size_t len);

Wyświetl plik

@ -164,9 +164,11 @@ struct status {
int busyChannelSeconds; int busyChannelSeconds;
int kpsql_attenuation; int kpsql_attenuation;
bool csma_enabled; bool csma_enabled;
bool kiss_tcp_io;
bool kiss_tcp_listen;
bool ip_lock; bool ip_lock;
double squelch_value; double squelch_value;
bool psk8DCDShortFlag;
std::string browser_search; std::string browser_search;
bool meters; bool meters;

Wyświetl plik

@ -26,11 +26,10 @@
#include <sys/time.h> #include <sys/time.h>
#ifdef __MINGW32__ #ifdef __MINGW32__
# include <pthread.h> # include <pthread.h>
//#endif
#else #else
# if !HAVE_CLOCK_GETTIME # if !HAVE_CLOCK_GETTIME
enum clockid_t { CLOCK_REALTIME, CLOCK_MONOTONIC }; enum clockid_t { CLOCK_REALTIME, CLOCK_MONOTONIC };
int clock_gettime(clockid_t clock_id, struct timespec* tp); int clock_gettime(clockid_t clock_id, struct timespec* tp);
# endif # endif
#endif #endif

Wyświetl plik

@ -348,7 +348,7 @@ void delayed_startup(void *)
data_io_enabled = DISABLED_IO; data_io_enabled = DISABLED_IO;
arq_init(); arq_init();
kiss_init(); //kiss_init();
if (progdefaults.connect_to_maclogger) maclogger_init(); if (progdefaults.connect_to_maclogger) maclogger_init();
data_io_enabled = progStatus.data_io_enabled; data_io_enabled = progStatus.data_io_enabled;
@ -771,7 +771,7 @@ void exit_process() {
if (progdefaults.kml_enabled) if (progdefaults.kml_enabled)
KmlServer::Exit(); KmlServer::Exit();
arq_close(); arq_close();
kiss_close(); kiss_close(false);
maclogger_close(); maclogger_close();
XML_RPC_Server::stop(); XML_RPC_Server::stop();

Wyświetl plik

@ -95,10 +95,11 @@ static pthread_mutex_t external_mutex = PTHREAD_MUTEX_INITIALIZER;
bool kiss_enabled = false; bool kiss_enabled = false;
bool kiss_exit = false; bool kiss_exit = false;
bool kiss_rx_exit = false; bool kiss_rx_exit = false;
bool allow_kiss_socket_io = false;
static bool smack_crc_enabled = false; static bool smack_crc_enabled = false;
static int crc_mode = CRC16_CCITT; static int crc_mode = CRC16_CCITT;
static std::string default_kiss_modem = "PSK63RC5"; static std::string default_kiss_modem = "BPSK250";
static std::string kiss_modem = ""; static std::string kiss_modem = "";
static unsigned int transmit_buffer_flush_timeout = 0; static unsigned int transmit_buffer_flush_timeout = 0;
@ -147,6 +148,7 @@ static double kpsql_threshold = 0.0;
extern int IMAGE_WIDTH; extern int IMAGE_WIDTH;
Socket *kiss_socket = 0; Socket *kiss_socket = 0;
int data_io_enabled = DISABLED_IO; int data_io_enabled = DISABLED_IO;
int data_io_type = DATA_IO_UDP;
//static bool host_responded = false; //static bool host_responded = false;
// Used to scale the sensitivity of KPSQL // Used to scale the sensitivity of KPSQL
@ -165,6 +167,7 @@ extern void abort_tx();
static std::vector<std::string> availabe_kiss_modems; static std::vector<std::string> availabe_kiss_modems;
extern void ax25_decode(unsigned char *buffer, size_t count, bool pad, bool tx_flag); extern void ax25_decode(unsigned char *buffer, size_t count, bool pad, bool tx_flag);
static void kiss_main_thread_close(void *ptr);
static int kiss_raw_enabled = KISS_RAW_DISABLED; static int kiss_raw_enabled = KISS_RAW_DISABLED;
@ -422,28 +425,25 @@ static void set_slider2(Fl_Slider2 * sider, int value)
sider->do_callback(); sider->do_callback();
} }
/********************************************************************************** /**********************************************************************************
* *
**********************************************************************************/ **********************************************************************************/
/* bool valid_kiss_modem(string _modem)
static void set_valuator(Fl_Valuator* valuator, double value)
{
valuator->value(value);
valuator->do_callback();
}
*/
/**********************************************************************************
*
**********************************************************************************/
static bool valid_kiss_modem(string _modem)
{ {
if(_modem.empty()) return false; if(_modem.empty()) return false;
int index = 0; int index = 0;
int count = availabe_kiss_modems.size(); int count = availabe_kiss_modems.size();
if(count < 1) {
for(index = 0; index < NUM_MODES; index++)
if(mode_info[index].iface_io & KISS_IO)
availabe_kiss_modems.push_back(mode_info[index].sname);
count = availabe_kiss_modems.size();
}
std::string cmp_str = ""; std::string cmp_str = "";
index = 0;
while(index < count) { while(index < count) {
cmp_str = uppercase_string(availabe_kiss_modems[index]); cmp_str = uppercase_string(availabe_kiss_modems[index]);
@ -3360,25 +3360,49 @@ static void *ReadFromHostSocket(void *args)
static char buffer[2048]; static char buffer[2048];
string str_buffer; string str_buffer;
size_t count = 0; size_t count = 0;
Socket *tmp_socket = (Socket *)0;
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
str_buffer.reserve(sizeof(buffer)); str_buffer.reserve(sizeof(buffer));
LOG_INFO("%s", "Kiss RX loop started. "); LOG_INFO("%s", "Kiss RX loop started. ");
kiss_rx_exit = false;
allow_kiss_socket_io = false;
if(progStatus.kiss_tcp_io && progStatus.kiss_tcp_listen) {
tmp_socket = kiss_socket->accept2();
if(!tmp_socket) {
kiss_rx_exit = true;
} else {
kiss_socket->shut_down();
kiss_socket->close();
kiss_socket = tmp_socket;
}
}
allow_kiss_socket_io = true;
while(!kiss_rx_exit) { while(!kiss_rx_exit) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
try { try {
if(allow_kiss_socket_io) {
if(progStatus.kiss_tcp_io)
count = kiss_socket->recv((void *) buffer, sizeof(buffer) - 1);
else
count = kiss_socket->recvFrom((void *) buffer, sizeof(buffer) - 1); count = kiss_socket->recvFrom((void *) buffer, sizeof(buffer) - 1);
}
} catch (...) { } catch (...) {
if (errno) LOG_INFO("recvFrom Socket Error %d", errno); if (errno) LOG_INFO("recv/recvFrom Socket Error %d", errno);
count = 0; count = 0;
} }
if(count && (data_io_enabled == KISS_IO)) { if((count == 0) && (errno != 0)) {
kiss_rx_exit = true;
}
if(count && (data_io_enabled == KISS_IO)) {
#ifdef EXTENED_DEBUG_INFO #ifdef EXTENED_DEBUG_INFO
LOG_HEX(buffer, count); LOG_HEX(buffer, count);
#endif #endif
@ -3388,7 +3412,11 @@ static void *ReadFromHostSocket(void *args)
} }
kiss_exit = true; kiss_exit = true;
allow_kiss_socket_io = false;
if(kiss_socket)
kiss_socket->shut_down();
Fl::awake(kiss_main_thread_close, (void *) 0);
LOG_INFO("%s", "Kiss RX loop exit. "); LOG_INFO("%s", "Kiss RX loop exit. ");
return (void *)0; return (void *)0;
@ -3415,7 +3443,12 @@ static void ReadFromHostSocket()
} }
try { try {
if(allow_kiss_socket_io) {
if(progStatus.kiss_tcp_io)
count = kiss_socket->recv((void *) buffer, sizeof(buffer) - 1);
else
count = kiss_socket->recvFrom((void *) buffer, sizeof(buffer) - 1); count = kiss_socket->recvFrom((void *) buffer, sizeof(buffer) - 1);
}
} catch (...) { } catch (...) {
LOG_INFO("Kiss RX Loop Shutdown"); LOG_INFO("Kiss RX Loop Shutdown");
count = 0; count = 0;
@ -3589,10 +3622,16 @@ void WriteToHostSocket(void)
if(to_host.empty()) return; if(to_host.empty()) return;
if(kiss_socket && data_io_enabled == KISS_IO) { if(kiss_socket && data_io_enabled == KISS_IO) {
if(allow_kiss_socket_io) {
if(progStatus.kiss_tcp_io)
kiss_socket->send(to_host.c_str(), to_host.size());
else
kiss_socket->sendTo(to_host.c_str(), to_host.size()); kiss_socket->sendTo(to_host.c_str(), to_host.size());
}
#ifdef EXTENED_DEBUG_INFO #ifdef EXTENED_DEBUG_INFO
LOG_HEX(to_host.c_str(), to_host.size()); LOG_HEX(to_host.c_str(), to_host.size());
#endif #endif
} }
to_host.clear(); to_host.clear();
} }
@ -3721,6 +3760,55 @@ void WriteToHostBCastFramesBuffered(void)
kiss_bc_frame.clear(); kiss_bc_frame.clear();
} }
/**********************************************************************************
*
**********************************************************************************/
bool tcp_init(bool connect_flag)
{
if(progdefaults.kiss_address.empty() || progdefaults.kiss_io_port.empty()) {
LOG_DEBUG("%s", "KISS IP Address or Port null");
return false;
}
kiss_ip_address.assign(progdefaults.kiss_address);
kiss_ip_io_port.assign(progdefaults.kiss_io_port);
kiss_ip_out_port.assign(progdefaults.kiss_out_port);
try {
kiss_socket = new Socket(Address(kiss_ip_address.c_str(), kiss_ip_io_port.c_str(), "tcp"));
kiss_socket->set_autoclose(true);
kiss_socket->set_nonblocking(false);
if(progdefaults.kiss_tcp_listen)
kiss_socket->bind();
}
catch (const SocketException& e) {
LOG_ERROR("Could not resolve %s: %s", kiss_ip_address.c_str(), e.what());
if(kiss_socket) {
kiss_socket->shut_down();
kiss_socket->close();
delete kiss_socket;
kiss_socket = 0;
kiss_enabled = 0;
}
return false;
}
if(connect_flag) {
if(kiss_socket->connect1() == false) {
LOG_INFO("Connection Failed: Host program present?");
kiss_socket->shut_down();
kiss_socket->close();
delete kiss_socket;
kiss_socket = 0;
kiss_enabled = 0;
return false;
}
}
return true;
}
/********************************************************************************** /**********************************************************************************
* *
**********************************************************************************/ **********************************************************************************/
@ -3741,15 +3829,25 @@ bool udp_init(void)
kiss_socket->set_dual_port_number(kiss_ip_out_port); kiss_socket->set_dual_port_number(kiss_ip_out_port);
kiss_socket->set_autoclose(true); kiss_socket->set_autoclose(true);
kiss_socket->set_nonblocking(false); kiss_socket->set_nonblocking(false);
if(progdefaults.kiss_tcp_listen) // Listen flag indcates server mode.
kiss_socket->bindUDP(); kiss_socket->bindUDP();
}
catch (const SocketException& e) { } catch (const SocketException& e) {
LOG_ERROR("Could not resolve %s: %s", kiss_ip_address.c_str(), e.what()); LOG_ERROR("Could not resolve %s: %s", kiss_ip_address.c_str(), e.what());
if(kiss_socket) {
kiss_socket->shut_down();
kiss_socket->close();
delete kiss_socket;
kiss_socket = 0;
kiss_enabled = 0;
}
return false; return false;
} }
return true; return true;
} }
/********************************************************************************** /**********************************************************************************
* *
**********************************************************************************/ **********************************************************************************/
@ -3816,44 +3914,45 @@ void kiss_reset(void)
/********************************************************************************** /**********************************************************************************
* *
**********************************************************************************/ **********************************************************************************/
void kiss_init(void) void kiss_init(bool connect_flag)
{ {
kiss_enabled = false; kiss_enabled = false;
kiss_exit = false; kiss_exit = false;
int index = 0;
for(index = 0; index < NUM_MODES; index++)
if(mode_info[index].iface_io & KISS_IO)
availabe_kiss_modems.push_back(mode_info[index].sname);
// progStatus.data_io_enabled (widget state), data_io_enabled (program state) // progStatus.data_io_enabled (widget state), data_io_enabled (program state)
if(progStatus.data_io_enabled == KISS_IO) { if(progStatus.data_io_enabled == KISS_IO) {
if(!(active_modem->iface_io() & KISS_IO)) { if(!(active_modem->iface_io() & KISS_IO)) {
set_default_kiss_modem(); set_default_kiss_modem();
} }
} }
if(init_hist_flag) { if(init_hist_flag) {
memset(histogram, 0, sizeof(histogram)); memset(histogram, 0, sizeof(histogram));
init_hist_flag = false; init_hist_flag = false;
} }
if(!udp_init()) return;
LOG_INFO("%s", "UDP Init - OK");
srand(time(0)); // For CSMA persistance srand(time(0)); // For CSMA persistance
update_kpsql_fractional_gain(progdefaults.kpsql_attenuation); update_kpsql_fractional_gain(progdefaults.kpsql_attenuation);
data_io_type = DATA_IO_NA;
if(progStatus.kiss_tcp_io) {
if(progStatus.kiss_tcp_listen) connect_flag = false;
Fl::awake(kiss_io_set_button_state, (void *) IO_CONNECT_STR);
if(!tcp_init(connect_flag)) return;
LOG_INFO("%s", "TCP Init - OK");
} else {
Fl::awake(kiss_io_set_button_state, (void *) IO_START_STR);
if(!udp_init()) return;
LOG_INFO("%s", "UDP Init - OK");
}
if (pthread_create(&kiss_thread, NULL, kiss_loop, NULL) < 0) { if (pthread_create(&kiss_thread, NULL, kiss_loop, NULL) < 0) {
LOG_ERROR("KISS kiss_thread: pthread_create failed"); LOG_ERROR("KISS kiss_thread: pthread_create failed");
return; return;
} }
#ifdef KISS_RX_THREAD #ifdef KISS_RX_THREAD
if (pthread_create(&kiss_rx_socket_thread, NULL, ReadFromHostSocket, NULL) < 0) { if (pthread_create(&kiss_rx_socket_thread, NULL, ReadFromHostSocket, NULL) < 0) {
LOG_ERROR("KISS kiss_rx_socket_thread: pthread_create failed"); LOG_ERROR("KISS kiss_rx_socket_thread: pthread_create failed");
@ -3863,24 +3962,49 @@ void kiss_init(void)
} }
#endif #endif
if(progStatus.kiss_tcp_io) {
Fl::awake(kiss_io_set_button_state, (void *) IO_DISCONNECT_STR);
data_io_type = DATA_IO_TCP;
} else {
Fl::awake(kiss_io_set_button_state, (void *) IO_STOP_STR);
data_io_type = DATA_IO_UDP;
}
if(progdefaults.data_io_enabled == KISS_IO)
data_io_enabled = KISS_IO;
kiss_enabled = true; kiss_enabled = true;
allow_kiss_socket_io = true;
} }
/********************************************************************************** /**********************************************************************************
* *
**********************************************************************************/ **********************************************************************************/
void kiss_close(void) void kiss_main_thread_close(void *ptr)
{ {
if (!kiss_enabled) return; kiss_close(true);
}
/**********************************************************************************
*
**********************************************************************************/
void kiss_close(bool override_flag)
{
// if (!kiss_enabled && !override_flag) return;
kiss_text_available = false; kiss_text_available = false;
allow_kiss_socket_io = false;
if(data_io_enabled == KISS_IO) if(data_io_enabled == KISS_IO) {
data_io_enabled = DISABLED_IO; data_io_enabled = DISABLED_IO;
data_io_type = DATA_IO_NA;
}
if(kiss_socket) { if(kiss_socket) {
kiss_socket->shut_down(); kiss_socket->shut_down();
kiss_socket->close(); kiss_socket->close();
} else {
return;
} }
#ifdef KISS_RX_THREAD #ifdef KISS_RX_THREAD
@ -3905,8 +4029,26 @@ void kiss_close(void)
LOG_INFO("%s", "Kiss loop terminated. "); LOG_INFO("%s", "Kiss loop terminated. ");
kiss_socket = 0;
kiss_enabled = false; kiss_enabled = false;
if(progdefaults.kiss_tcp_io)
Fl::awake(kiss_io_set_button_state, (void *) IO_CONNECT_STR);
else
Fl::awake(kiss_io_set_button_state, (void *) IO_START_STR);
}
/**********************************************************************************
*
**********************************************************************************/
void connect_to_kiss_io(void)
{
if(kiss_socket) {
kiss_close(true);
} else {
kiss_init(progdefaults.kiss_tcp_listen ? false : true);
}
} }
/********************************************************************************** /**********************************************************************************

Wyświetl plik

@ -665,9 +665,11 @@ void Socket::bind(void)
#else #else
; ;
#endif #endif
if (::bind(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) if (::bind(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) {
if(errno != EADDRINUSE) // EADDRINUSE == 48
throw SocketException(errno, "bind"); throw SocketException(errno, "bind");
} }
}
/// ///
/// Binds the socket to the address associated with the object /// Binds the socket to the address associated with the object
@ -801,6 +803,30 @@ Socket Socket::accept1(void)
return s; return s;
} }
///
/// Accepts a connection
///
/// The socket must already have been bound to an address via a call to the bind
/// method.
///
/// @return A Socket instance pointer for the accepted connection
///
Socket * Socket::accept2(void)
{
listen();
// wait for fd to become readable
if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0)))
if (!wait(0))
throw SocketException(ETIMEDOUT, "select");
int r;
if ((r = ::accept(sockfd, NULL, 0)) == -1)
return (Socket *)0;
set_close_on_exec(true, r);
return new Socket(r);
}
/// ///
/// Connects the socket to the address that is associated with the object /// Connects the socket to the address that is associated with the object
@ -813,6 +839,20 @@ void Socket::connect(void)
if (::connect(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) if (::connect(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1)
throw SocketException(errno, "connect"); throw SocketException(errno, "connect");
} }
///
/// Connects the socket to the address that is associated with the object
/// Return connect state (T/F)
///
bool Socket::connect1(void)
{
#ifndef NDEBUG
LOG_DEBUG("Connecting to %s", address.get_str(ainfo).c_str());
#endif
if (::connect(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) {
return false;
}
return true;
}
/// ///
/// Set socket to allow for broadcasting. /// Set socket to allow for broadcasting.
@ -875,8 +915,14 @@ size_t Socket::send(const void* buf, size_t len)
shutdown(sockfd, SHUT_WR); shutdown(sockfd, SHUT_WR);
throw SocketException(errno, "send"); throw SocketException(errno, "send");
} else if (r == -1) { } else if (r == -1) {
if (errno != EAGAIN) switch(errno) {
case EAGAIN:
case ENOTCONN:
case EBADF:
break;
default:
throw SocketException(errno, "send"); throw SocketException(errno, "send");
}
r = 0; r = 0;
} }
} }

Wyświetl plik

@ -199,8 +199,11 @@ status progStatus = {
progdefaults.busyChannelSeconds, progdefaults.busyChannelSeconds,
progdefaults.kpsql_attenuation, progdefaults.kpsql_attenuation,
progdefaults.csma_enabled, progdefaults.csma_enabled,
progdefaults.kiss_tcp_io,
progdefaults.kiss_tcp_listen,
true, true,
0.0, 0.0,
progdefaults.psk8DCDShortFlag,
"CQ", // string browser_search; "CQ", // string browser_search;
@ -321,6 +324,9 @@ void status::saveLastState()
busyChannelSeconds = progdefaults.busyChannelSeconds; busyChannelSeconds = progdefaults.busyChannelSeconds;
kpsql_attenuation = progdefaults.kpsql_attenuation; kpsql_attenuation = progdefaults.kpsql_attenuation;
csma_enabled = progdefaults.csma_enabled; csma_enabled = progdefaults.csma_enabled;
kiss_tcp_io = progdefaults.kiss_tcp_io;
kiss_tcp_listen = progdefaults.kiss_tcp_listen;
squelch_value = 0; squelch_value = 0;
Fl_Preferences spref(HomeDir.c_str(), "w1hkj.com", PACKAGE_TARNAME); Fl_Preferences spref(HomeDir.c_str(), "w1hkj.com", PACKAGE_TARNAME);
@ -335,6 +341,8 @@ void status::saveLastState()
spref.set("pwr_squelch_level", sldrPwrSquelchValue); spref.set("pwr_squelch_level", sldrPwrSquelchValue);
spref.set("afc_enabled", afconoff); spref.set("afc_enabled", afconoff);
spref.set("psk8DCDShortFlag", psk8DCDShortFlag);
spref.set("log_enabled", LOGenabled); spref.set("log_enabled", LOGenabled);
spref.set("wf_carrier", carrier); spref.set("wf_carrier", carrier);
@ -479,6 +487,9 @@ if (!bWF_only) {
spref.set("busyChannelSeconds", busyChannelSeconds); spref.set("busyChannelSeconds", busyChannelSeconds);
spref.set("kpsql_attenuation", kpsql_attenuation); spref.set("kpsql_attenuation", kpsql_attenuation);
spref.set("csma_enabled", csma_enabled); spref.set("csma_enabled", csma_enabled);
spref.set("kiss_tcp_io", kiss_tcp_io);
spref.set("kiss_tcp_listen", kiss_tcp_listen);
spref.set("browser_search", browser_search.c_str()); spref.set("browser_search", browser_search.c_str());
spref.set("meters", meters); spref.set("meters", meters);
@ -707,6 +718,10 @@ void status::loadLastState()
spref.get("busyChannelSeconds", i, busyChannelSeconds); busyChannelSeconds = i; spref.get("busyChannelSeconds", i, busyChannelSeconds); busyChannelSeconds = i;
spref.get("kpsql_attenuation", i, kpsql_attenuation); kpsql_attenuation = i; spref.get("kpsql_attenuation", i, kpsql_attenuation); kpsql_attenuation = i;
spref.get("csma_enabled", i, csma_enabled); csma_enabled = i; spref.get("csma_enabled", i, csma_enabled); csma_enabled = i;
spref.get("kiss_tcp_io", i, kiss_tcp_io); kiss_tcp_io = i;
spref.get("kiss_tcp_listen", i, kiss_tcp_listen); kiss_tcp_listen = i;
spref.get("psk8DCDShortFlag", i, psk8DCDShortFlag); psk8DCDShortFlag = i;
memset(strbuff, 0, sizeof(strbuff)); memset(strbuff, 0, sizeof(strbuff));
spref.get("browser_search", strbuff, browser_search.c_str(), sizeof(strbuff) - 1); spref.get("browser_search", strbuff, browser_search.c_str(), sizeof(strbuff) - 1);
@ -865,6 +880,8 @@ void status::initLastState()
cntKPSQLAttenuation->value(kpsql_attenuation); cntKPSQLAttenuation->value(kpsql_attenuation);
progdefaults.kpsql_attenuation = kpsql_attenuation; progdefaults.kpsql_attenuation = kpsql_attenuation;
kiss_io_set_button_state(0);
if (bWF_only) if (bWF_only)
fl_digi_main->resize(mainX, mainY, mainW, Hmenu + Hwfall + Hstatus); fl_digi_main->resize(mainX, mainY, mainW, Hmenu + Hwfall + Hstatus);
else { else {

Wyświetl plik

@ -773,7 +773,7 @@ psk::psk(trx_mode pskmode) : modem()
dec->setchunksize(4); dec->setchunksize(4);
dec2 = new viterbi(K13, K16_POLY1, K16_POLY2); dec2 = new viterbi(K13, K16_POLY1, K16_POLY2);
dec2->setchunksize(4); dec2->setchunksize(4);
} else if (_xpsk || _8psk || _16psk) { } else if (_xpsk || _8psk || _16psk) {
enc = new encoder(K13, K13_POLY1, K13_POLY2); enc = new encoder(K13, K13_POLY1, K13_POLY2);
dec = new viterbi(K13, K13_POLY1, K13_POLY2); dec = new viterbi(K13, K13_POLY1, K13_POLY2);
@ -1143,9 +1143,9 @@ void psk::vestigial_afc() {
std::setprecision(2); std::setw(5); std::setprecision(2); std::setw(5);
for (i = 0; i < 11; i++) if (abs(sfft_bins[i]) > 2.0*avg) break; for (i = 0; i < 11; i++) if (abs(sfft_bins[i]) > 2.0*avg) break;
if (i < 11) { if (i < 11) {
// std::cout << "bin: " << i // std::cout << "bin: " << i
// << ", freq offset: " << (i - 5)*samplerate/16384.0 // << ", freq offset: " << (i - 5)*samplerate/16384.0
// << ", amp: " << abs(sfft_bins[i]) // << ", amp: " << abs(sfft_bins[i])
// << ", avg: " << avg << "\n"; // << ", avg: " << avg << "\n";
if (i != 5) { if (i != 5) {
frequency -= 1.0*(i-5)*samplerate/sfft_size; frequency -= 1.0*(i-5)*samplerate/sfft_size;
@ -1351,7 +1351,7 @@ void psk::rx_symbol(cmplx symbol, int car)
if (!_disablefec) break; if (!_disablefec) break;
set_dcdON = 0; set_dcdON = 0;
break; break;
case 0x10410410: // xpsk DCD on (with FEC enabled) case 0x10410410: // xpsk DCD on (with FEC enabled)
if (_pskr) break; if (_pskr) break;
if (_qpsk) break; if (_qpsk) break;
@ -1361,7 +1361,7 @@ void psk::rx_symbol(cmplx symbol, int car)
if (_disablefec) break; if (_disablefec) break;
set_dcdON = 1; set_dcdON = 1;
break; break;
case 0x00000000: // bpsk DCD off. x,8,16psk DCD on (with FEC disabled). case 0x00000000: // bpsk DCD off. x,8,16psk DCD on (with FEC disabled).
if (_pskr) break; if (_pskr) break;
if (_xpsk || _8psk || _16psk) { if (_xpsk || _8psk || _16psk) {
@ -1419,7 +1419,7 @@ void psk::rx_symbol(cmplx symbol, int car)
phasequality = (phasequality + lastphasequality) / 2; // Differential modem: average probabilities between current and previous symbols phasequality = (phasequality + lastphasequality) / 2; // Differential modem: average probabilities between current and previous symbols
lastphasequality = phasequality; lastphasequality = phasequality;
int soft_qualityerror = static_cast<int>(128 - (128 * phasequality)) ; int soft_qualityerror = static_cast<int>(128 - (128 * phasequality)) ;
if (soft_qualityerror > 255-25) // Prevent soft-bit wrap-around (crossing of value 128) if (soft_qualityerror > 255-25) // Prevent soft-bit wrap-around (crossing of value 128)
softpuncture = true; softpuncture = true;
else if (soft_qualityerror < 128/3) // First 1/3 of phase delta is considered a perfect signal else if (soft_qualityerror < 128/3) // First 1/3 of phase delta is considered a perfect signal
@ -1427,8 +1427,8 @@ void psk::rx_symbol(cmplx symbol, int car)
else if (soft_qualityerror > 128 - (128/8) ) // Last 1/8 of phase delta triggers a puncture else if (soft_qualityerror > 128 - (128/8) ) // Last 1/8 of phase delta triggers a puncture
softpuncture = true; softpuncture = true;
else else
soft_qualityerror /= 2; // Scale the FEC error to prevent premature cutoff soft_qualityerror /= 2; // Scale the FEC error to prevent premature cutoff
if (softpuncture) { if (softpuncture) {
for(int i=0; i<symbits; i++) rx_pskr(128); for(int i=0; i<symbits; i++) rx_pskr(128);
@ -1439,7 +1439,7 @@ void psk::rx_symbol(cmplx symbol, int car)
rx_pskr( (graymapped_8psk_softbits[bitindex][i]) - soft_qualityerror ); rx_pskr( (graymapped_8psk_softbits[bitindex][i]) - soft_qualityerror );
else // Soft-Zero else // Soft-Zero
rx_pskr( (graymapped_8psk_softbits[bitindex][i]) + soft_qualityerror ); rx_pskr( (graymapped_8psk_softbits[bitindex][i]) + soft_qualityerror );
} }
} }
} else { } else {
@ -2106,11 +2106,17 @@ void psk::tx_flush()
for (int i=0; i<symbits; i++) { for (int i=0; i<symbits; i++) {
tx_char(0); // Send <NUL> to clear bit accumulators on both Tx and Rx ends. tx_char(0); // Send <NUL> to clear bit accumulators on both Tx and Rx ends.
} }
int symbol; int symbol;
if (_16psk) symbol = 8; if (_16psk) symbol = 8;
else if (_8psk) symbol = 4; else if (_8psk) symbol = 4;
else symbol = 2; else symbol = 2;
for (int i = 0; i < dcdbits; i++)
int _dcdbits = dcdbits - 1;
if(progStatus.psk8DCDShortFlag)
_dcdbits = 32/(symbits - 1);
for (int i = 0; i <= _dcdbits; i++) // DCD window is only 32-bits wide
tx_symbol(symbol); // 0 degrees tx_symbol(symbol); // 0 degrees
// Standard BPSK postamble // Standard BPSK postamble
// DCD off sequence (unmodulated carrier) // DCD off sequence (unmodulated carrier)
@ -2132,6 +2138,12 @@ int psk::tx_process()
{ {
int c; int c;
// DCD window is only 32 bits, send a maximum of 3-times.
if(progStatus.psk8DCDShortFlag) {
if ( (_8psk || _xpsk || _16psk) && preamble > 96)
preamble = 96;
}
if (preamble > 0) { if (preamble > 0) {
if (_pskr || ((_xpsk || _8psk || _16psk) && !_disablefec) ) { if (_pskr || ((_xpsk || _8psk || _16psk) && !_disablefec) ) {
if (startpreamble == true) { if (startpreamble == true) {