From 3d6e0b916818bf166b9d2b254fce070a856efa7e Mon Sep 17 00:00:00 2001 From: David Freese Date: Fri, 11 Sep 2015 09:37:52 -0500 Subject: [PATCH 001/138] FSQ updates * Fix copy all on heard list * change default color scheme as requested by ZL1BPU - added user configuration items for RX text colors * remove "MONITOR" text from RX panel as requested by ZL1BPU * added fsq tx text queue to handle case when user tries to force a second transmit sequence when modem is already in TX state. * last_command updated to include both queued and transmitted text string. - allows recall of queued command even if transmit timed out * last_command changed to a stack of commands - allows recall of up to last 10 commands - each press of F2 recalls one deeper in stack - rotates back to beginning after recall of most ancient * add call to logbook using right click on heard entry * Fix erroneous date in audit log when fsq is default modem during program start - change format of date entry to make it easier to find when reviewing the log. * Added video text at beginning of transmit - also adds ability to transmit pretone for amplifier carrier detect for FM repeater operation * Add code to force center frequency to 1500 when switching from another modem * Fix to avoid time out errors * Macintosh OSX thread management - submitted by KK5VD - Ensure FSQ TX routines are called in the main thread. --- fldigi_doxygen/images/fsq-directed-popup.png | Bin 31065 -> 19239 bytes src/dialogs/confdialog.cxx | 135 +++++- src/dialogs/confdialog.fl | 121 +++-- src/dialogs/fl_digi.cxx | 164 +++---- src/flarq-src/arqdialogs.cxx | 2 +- src/flarq-src/include/arqdialogs.h | 2 +- src/fsq/fsq-pic.cxx | 25 +- src/fsq/fsq.cxx | 463 +++++++++++-------- src/fsq/fsq_monitor.cxx | 2 +- src/include/FTextView.h | 1 + src/include/confdialog.h | 4 + src/include/configuration.h | 9 + src/include/fl_digi.h | 3 + src/include/fsq.h | 18 +- src/include/modem.h | 15 +- src/main.cxx | 3 + src/widgets/FTextRXTX.cxx | 6 +- src/widgets/FTextView.cxx | 4 + 18 files changed, 583 insertions(+), 394 deletions(-) diff --git a/fldigi_doxygen/images/fsq-directed-popup.png b/fldigi_doxygen/images/fsq-directed-popup.png index 6ffa1467d6b53753f76b44b3e60dc117b20e9c94..dba55d6d57c06c7f0b4d186bd7b5614b1ce73e0a 100644 GIT binary patch literal 19239 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 diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index 66122819..8d3ad6e2 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -2930,6 +2930,67 @@ if (fname) { }; } +Fl_Button *btn_fsq_xmt_color=(Fl_Button *)0; + +static void cb_btn_fsq_xmt_color(Fl_Button*, void*) { + choose_color(progdefaults.fsq_xmt_color); + +btn_fsq_xmt_color->color( progdefaults.fsq_xmt_color ); +btn_fsq_xmt_color->redraw(); + +fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); + +progdefaults.changed = true; +} + +Fl_Button *btn_fsq_directed_color=(Fl_Button *)0; + +static void cb_btn_fsq_directed_color(Fl_Button*, void*) { + choose_color(progdefaults.fsq_directed_color); + +btn_fsq_directed_color->color( progdefaults.fsq_directed_color ); +btn_fsq_directed_color->redraw(); + +fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); + +progdefaults.changed = true; +} + +Fl_Button *btn_fsq_undirected_color=(Fl_Button *)0; + +static void cb_btn_fsq_undirected_color(Fl_Button*, void*) { + choose_color(progdefaults.fsq_undirected_color); + +btn_fsq_undirected_color->color( progdefaults.fsq_undirected_color); +btn_fsq_undirected_color->redraw(); + +fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); + +progdefaults.changed = true; +} + +Fl_Button *btn_fsq_color_defaults=(Fl_Button *)0; + +static void cb_btn_fsq_color_defaults(Fl_Button*, void*) { + progdefaults.fsq_xmt_color = FL_RED; +btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color); +btn_fsq_xmt_color->redraw(); + +progdefaults.fsq_directed_color = FL_BLUE; +btn_fsq_directed_color->color(progdefaults.fsq_directed_color); +btn_fsq_directed_color->redraw(); + +progdefaults.fsq_undirected_color = FL_DARK_GREEN; +btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color); +btn_fsq_undirected_color->redraw(); + +fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); +fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); +fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); + +progdefaults.changed = true; +} + Fl_Group *tabMT63=(Fl_Group *)0; Fl_Check_Button *btnMT63_8bit=(Fl_Check_Button *)0; @@ -5529,6 +5590,7 @@ Fl_Double_Window* ConfigureDialog() { tabOperator->tooltip(_("Operator information")); tabOperator->callback((Fl_Callback*)cb_tabOperator); tabOperator->when(FL_WHEN_CHANGED); + tabOperator->hide(); { Fl_Group* o = new Fl_Group(55, 35, 490, 170, _("Station")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -7222,11 +7284,11 @@ i on a\ntouch screen device such as a tablet.")); tabWaterfall->end(); } // Fl_Group* tabWaterfall { tabModems = new Fl_Group(0, 25, 600, 355, _("Modems")); - tabModems->hide(); { tabsModems = new Fl_Tabs(0, 25, 600, 355); tabsModems->selection_color(FL_LIGHT1); tabsModems->align(Fl_Align(FL_ALIGN_TOP_RIGHT)); { tabCW = new Fl_Group(0, 50, 600, 330, _("CW")); + tabCW->hide(); { tabsCW = new Fl_Tabs(0, 50, 600, 330); tabsCW->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("General")); @@ -8011,11 +8073,10 @@ i on a\ntouch screen device such as a tablet.")); tabFeld->end(); } // Fl_Group* tabFeld { tabFSQ = new Fl_Group(0, 50, 600, 330, _("FSQ")); - tabFSQ->hide(); - { Fl_Group* o = new Fl_Group(5, 60, 585, 80, _("Rx Parameters")); + { Fl_Group* o = new Fl_Group(5, 60, 585, 66, _("Rx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { Fl_Value_Slider* o = valhits = new Fl_Value_Slider(140, 72, 125, 22, _("Min Hits")); + { Fl_Value_Slider* o = valhits = new Fl_Value_Slider(140, 65, 125, 22, _("Min Hits")); valhits->tooltip(_("Minimum # hits in tone detector")); valhits->type(5); valhits->minimum(3); @@ -8027,14 +8088,14 @@ i on a\ntouch screen device such as a tablet.")); valhits->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.fsqhits); } // Fl_Value_Slider* valhits - { Fl_Choice* o = sel_fsq_lpf = new Fl_Choice(163, 104, 102, 21, _("Image LPF")); + { Fl_Choice* o = sel_fsq_lpf = new Fl_Choice(163, 94, 102, 22, _("Image LPF")); sel_fsq_lpf->tooltip(_("Narrow LPF if image noisy")); sel_fsq_lpf->down_box(FL_BORDER_BOX); sel_fsq_lpf->callback((Fl_Callback*)cb_sel_fsq_lpf); o->add("None"); o->add("300 Hz"); o->add("400 Hz"); o->add("500 Hz"); o->value(progdefaults.fsq_img_filter); } // Fl_Choice* sel_fsq_lpf - { Fl_Value_Slider* o = sldrMovAvg = new Fl_Value_Slider(410, 72, 125, 22, _("MovAvg:")); + { Fl_Value_Slider* o = sldrMovAvg = new Fl_Value_Slider(410, 65, 125, 22, _("MovAvg:")); sldrMovAvg->tooltip(_("Filter FFT output")); sldrMovAvg->type(1); sldrMovAvg->minimum(1); @@ -8046,7 +8107,7 @@ i on a\ntouch screen device such as a tablet.")); sldrMovAvg->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.fsq_movavg); } // Fl_Value_Slider* sldrMovAvg - { Fl_Choice* o = sel_fsq_heard_aging = new Fl_Choice(433, 104, 102, 21, _("Heard aging")); + { Fl_Choice* o = sel_fsq_heard_aging = new Fl_Choice(433, 94, 102, 22, _("Heard aging")); sel_fsq_heard_aging->tooltip(_("Remove call after ...")); sel_fsq_heard_aging->down_box(FL_BORDER_BOX); sel_fsq_heard_aging->callback((Fl_Callback*)cb_sel_fsq_heard_aging); @@ -8055,30 +8116,30 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Choice* sel_fsq_heard_aging o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(5, 150, 585, 135, _("Tx Parameters")); + { Fl_Group* o = new Fl_Group(5, 130, 585, 102, _("Tx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { Fl_Round_Button* o = btn_fsqbaud[0] = new Fl_Round_Button(90, 173, 55, 15, _("2 baud")); + { Fl_Round_Button* o = btn_fsqbaud[0] = new Fl_Round_Button(150, 139, 55, 15, _("2 baud")); btn_fsqbaud[0]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[0]->callback((Fl_Callback*)cb_btn_fsqbaud); o->value(progdefaults.fsqbaud == 2); } // Fl_Round_Button* btn_fsqbaud[0] - { Fl_Round_Button* o = btn_fsqbaud[1] = new Fl_Round_Button(198, 173, 55, 15, _("3 baud")); + { Fl_Round_Button* o = btn_fsqbaud[1] = new Fl_Round_Button(258, 139, 55, 15, _("3 baud")); btn_fsqbaud[1]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[1]->callback((Fl_Callback*)cb_btn_fsqbaud1); o->value(progdefaults.fsqbaud == 3); } // Fl_Round_Button* btn_fsqbaud[1] - { Fl_Round_Button* o = btn_fsqbaud[2] = new Fl_Round_Button(306, 173, 55, 15, _("4.5 baud")); + { Fl_Round_Button* o = btn_fsqbaud[2] = new Fl_Round_Button(366, 139, 55, 15, _("4.5 baud")); btn_fsqbaud[2]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[2]->callback((Fl_Callback*)cb_btn_fsqbaud2); o->value(progdefaults.fsqbaud == 4.5); } // Fl_Round_Button* btn_fsqbaud[2] - { Fl_Round_Button* o = btn_fsqbaud[3] = new Fl_Round_Button(415, 173, 55, 15, _("6 baud")); + { Fl_Round_Button* o = btn_fsqbaud[3] = new Fl_Round_Button(475, 139, 55, 15, _("6 baud")); btn_fsqbaud[3]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[3]->callback((Fl_Callback*)cb_btn_fsqbaud3); o->value(progdefaults.fsqbaud == 6); } // Fl_Round_Button* btn_fsqbaud[3] - { Fl_Choice* o = sel_fsq_frequency = new Fl_Choice(250, 219, 102, 21, _("Center freq")); + { Fl_Choice* o = sel_fsq_frequency = new Fl_Choice(250, 199, 102, 21, _("Center freq")); sel_fsq_frequency->down_box(FL_BORDER_BOX); sel_fsq_frequency->callback((Fl_Callback*)cb_sel_fsq_frequency); sel_fsq_frequency->align(Fl_Align(FL_ALIGN_TOP)); @@ -8086,20 +8147,20 @@ i on a\ntouch screen device such as a tablet.")); o->add("1150"); o->add("1500"); o->add("Variable"); o->value(progdefaults.fsq_frequency); } // Fl_Choice* sel_fsq_frequency - { Fl_Choice* o = sel_fsq_sounder = new Fl_Choice(90, 195, 102, 21, _("Sounder")); + { Fl_Choice* o = sel_fsq_sounder = new Fl_Choice(80, 163, 100, 22, _("Sounder")); sel_fsq_sounder->tooltip(_("Send beacon every ...")); sel_fsq_sounder->down_box(FL_BORDER_BOX); sel_fsq_sounder->callback((Fl_Callback*)cb_sel_fsq_sounder); o->add("OFF"); o->add("1 min"); o->add("10 min"); o->add("30 min"); o->value(progdefaults.fsq_sounder); } // Fl_Choice* sel_fsq_sounder - { Fl_Check_Button* o = btn_fsq_lowercase = new Fl_Check_Button(306, 198, 70, 15, _("MYCALL always lower case")); + { Fl_Check_Button* o = btn_fsq_lowercase = new Fl_Check_Button(366, 166, 214, 15, _("MYCALL always lower case")); btn_fsq_lowercase->tooltip(_("convert operator callsign to lower case")); btn_fsq_lowercase->down_box(FL_DOWN_BOX); btn_fsq_lowercase->callback((Fl_Callback*)cb_btn_fsq_lowercase); o->value(progdefaults.fsq_lowercase); } // Fl_Check_Button* btn_fsq_lowercase - { Fl_Counter* o = cntr_FSQ_time_out = new Fl_Counter(90, 223, 102, 22, _("Time out")); + { Fl_Counter* o = cntr_FSQ_time_out = new Fl_Counter(254, 163, 80, 22, _("Time out")); cntr_FSQ_time_out->tooltip(_("Time out xmt attempt in XX seconds")); cntr_FSQ_time_out->type(1); cntr_FSQ_time_out->minimum(2); @@ -8110,40 +8171,66 @@ i on a\ntouch screen device such as a tablet.")); cntr_FSQ_time_out->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.fsq_time_out); } // Fl_Counter* cntr_FSQ_time_out - { Fl_Input* o = new Fl_Input(90, 253, 456, 23, _("QTC:")); + { Fl_Input* o = new Fl_Input(80, 199, 456, 22, _("QTC:")); o->tooltip(_("Enter QTC text")); o->callback((Fl_Callback*)cb_QTC); o->value(progdefaults.fsqQTCtext.c_str()); } // Fl_Input* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(5, 291, 585, 80, _("Logging")); + { Fl_Group* o = new Fl_Group(5, 235, 585, 80, _("Logging")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { Fl_Output* o = txtAuditLog = new Fl_Output(82, 311, 325, 25, _("Audit log")); + { Fl_Output* o = txtAuditLog = new Fl_Output(82, 255, 325, 22, _("Audit log")); o->value(progdefaults.fsq_audit_log.c_str()); } // Fl_Output* txtAuditLog - { Fl_Light_Button* o = btn_enable_auditlog = new Fl_Light_Button(421, 313, 74, 20, _("Enable")); + { Fl_Light_Button* o = btn_enable_auditlog = new Fl_Light_Button(421, 256, 74, 20, _("Enable")); btn_enable_auditlog->selection_color((Fl_Color)2); btn_enable_auditlog->callback((Fl_Callback*)cb_btn_enable_auditlog); o->value(progdefaults.fsq_enable_audit_log); } // Fl_Light_Button* btn_enable_auditlog - { btn_select_auditlog = new Fl_Button(509, 313, 70, 20, _("Select")); + { btn_select_auditlog = new Fl_Button(509, 256, 70, 20, _("Select")); btn_select_auditlog->callback((Fl_Callback*)cb_btn_select_auditlog); } // Fl_Button* btn_select_auditlog - { Fl_Output* o = txtHeardLog = new Fl_Output(80, 340, 325, 25, _("Heard log")); + { Fl_Output* o = txtHeardLog = new Fl_Output(82, 284, 325, 22, _("Heard log")); o->value(progdefaults.fsq_heard_log.c_str()); } // Fl_Output* txtHeardLog - { Fl_Light_Button* o = btn_enable_fsq_heard_log = new Fl_Light_Button(419, 342, 74, 20, _("Enable")); + { Fl_Light_Button* o = btn_enable_fsq_heard_log = new Fl_Light_Button(421, 285, 74, 20, _("Enable")); btn_enable_fsq_heard_log->selection_color((Fl_Color)2); btn_enable_fsq_heard_log->callback((Fl_Callback*)cb_btn_enable_fsq_heard_log); o->value(progdefaults.fsq_enable_heard_log); } // Fl_Light_Button* btn_enable_fsq_heard_log - { btn_select_fsq_heard_log = new Fl_Button(507, 342, 70, 20, _("Select")); + { btn_select_fsq_heard_log = new Fl_Button(509, 285, 70, 20, _("Select")); btn_select_fsq_heard_log->callback((Fl_Callback*)cb_btn_select_fsq_heard_log); } // Fl_Button* btn_select_fsq_heard_log o->end(); } // Fl_Group* o + { Fl_Group* o = new Fl_Group(5, 318, 585, 55, _("Text Colors")); + o->box(FL_ENGRAVED_BOX); + o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); + { btn_fsq_xmt_color = new Fl_Button(82, 339, 65, 24, _("XMIT")); + btn_fsq_xmt_color->tooltip(_("Transmit text")); + btn_fsq_xmt_color->callback((Fl_Callback*)cb_btn_fsq_xmt_color); + btn_fsq_xmt_color->align(Fl_Align(FL_ALIGN_LEFT)); + btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color); + } // Fl_Button* btn_fsq_xmt_color + { btn_fsq_directed_color = new Fl_Button(253, 339, 65, 24, _("DIRECTED")); + btn_fsq_directed_color->tooltip(_("Directed received text")); + btn_fsq_directed_color->callback((Fl_Callback*)cb_btn_fsq_directed_color); + btn_fsq_directed_color->align(Fl_Align(FL_ALIGN_LEFT)); + btn_fsq_directed_color->color(progdefaults.fsq_directed_color); + } // Fl_Button* btn_fsq_directed_color + { btn_fsq_undirected_color = new Fl_Button(425, 339, 65, 24, _("UNDIRECTED")); + btn_fsq_undirected_color->tooltip(_("Undirected received text")); + btn_fsq_undirected_color->callback((Fl_Callback*)cb_btn_fsq_undirected_color); + btn_fsq_undirected_color->align(Fl_Align(FL_ALIGN_LEFT)); + btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color); + } // Fl_Button* btn_fsq_undirected_color + { btn_fsq_color_defaults = new Fl_Button(507, 339, 74, 24, _("Defaults")); + btn_fsq_color_defaults->callback((Fl_Callback*)cb_btn_fsq_color_defaults); + } // Fl_Button* btn_fsq_color_defaults + o->end(); + } // Fl_Group* o tabFSQ->end(); } // Fl_Group* tabFSQ { tabMT63 = new Fl_Group(0, 50, 600, 330, _("MT-63")); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index ad680c83..8bcc9dd7 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -351,15 +351,15 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} Fl_Window {} { label {Fldigi configuration} open - xywh {996 32 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible + xywh {677 32 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible } { Fl_Tabs tabsConfigure {open xywh {0 0 600 380} color 50 selection_color 50 } { Fl_Group tabOperator { label Operator - callback {progdefaults.changed = true;} open selected - tooltip {Operator information} xywh {0 25 600 355} when 1 + callback {progdefaults.changed = true;} open + tooltip {Operator information} xywh {0 25 600 355} when 1 hide } { Fl_Group {} { label Station open @@ -2820,14 +2820,14 @@ behaves inside the waterfall} xywh {65 207 150 22} box DOWN_BOX color 7 align 8 } Fl_Group tabModems { label Modems open - xywh {0 25 600 355} hide + xywh {0 25 600 355} } { Fl_Tabs tabsModems {open xywh {0 25 600 355} selection_color 50 align 9 } { Fl_Group tabCW { label CW open - xywh {0 50 600 330} + xywh {0 50 600 330} hide } { Fl_Tabs tabsCW {open xywh {0 50 600 330} selection_color 50 @@ -3434,24 +3434,24 @@ progdefaults.changed = true;} } Fl_Group tabFSQ { label FSQ open - xywh {0 50 600 330} hide + xywh {0 50 600 330} } { Fl_Group {} { label {Rx Parameters} open - xywh {5 60 585 80} box ENGRAVED_BOX align 21 + xywh {5 60 585 66} box ENGRAVED_BOX align 21 } { Fl_Value_Slider valhits { label {Min Hits} callback {progdefaults.fsqhits=(int)o->value(); progdefaults.changed = true;} - tooltip {Minimum \# hits in tone detector} xywh {140 72 125 22} type {Horz Knob} align 8 minimum 3 maximum 6 step 1 value 3 textsize 14 + tooltip {Minimum \# hits in tone detector} xywh {140 65 125 22} type {Horz Knob} align 8 minimum 3 maximum 6 step 1 value 3 textsize 14 code0 {o->value(progdefaults.fsqhits);} } Fl_Choice sel_fsq_lpf { label {Image LPF} callback {progdefaults.fsq_img_filter=o->value(); progdefaults.changed = true;} open - tooltip {Narrow LPF if image noisy} xywh {163 104 102 21} down_box BORDER_BOX + tooltip {Narrow LPF if image noisy} xywh {163 94 102 22} down_box BORDER_BOX code0 {o->add("None"); o->add("300 Hz"); o->add("400 Hz"); o->add("500 Hz");} code1 {o->value(progdefaults.fsq_img_filter);} } {} @@ -3459,21 +3459,21 @@ progdefaults.changed = true;} open label {MovAvg:} callback {progdefaults.fsq_movavg = o->value(); progdefaults.changed = true;} - tooltip {Filter FFT output} xywh {410 72 125 22} type Horizontal align 4 minimum 1 maximum 4 step 1 value 4 textsize 14 + tooltip {Filter FFT output} xywh {410 65 125 22} type Horizontal align 4 minimum 1 maximum 4 step 1 value 4 textsize 14 code0 {o->value(progdefaults.fsq_movavg);} } Fl_Choice sel_fsq_heard_aging { label {Heard aging} callback {progdefaults.fsq_heard_aging=o->value(); progdefaults.changed = true;} open - tooltip {Remove call after ...} xywh {433 104 102 21} down_box BORDER_BOX + tooltip {Remove call after ...} xywh {433 94 102 22} down_box BORDER_BOX code0 {o->add("Never"); o->add("1 min"); o->add("5 min");o->add("10 min"); o->add("20 min"); o->add("20 min");} code1 {o->value(progdefaults.fsq_heard_aging);} } {} } Fl_Group {} { label {Tx Parameters} open - xywh {5 150 585 135} box ENGRAVED_BOX align 21 + xywh {5 130 585 102} box ENGRAVED_BOX align 21 } { Fl_Round_Button {btn_fsqbaud[0]} { label {2 baud} @@ -3484,7 +3484,7 @@ btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); } progdefaults.changed = true;} - xywh {90 173 55 15} down_box ROUND_DOWN_BOX + xywh {150 139 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 2);} } Fl_Round_Button {btn_fsqbaud[1]} { @@ -3496,7 +3496,7 @@ btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); } progdefaults.changed = true;} - xywh {198 173 55 15} down_box ROUND_DOWN_BOX + xywh {258 139 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 3);} } Fl_Round_Button {btn_fsqbaud[2]} { @@ -3508,7 +3508,7 @@ btn_fsqbaud[1]->value(0); btn_fsqbaud[3]->value(0); } progdefaults.changed = true;} - xywh {306 173 55 15} down_box ROUND_DOWN_BOX + xywh {366 139 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 4.5);} } Fl_Round_Button {btn_fsqbaud[3]} { @@ -3520,14 +3520,14 @@ btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); } progdefaults.changed = true;} - xywh {415 173 55 15} down_box ROUND_DOWN_BOX + xywh {475 139 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 6);} } Fl_Choice sel_fsq_frequency { label {Center freq} callback {progdefaults.fsq_frequency=o->value(); progdefaults.changed = true;} open - xywh {250 219 102 21} down_box BORDER_BOX align 1 hide + xywh {250 199 102 21} down_box BORDER_BOX align 1 hide code0 {o->add("1150"); o->add("1500"); o->add("Variable");} code1 {o->value(progdefaults.fsq_frequency);} } {} @@ -3535,7 +3535,7 @@ progdefaults.changed = true;} open label Sounder callback {progdefaults.fsq_sounder=o->value(); progdefaults.changed = true;} open - tooltip {Send beacon every ...} xywh {90 195 102 21} down_box BORDER_BOX + tooltip {Send beacon every ...} xywh {80 163 100 22} down_box BORDER_BOX code0 {o->add("OFF"); o->add("1 min"); o->add("10 min"); o->add("30 min");} code1 {o->value(progdefaults.fsq_sounder);} } {} @@ -3543,38 +3543,38 @@ progdefaults.changed = true;} open label {MYCALL always lower case} callback {progdefaults.fsq_lowercase=o->value(); progdefaults.changed = true;} - tooltip {convert operator callsign to lower case} xywh {306 198 70 15} down_box DOWN_BOX + tooltip {convert operator callsign to lower case} xywh {366 166 214 15} down_box DOWN_BOX code0 {o->value(progdefaults.fsq_lowercase);} } Fl_Counter cntr_FSQ_time_out { label {Time out} callback {progdefaults.fsq_time_out = o->value(); progdefaults.changed = true;} - tooltip {Time out xmt attempt in XX seconds} xywh {90 223 102 22} type Simple align 4 minimum 2 maximum 20 step 1 value 6 + tooltip {Time out xmt attempt in XX seconds} xywh {254 163 80 22} type Simple align 4 minimum 2 maximum 20 step 1 value 6 code0 {o->value(progdefaults.fsq_time_out);} } Fl_Input {} { label {QTC:} callback {progdefaults.fsqQTCtext = o->value(); progdefaults.changed = true;} - tooltip {Enter QTC text} xywh {90 253 456 23} + tooltip {Enter QTC text} xywh {80 199 456 22} code0 {o->value(progdefaults.fsqQTCtext.c_str());} } } Fl_Group {} { label Logging open - xywh {5 291 585 80} box ENGRAVED_BOX align 21 + xywh {5 235 585 80} box ENGRAVED_BOX align 21 } { Fl_Output txtAuditLog { label {Audit log} - xywh {82 311 325 25} + xywh {82 255 325 22} code0 {o->value(progdefaults.fsq_audit_log.c_str());} } Fl_Light_Button btn_enable_auditlog { label Enable callback {progdefaults.fsq_enable_audit_log = o->value(); progdefaults.changed = true;} - xywh {421 313 74 20} selection_color 2 + xywh {421 256 74 20} selection_color 2 code0 {o->value(progdefaults.fsq_enable_audit_log);} } Fl_Button btn_select_auditlog { @@ -3588,18 +3588,18 @@ if (fname) { txtAuditLog->value(progdefaults.fsq_audit_log.c_str()); progdefaults.changed = true; }} - xywh {509 313 70 20} + xywh {509 256 70 20} } Fl_Output txtHeardLog { label {Heard log} - xywh {80 340 325 25} + xywh {82 284 325 22} code0 {o->value(progdefaults.fsq_heard_log.c_str());} } Fl_Light_Button btn_enable_fsq_heard_log { label Enable callback {progdefaults.fsq_enable_heard_log = o->value(); progdefaults.changed = true;} - xywh {419 342 74 20} selection_color 2 + xywh {421 285 74 20} selection_color 2 code0 {o->value(progdefaults.fsq_enable_heard_log);} } Fl_Button btn_select_fsq_heard_log { @@ -3612,7 +3612,72 @@ if (fname) { txtHeardLog->value(progdefaults.fsq_heard_log.c_str()); progdefaults.changed = true; }} - xywh {507 342 70 20} + xywh {509 285 70 20} + } + } + Fl_Group {} { + label {Text Colors} open selected + xywh {5 318 585 55} box ENGRAVED_BOX align 21 + } { + Fl_Button btn_fsq_xmt_color { + label XMIT + callback {choose_color(progdefaults.fsq_xmt_color); + +btn_fsq_xmt_color->color( progdefaults.fsq_xmt_color ); +btn_fsq_xmt_color->redraw(); + +fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); + +progdefaults.changed = true;} + tooltip {Transmit text} xywh {82 339 65 24} align 4 + code0 {btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color);} + } + Fl_Button btn_fsq_directed_color { + label DIRECTED + callback {choose_color(progdefaults.fsq_directed_color); + +btn_fsq_directed_color->color( progdefaults.fsq_directed_color ); +btn_fsq_directed_color->redraw(); + +fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); + +progdefaults.changed = true;} + tooltip {Directed received text} xywh {253 339 65 24} align 4 + code0 {btn_fsq_directed_color->color(progdefaults.fsq_directed_color);} + } + Fl_Button btn_fsq_undirected_color { + label UNDIRECTED + callback {choose_color(progdefaults.fsq_undirected_color); + +btn_fsq_undirected_color->color( progdefaults.fsq_undirected_color); +btn_fsq_undirected_color->redraw(); + +fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); + +progdefaults.changed = true;} + tooltip {Undirected received text} xywh {425 339 65 24} align 4 + code0 {btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color);} + } + Fl_Button btn_fsq_color_defaults { + label Defaults + callback {progdefaults.fsq_xmt_color = FL_RED; +btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color); +btn_fsq_xmt_color->redraw(); + +progdefaults.fsq_directed_color = FL_BLUE; +btn_fsq_directed_color->color(progdefaults.fsq_directed_color); +btn_fsq_directed_color->redraw(); + +progdefaults.fsq_undirected_color = FL_DARK_GREEN; +btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color); +btn_fsq_undirected_color->redraw(); + +fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); +fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); +fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); + +progdefaults.changed = true;} + xywh {507 339 74 24} } } } diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index bfa74d98..ab70c2c3 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -175,7 +175,7 @@ #define VIEW_MLABEL _("&View") #define MFSK_IMAGE_MLABEL _("&MFSK Image") #define WEFAX_RX_IMAGE_MLABEL _("&Weather Fax Image RX") -#define WEFAX_TX_IMAGE_MLABEL _("&Weather Fax Image TX") +#define WEFAX_fsq_tx_image_MLABEL _("&Weather Fax Image TX") #define CONTEST_MLABEL _("Contest") #define CONTEST_FIELDS_MLABEL _("&Contest fields") #define COUNTRIES_MLABEL _("C&ountries") @@ -2454,6 +2454,8 @@ void ztimer(void* first_call) else ztbuf[8] = '\0'; + if (!inpTimeOff1) return; + inpTimeOff1->value(zshowtime()); inpTimeOff2->value(zshowtime()); inpTimeOff3->value(zshowtime()); @@ -4015,7 +4017,7 @@ _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Floating scope"), utilities_system_monitor_icon), 'd', (Fl_Callback*)cb_mnuDigiscope, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(MFSK_IMAGE_MLABEL, image_icon), 'm', (Fl_Callback*)cb_mnuPicViewer, 0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(WEFAX_RX_IMAGE_MLABEL, image_icon), 'w', (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_rx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, -{ icons::make_icon_label(WEFAX_TX_IMAGE_MLABEL, image_icon), 't', (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_tx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, +{ icons::make_icon_label(WEFAX_fsq_tx_image_MLABEL, image_icon), 't', (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_tx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Signal browser")), 's', (Fl_Callback*)cb_mnuViewer, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(COUNTRIES_MLABEL), 'o', (Fl_Callback*)cb_mnuShowCountries, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, @@ -4218,7 +4220,7 @@ void activate_wefax_image_item(bool b) Fl_Menu_Item *wefax_rx_item = getMenuItem(WEFAX_RX_IMAGE_MLABEL); if (wefax_rx_item) icons::set_active(wefax_rx_item, b); - Fl_Menu_Item *wefax_tx_item = getMenuItem(WEFAX_TX_IMAGE_MLABEL); + Fl_Menu_Item *wefax_tx_item = getMenuItem(WEFAX_fsq_tx_image_MLABEL); if (wefax_tx_item) icons::set_active(wefax_tx_item, b); } @@ -5894,6 +5896,9 @@ int alt_btn_width = 2 * DEFAULT_SW; fsq_rx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); fsq_rx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); fsq_rx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); + fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); + fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); + fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); fsq_tx_text = new FTextTX( 0, Y + fsq_rx_text->h(), @@ -5965,11 +5970,11 @@ int alt_btn_width = 2 * DEFAULT_SW; int _xp = fsq_lower_right->x(); btn_FSQCALL = new Fl_Light_Button( - _xp, _yp, bw2, bh, "FSQCALL"); + _xp, _yp, bw2, bh, "FSQ-ON"); btn_FSQCALL->value(progdefaults.fsq_directed); btn_FSQCALL->selection_color(FL_DARK_GREEN); btn_FSQCALL->callback(cbFSQCALL, 0); - btn_FSQCALL->tooltip("Left click - on/off\nRight click - debug on/off"); + btn_FSQCALL->tooltip("Left click - on/off"); _xp += bw2; @@ -6289,9 +6294,6 @@ int alt_btn_width = 2 * DEFAULT_SW; if (!progdefaults.menuicons) icons::toggle_icon_labels(); - // ztimer must be run by FLTK's timeout handler - Fl::add_timeout(0.0, ztimer, (void*)true); - // Set the state of checked toggle menu items. Never changes. const struct { bool var; const char* label; @@ -6520,7 +6522,7 @@ static Fl_Menu_Item alt_menu_[] = { //{ make_icon_label(_("Extern Scope"), utilities_system_monitor_icon), 'd', (Fl_Callback*)cb_mnuDigiscope, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(MFSK_IMAGE_MLABEL, image_icon), 'm', (Fl_Callback*)cb_mnuPicViewer, 0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(WEFAX_RX_IMAGE_MLABEL, image_icon), 'm', (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_rx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, -{ icons::make_icon_label(WEFAX_TX_IMAGE_MLABEL, image_icon), 'm', (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_tx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, +{ icons::make_icon_label(WEFAX_fsq_tx_image_MLABEL, image_icon), 'm', (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_tx,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Signal Browser")), 's', (Fl_Callback*)cb_mnuViewer, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, @@ -7394,7 +7396,8 @@ void put_Status1(const char *msg, double timeout, status_timeout action) m[sizeof(m) - 1] = '\0'; info1msg = msg; - if (progStatus.NO_RIGLOG && !(active_modem->get_mode() == MODE_FSQ)) return; + if (!active_modem) return; + if (progStatus.NO_RIGLOG && active_modem->get_mode() != MODE_FSQ) return; REQ(put_status_msg, Status1, m, timeout, action); } @@ -7515,57 +7518,13 @@ void do_que_execute(void *) que_waiting = false; } -int get_fsq_tx_char(void) -{ - int c = fsq_tx_text->nextChar(); - - if (c == GET_TX_CHAR_ETX) { - return c; - } - if (c == -1) - return(GET_TX_CHAR_NODATA); - - if (c == '^') { - c = fsq_tx_text->nextChar(); - if (c == -1) - return(GET_TX_CHAR_NODATA); - switch (c) { - case 'p': case 'P': - fsq_tx_text->pause(); - break; - case 'r': - REQ_SYNC(&FTextTX::clear_sent, fsq_tx_text); - REQ(Rx_queue_execute); - return(GET_TX_CHAR_ETX); - break; - case 'R': - if (fsq_tx_text->eot()) { - REQ_SYNC(&FTextTX::clear_sent, TransmitText); - REQ(Rx_queue_execute); - return(GET_TX_CHAR_ETX); - } else - return(GET_TX_CHAR_NODATA); - break; - case 'L': - REQ(qso_save_now); - return(GET_TX_CHAR_NODATA); - break; - case 'C': - REQ(clearQSO); - return(GET_TX_CHAR_NODATA); - break; - default: ; - } - } - - return(c); -} - char szTestChar[] = "E|I|S|T|M|O|A|V"; //string bools = "------"; //char testbools[7]; +extern int get_fsq_tx_char(); + int get_tx_char(void) { if (active_modem->get_mode() == MODE_FSQ) return get_fsq_tx_char(); @@ -8335,55 +8294,58 @@ void cb_heard_copy(Fl_Widget *w, void *) Fl::copy(fsq_selected_call.c_str(), fsq_selected_call.length(), 1); } +void cb_heard_copy_to_log(Fl_Widget *w, void *) +{ + inpCall->value(fsq_selected_call.c_str()); + cb_call(inpCall, (void *)0); +} + void cb_heard_copy_all(Fl_Widget *w, void *) { if (fsq_heard->size() < 2) return; + fsq_selected_call.clear(); for (int i = 2; i <= fsq_heard->size(); i++) { - fsq_selected_call = fsq_heard->text(i); + fsq_selected_call.append(fsq_heard->text(i)); size_t p = fsq_selected_call.find(','); if (p != std::string::npos) fsq_selected_call.erase(p); - if ( i < fsq_heard->size()) fsq_selected_call.append(" "); - Fl::copy(fsq_selected_call.c_str(), fsq_selected_call.length(), 1); + fsq_selected_call.append(" "); } + Fl::copy(fsq_selected_call.c_str(), fsq_selected_call.length(), 1); } void cb_heard_query_snr(Fl_Widget *w, void *) { - fsq_tx_text->add(fsq_selected_call.c_str()); - fsq_tx_text->add("?"); - fsq_tx_text->add("^r"); - start_tx(); + std::string s = fsq_selected_call.c_str(); + s.append("?"); + fsq_xmt(s); } void cb_heard_query_heard(Fl_Widget *w, void *) { - fsq_tx_text->add(fsq_selected_call.c_str()); - fsq_tx_text->add("$"); - fsq_tx_text->add("^r"); - start_tx(); + std::string s = fsq_selected_call.c_str(); + s.append("$"); + fsq_xmt(s); } void cb_heard_query_at(Fl_Widget *w, void *) { - fsq_tx_text->add(fsq_selected_call.c_str()); - fsq_tx_text->add("@"); - fsq_tx_text->add("^r"); - start_tx(); + std::string s = fsq_selected_call.c_str(); + s.append("@"); + fsq_xmt(s); } void cb_heard_query_carat(Fl_Widget *w, void *) { - fsq_tx_text->add(fsq_selected_call.c_str()); - fsq_tx_text->add("^^^r"); - start_tx(); + std::string s = fsq_selected_call.c_str(); + s.append("^^"); + fsq_xmt(s); } void cb_heard_query_amp(Fl_Widget *w, void *) { - fsq_tx_text->add(fsq_selected_call.c_str()); - fsq_tx_text->add("&"); - fsq_tx_text->add("^r"); - start_tx(); + std::string s = fsq_selected_call.c_str(); + s.append("&"); + fsq_xmt(s); } void cb_heard_send_file(Fl_Widget *w, void *) @@ -8404,13 +8366,12 @@ void cb_heard_send_file(Fl_Widget *w, void *) ch = txfile.get(); } txfile.close(); - fsq_tx_text->add(fsq_selected_call.c_str()); - fsq_tx_text->add("#["); - fsq_tx_text->add(fname.c_str()); - fsq_tx_text->add("]\n"); - fsq_tx_text->add(text.str().c_str()); - fsq_tx_text->add("^r"); - start_tx(); + std::string s = fsq_selected_call.c_str(); + s.append("#["); + s.append(fname.c_str()); + s.append("]\n"); + s.append(text.str().c_str()); + fsq_xmt(s); } } @@ -8421,20 +8382,18 @@ void cb_heard_read_file(Fl_Widget *w, void*) string fname = p; if (fname.empty()) return; - fsq_tx_text->add(fsq_selected_call.c_str()); - fsq_tx_text->add("+["); - fsq_tx_text->add(fname.c_str()); - fsq_tx_text->add("]^r"); - start_tx(); - + std::string s = fsq_selected_call.c_str(); + s.append("+["); + s.append(fname.c_str()); + s.append("]^r"); + fsq_xmt(s); } void cb_heard_query_plus(Fl_Widget *w, void *) { - fsq_tx_text->add(fsq_selected_call.c_str()); - fsq_tx_text->add("+"); - fsq_tx_text->add("^r"); - start_tx(); + std::string s = fsq_selected_call.c_str(); + s.append("+"); + fsq_xmt(s); } void cb_heard_send_msg(Fl_Widget *w, void*) @@ -8444,14 +8403,12 @@ void cb_heard_send_msg(Fl_Widget *w, void*) string msg = p; if (msg.empty()) return; - fsq_tx_text->add(fsq_selected_call.c_str()); - fsq_tx_text->add("#["); - fsq_tx_text->add(active_modem->fsq_mycall()); - fsq_tx_text->add("]"); - fsq_tx_text->add(msg.c_str()); - fsq_tx_text->add("^r"); - start_tx(); - + std::string s = fsq_selected_call.c_str(); + s.append("#["); + s.append(active_modem->fsq_mycall()); + s.append("]"); + s.append(msg.c_str()); + fsq_xmt(s); } void cb_heard_send_image(Fl_Widget *w, void *) @@ -8471,6 +8428,7 @@ static const Fl_Menu_Item all_popup[] = { static const Fl_Menu_Item directed_popup[] = { { "Copy", 0, cb_heard_copy, 0 }, + { "Log call", 0, cb_heard_copy_to_log, 0 }, { "Copy All", 0, cb_heard_copy_all, 0 }, { "Delete", 0, cb_heard_delete, 0, FL_MENU_DIVIDER }, { "Query SNR (?)", 0, cb_heard_query_snr, 0 }, diff --git a/src/flarq-src/arqdialogs.cxx b/src/flarq-src/arqdialogs.cxx index 0e96c4f1..47fc6d90 100644 --- a/src/flarq-src/arqdialogs.cxx +++ b/src/flarq-src/arqdialogs.cxx @@ -1,4 +1,4 @@ -// generated by Fast Light User Interface Designer (fluid) version 1.0302 +// generated by Fast Light User Interface Designer (fluid) version 1.0303 #include "arqdialogs.h" #include diff --git a/src/flarq-src/include/arqdialogs.h b/src/flarq-src/include/arqdialogs.h index f106e8c1..55228f97 100644 --- a/src/flarq-src/include/arqdialogs.h +++ b/src/flarq-src/include/arqdialogs.h @@ -1,4 +1,4 @@ -// generated by Fast Light User Interface Designer (fluid) version 1.0302 +// generated by Fast Light User Interface Designer (fluid) version 1.0303 #ifndef arqdialogs_h #define arqdialogs_h diff --git a/src/fsq/fsq-pic.cxx b/src/fsq/fsq-pic.cxx index 7411d582..db4c7cc0 100644 --- a/src/fsq/fsq-pic.cxx +++ b/src/fsq/fsq-pic.cxx @@ -371,28 +371,25 @@ int fsqpic_TxGetPixel(int pos, int color) void cb_fsqpicTransmit( Fl_Widget *w, void *) { - - fsq_tx_text->add(fsq_selected_call.c_str()); + std::string image_txt; + image_txt.assign(fsq_selected_call.c_str()); switch (selfsqpicSize->value()) { - case 0: fsq_tx_text->add("% S"); break; - case 1: fsq_tx_text->add("% L"); break; - case 2: fsq_tx_text->add("% F"); break; - case 3: fsq_tx_text->add("% V"); break; - case 4: fsq_tx_text->add("% P"); break; - case 5: fsq_tx_text->add("% p"); break; - case 6: fsq_tx_text->add("% M"); break; - case 7: fsq_tx_text->add("% m"); break; + case 0: image_txt.append("% S"); break; + case 1: image_txt.append("% L"); break; + case 2: image_txt.append("% F"); break; + case 3: image_txt.append("% V"); break; + case 4: image_txt.append("% P"); break; + case 5: image_txt.append("% p"); break; + case 6: image_txt.append("% M"); break; + case 7: image_txt.append("% m"); break; } - fsq_tx_text->add("^r"); - active_modem->fsq_send_image(); - + active_modem->fsq_send_image(image_txt); } void cb_fsqpicTxSendAbort( Fl_Widget *w, void *) { } - void cb_selfsqpicSize( Fl_Widget *w, void *) { switch (selfsqpicSize->value()) { diff --git a/src/fsq/fsq.cxx b/src/fsq/fsq.cxx index a9dda334..81d296e5 100644 --- a/src/fsq/fsq.cxx +++ b/src/fsq/fsq.cxx @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -55,18 +56,21 @@ using namespace std; #include "fsq_varicode.cxx" -int fsq::symlen = 4096; // nominal symbol length; 3 baud +static int symlen = 4096; // nominal symbol length; 3 baud #define SQLFILT_SIZE 200 #define NIT std::string::npos -const char *fsq::FSQBOL = " \n"; -const char *fsq::FSQEOL = "\n "; -const char *fsq::FSQEOT = " \b "; +static const char *FSQBOL = " \n"; +static const char *FSQEOL = "\n "; +static const char *FSQEOT = " \b "; static const char *fsq_lf = "\n"; static const char *fsq_bot = ""; static const char *fsq_eol = ""; static const char *fsq_eot = ""; +static std::string fsq_string; +static std::string fsq_delayed_string; + #include "fsq-pic.cxx" // nibbles table used for fast conversion from tone difference to symbol @@ -94,35 +98,33 @@ static void init_nibbles() } } -void write_rx_ch(int ch) +// note: +// display_fsq_rx_text and +// display_fsq_mon_text +// use a REQ(...) access to the UI +// it is not necessary to indirectly call either write_rx_mon_char or +// write_mon_tx_char using the REQ access mechanism + +void write_rx_mon_char(int ch) { int ach = ch & 0xFF; if (!progdefaults.fsq_directed) { - display_fsq_rx_text(fsq_ascii[ach], FTextBase::RECV) ; + display_fsq_rx_text(fsq_ascii[ach], FTextBase::FSQ_UND) ; if (ach == '\n') - display_fsq_rx_text(fsq_lf, FTextBase::RECV); + display_fsq_rx_text(fsq_lf, FTextBase::FSQ_UND); } display_fsq_mon_text(fsq_ascii[ach], FTextBase::RECV); - if (ach == '\n') + if (ach == '\n') display_fsq_mon_text(fsq_lf, FTextBase::RECV); } -void write_rx_string(std::string s) -{ - for (size_t n = 0; n < s.length(); n++) { - display_fsq_mon_text(fsq_ascii[s[n] & 0xFF], FTextBase::RECV); - if ((s[n] & 0xFF) == '\n') - display_fsq_mon_text(fsq_lf, FTextBase::RECV); - } -} - -void write_tx_ch(int ch) +void write_mon_tx_char(int ch) { int ach = ch & 0xFF; - display_fsq_mon_text(fsq_ascii[ach], FTextBase::XMIT); - if (ach == '\n') - display_fsq_mon_text(fsq_lf, FTextBase::XMIT); + display_fsq_mon_text(fsq_ascii[ach], FTextBase::FSQ_TX); + if (ach == '\n') + display_fsq_mon_text(fsq_lf, FTextBase::FSQ_TX); } void printit(double speed, int bandwidth, int symlen, int bksize, int peak_hits, int tone) @@ -136,14 +138,7 @@ void printit(double speed, int bandwidth, int symlen, int bksize, int peak_hits, fsq::fsq(trx_mode md) : modem() { -// fsq_frequency = 1;//progdefaults.fsq_frequency; - -// switch (fsq_frequency) { -// case 0: frequency = 1150; modem::set_freq(frequency); break; -// case 1: frequency = 1500; modem::set_freq(frequency); break; -// default: ; -// } - frequency = 1500; modem::set_freq(frequency); + modem::set_freq(1500); mode = md; samplerate = SR; @@ -156,7 +151,7 @@ fsq::fsq(trx_mode md) : modem() for (int i = 0; i < NUMBINS; i++) binfilt[i] = new Cmovavg(movavg_size); spacing = 3; txphase = 0; - basetone = 333; // for 1000 Hz (999) low tone + basetone = 333; picfilter = new C_FIR_filter(); picfilter->init_lowpass(257, 1, 500.0 / samplerate); @@ -187,9 +182,11 @@ fsq::fsq(trx_mode md) : modem() saudit.append(audit_log_fname); audit_log.open(saudit.c_str(), ios::app); - audit_log << "Audit log: " << zdate() << "\n"; + audit_log << "\n==================================================\n"; + audit_log << "Audit log: " << zdate() << ", " << ztime() << "\n"; + audit_log << "==================================================\n"; - TX_IMAGE = false; + fsq_tx_image = false; init_nibbles(); @@ -218,6 +215,7 @@ fsq::~fsq() void fsq::tx_init(SoundBase *sc) { + set_freq(1500); scard = sc; tone = prevtone = 0; txphase = 0; @@ -225,11 +223,12 @@ void fsq::tx_init(SoundBase *sc) mycall = progdefaults.myCall; if (progdefaults.fsq_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); - + videoText(); } void fsq::rx_init() { + set_freq(1500); bandwidth = 33 * spacing * samplerate / FSQ_SYMLEN; bkptr = 0; peak_counter = 0; @@ -263,13 +262,6 @@ void fsq::init() void fsq::set_freq(double f) { -// switch (fsq_frequency) { -// case 0: frequency = 1150; modem::set_freq(frequency); break; -// case 1: frequency = 1500; modem::set_freq(frequency); break; -// case 2: frequency = f; break;// modem::set_freq(frequency); break; -// default: ; -// } - frequency = 1500; modem::set_freq(frequency); basetone = ceil(1.0*(frequency - bandwidth / 2) * FSQ_SYMLEN / samplerate); int incr = basetone % spacing; @@ -306,14 +298,7 @@ void fsq::adjust_for_speed() void fsq::restart() { -// fsq_frequency = 1;//progdefaults.fsq_frequency; -// switch (fsq_frequency) { -// case 0: frequency = 1150; modem::set_freq(frequency); break; -// case 1: frequency = 1500; modem::set_freq(frequency); break; -// default: ; -// } - - frequency = 1500; modem::set_freq(frequency); + modem::set_freq(1500); basetone = ceil(1.0*(frequency - bandwidth / 2) * FSQ_SYMLEN / samplerate); int incr = basetone % spacing; basetone -= incr; @@ -333,22 +318,7 @@ void fsq::restart() printit(speed, bandwidth, symlen, SHIFT_SIZE, peak_hits, basetone); - heard_log.close(); - heard_log_fname = progdefaults.fsq_heard_log; - std::string sheard = TempDir; - sheard.append(heard_log_fname); - heard_log.open(sheard.c_str(), ios::app); - - audit_log.close(); - audit_log_fname = progdefaults.fsq_audit_log; - std::string saudit = TempDir; - saudit.append(audit_log_fname); - audit_log.open(saudit.c_str(), ios::app); - - audit_log << "Audit log: " << zdate() << "\n"; - } -// valid printable character bool fsq::valid_char(int ch) { @@ -364,7 +334,7 @@ bool fsq::valid_char(int ch) //===================================================================== bool fsq::fsq_squelch_open() -{ +{ return ch_sqlch_open || metric >= progStatus.sldrSquelchValue; } @@ -462,7 +432,7 @@ void fsq::parse_rx_text() bool directed = false; p = 0; - + if (rx_text.find(allcall) == 0) { all = true; rx_text.erase(0, 7); @@ -480,10 +450,8 @@ void fsq::parse_rx_text() } if ( (all == false) && (directed == false)) { - rx_text.insert(0,"MONITOR "); - all = true; -// rx_text.clear(); -// return; + rx_text.clear(); + return; } // remove eot @@ -547,12 +515,7 @@ void fsq::parse_rx_text() void fsq::parse_space(bool all) { -std::cout << rx_text << "\n"; - - if (all) - display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::CTRL); - else - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_qmark(std::string relay) @@ -561,7 +524,7 @@ void fsq::parse_qmark(std::string relay) if (!relay.empty()) response.append(";").append(relay); response.append(" snr=").append(szestimate); reply(response); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_dollar(std::string relay) @@ -571,7 +534,7 @@ void fsq::parse_dollar(std::string relay) response.append(" Heard:\n"); response.append(heard_list()); reply(response); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_star() @@ -579,7 +542,7 @@ void fsq::parse_star() REQ(enableSELCAL); reply(std::string(station_calling).append(" ack")); } - + // immediate repeat of msg void fsq::parse_repeat() { @@ -589,7 +552,7 @@ void fsq::parse_repeat() response.assign(" "); response.append(rx_text); reply(response); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } // delayed repeat of msg @@ -601,7 +564,7 @@ void fsq::parse_delayed_repeat() response.assign(" "); response.append(rx_text); delayed_reply(response, 15); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } // extended relay of msg @@ -612,7 +575,7 @@ void fsq::parse_relay() std::string send_txt = rx_text; send_txt.erase(0,1); // remove ';' if (send_txt.empty()) return; - while (send_txt[0] == ' ' && !send_txt.empty()) + while (send_txt[0] == ' ' && !send_txt.empty()) send_txt.erase(0,1); // remove leading spaces // find trigger size_t p = 0; @@ -620,7 +583,7 @@ void fsq::parse_relay() std::string response = string("[").append(station_calling).append("]"); send_txt.insert(p, response); if ((p = send_txt.find('^')) != NIT) send_txt.insert(p, "^"); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); reply(send_txt); } @@ -656,7 +619,7 @@ void fsq::parse_relayed() case ' ' : { std::string response = station_calling; response.append(";").append(relayed).append(rx_text); - display_fsq_rx_text(toprint.append(response).append("\n")); + display_fsq_rx_text(toprint.append(response).append("\n"), FTextBase::FSQ_DIR); } break; case '$' : parse_dollar(relayed); break; case '&' : parse_amp(relayed); break; @@ -706,7 +669,7 @@ void fsq::parse_pound(std::string relay) rxfile << rx_text.substr(p2+1); rxfile.close(); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); @@ -763,7 +726,7 @@ void fsq::parse_plus(std::string relay) void fsq::parse_minus() { - display_fsq_rx_text(toprint.append(rx_text).append(" nia\n")); + display_fsq_rx_text(toprint.append(rx_text).append(" nia\n"), FTextBase::FSQ_DIR); reply(std::string(station_calling).append(" not supported")); } @@ -773,7 +736,7 @@ void fsq::parse_at(std::string relay) if (!relay.empty()) response.append(";").append(relay); response.append(" ").append(progdefaults.myQth); reply(response); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_amp(std::string relay) @@ -782,7 +745,7 @@ void fsq::parse_amp(std::string relay) if (!relay.empty()) response.append(";").append(relay); response.append(" ").append(progdefaults.fsqQTCtext); reply(response); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_carat(std::string relay) @@ -791,7 +754,7 @@ void fsq::parse_carat(std::string relay) if (!relay.empty()) response.append(";").append(relay); response.append(" fldigi ").append(PACKAGE_VERSION); reply(response); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } double maxfreq = 0; @@ -835,7 +798,8 @@ void fsq::parse_pcnt() picf = 0; row = col = rgb = 0; state = IMAGE; - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } static string alert; @@ -854,7 +818,7 @@ void post_alert(void *) void fsq::parse_vline(std::string relay) { if (alert_pending) return; - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); alert = "Message received from "; if (relay.empty()) alert.append(station_calling); else alert.append(relay); @@ -896,7 +860,7 @@ void fsq::parse_greater(std::string relay) progdefaults.fsqbaud = spd; adjust_for_speed(); reply(response); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_less(std::string relay) @@ -921,7 +885,7 @@ void fsq::parse_less(std::string relay) progdefaults.fsqbaud = spd; adjust_for_speed(); reply(response); - display_fsq_rx_text(toprint.append(rx_text).append("\n")); + display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::lf_check(int ch) @@ -990,7 +954,7 @@ void fsq::process_symbol(int sym) } if (fsq_squelch_open()) { - write_rx_ch(curr_ch); + write_rx_mon_char(curr_ch); if (b_bot) display_fsq_mon_text( fsq_bot, FTextBase::CTRL); if (b_eol) { @@ -1242,7 +1206,7 @@ void fsq::send_tone(int tone) prevtone = tone; int send_symlen = symlen; - if (TX_IMAGE) send_symlen = 4096; // must use 3 baud symlen for image xfrs + if (fsq_tx_image) send_symlen = 4096; // must use 3 baud symlen for image xfrs for (int i = 0; i < send_symlen; i++) { outbuf[i] = cos(txphase); @@ -1265,6 +1229,8 @@ void fsq::send_idle() send_symbol(30); } +static bool send_eot = false; + void fsq::send_char(int ch) { if (!ch) return send_idle(); @@ -1276,10 +1242,10 @@ void fsq::send_char(int ch) if (sym2 > 28) send_symbol(sym2); - if (valid_char(ch) && !send_bot) + if (valid_char(ch) && !(send_bot || send_eot)) put_echo_char(ch); - write_tx_ch(ch); + write_mon_tx_char(ch); } void fsq::send_image() @@ -1367,16 +1333,16 @@ void fsq::send_string(std::string s) { for (size_t n = 0; n < s.length(); n++) send_char(s[n]); - if ((s == FSQEOT || s == FSQEOL) && TX_IMAGE) send_image(); + if ((s == FSQEOT || s == FSQEOL) && fsq_tx_image) send_image(); } -void fsq::fsq_send_image() { - TX_IMAGE = true; - start_tx(); +void fsq::fsq_send_image(std::string s) { + fsq_tx_image = true; + fsq_string = std::string("IMAGE:").append(s); + write_fsq_que(fsq_string); + fsq_xmt(s); } -static std::string last_command = ""; - int fsq::tx_process() { if (send_bot) { @@ -1386,41 +1352,48 @@ int fsq::tx_process() send.append(crc.sval(mycall)); send_string(send); send_bot = false; - last_command.clear(); } int c = get_tx_char(); if (c == GET_TX_CHAR_ETX || c == -1) { // end of text or empty tx buffer + send_eot = true; if (progdefaults.fsq_directed) send_string(std::string(FSQEOT)); else send_string(std::string(FSQEOL)); + send_eot = false; put_echo_char('\n'); - REQ(write_tx_ch, '\n'); if (c == -1) REQ(&FTextTX::clear, TransmitText); flush_buffer(); stopflag = false; - TX_IMAGE = false; + fsq_tx_image = false; return -1; } if ( stopflag ) { // aborts transmission static std::string aborted = " !ABORTED!\n"; for (size_t n = 0; n < aborted.length(); n++) put_echo_char(aborted[n]); - TX_IMAGE = false; + fsq_tx_image = false; stopflag = false; return -1; } - last_command += c; send_char(c); return 0; } //============================================================================== -// autoresponse +// delayed transmit //============================================================================== -double fsq::xmtdelay() // in seconds +static pthread_mutex_t fsq_tx_mutex = PTHREAD_MUTEX_INITIALIZER; +static float xmt_repeat_try = 6.0; +static string tx_text_queue = ""; + +static vector commands; +#define NUMCOMMANDS 10 +static size_t next = 0; + +double fsq_xmtdelay() // in seconds { #define MIN_DELAY 50 #define MAX_DELAY 500 @@ -1432,100 +1405,194 @@ double fsq::xmtdelay() // in seconds return delay; } -static float xmt_tries = 6.0; // timeout in nn seconds - void fsq_repeat_last_command() { - fsq_tx_text->add(sz2utf8(last_command).c_str()); + fsq_tx_text->clear(); + fsq_tx_text->addstr(sz2utf8(commands[next].c_str())); + next++; + if (next == commands.size()) next = 0; } -void fsq_transmit_string(std::string s) +int get_fsq_tx_char(void) { - fsq_tx_text->add(sz2utf8(s).c_str()); - start_tx(); -} + guard_lock tx_proc_lock(&fsq_tx_mutex); -void timed_xmt(void *who) -{ - fsq *me = (fsq *)who; - if (me != active_modem) return; + if (tx_text_queue.empty()) return (GET_TX_CHAR_NODATA); - if ((trx_state == STATE_TX || me->fsq_squelch_open()) && xmt_tries > 0) { - float delay = me->xmtdelay(); - xmt_tries -= delay; - if (xmt_tries <= 0) { - std::string failed = "\nTimed out waiting to transmit:\n \""; - failed.append(me->xmt_string).append("\"\n"); - display_fsq_rx_text(failed); - fsq_que_clear(); - return; + int c = tx_text_queue[0]; + tx_text_queue.erase(0,1); + + if (c == GET_TX_CHAR_ETX) { + return c; + } + if (c == -1) + return(GET_TX_CHAR_NODATA); + + if (c == '^') { + c = tx_text_queue[0]; + tx_text_queue.erase(0,1); + + if (c == -1) return(GET_TX_CHAR_NODATA); + + switch (c) { + case 'r': + return(GET_TX_CHAR_ETX); + break; + case 'R': + return(GET_TX_CHAR_ETX); + break; + default: ; } - Fl::repeat_timeout(delay, timed_xmt, me); + } + return(c); +} + +void try_transmit(void *) +{ + if (active_modem != fsq_modem) return; + + if (!active_modem->fsq_squelch_open() && trx_state == STATE_RX) { + next = 0; + fsq_que_clear(); +//LOG_WARN("%s", "start_tx()"); + start_tx(); return; } - fsq_que_clear(); - if (fsq_tx_text->eot()) fsq_transmit_string(me->xmt_string); + + if (xmt_repeat_try > 0) { + xmt_repeat_try -= 0.5; + static char szwaiting[50]; + snprintf(szwaiting, sizeof(szwaiting), "Waiting %4.2f", xmt_repeat_try); + fsq_que_clear(); + write_fsq_que(std::string(szwaiting).append("\n").append(fsq_string)); +//LOG_WARN("%s", szwaiting); + Fl::repeat_timeout(0.5, try_transmit); + return; + } else { + static const char szsquelch[50] = "Squelch open. Transmit timed out!"; + display_fsq_rx_text(string("\n").append(szsquelch).append("\n").c_str(), FTextBase::ALTR); + tx_text_queue.clear(); + fsq_que_clear(); + if (active_modem->fsq_tx_image) active_modem->fsq_tx_image = false; +//LOG_WARN("%s", szsquelch); + return; + } + return; +} + +inline void _fsq_xmt(string s) +{ + tx_text_queue.clear(); + if (commands.size() > NUMCOMMANDS) + commands.pop_back(); + + commands.insert(commands.begin(), 1, s); + s.append("^r"); + tx_text_queue = s; + + xmt_repeat_try = progdefaults.fsq_time_out; + Fl::add_timeout(0.5 + fsq_xmtdelay(), try_transmit); +} + +void fsq_xmt_mt(void *cs = (void *)0) +{ + guard_lock tx_proc_lock(&fsq_tx_mutex); + + if (active_modem != fsq_modem) return; + if (!cs) return; + + string s; + s.assign((char *) cs); + delete (char *) cs; + + if(!s.empty()) { + _fsq_xmt(s); + } +} + +void fsq_xmt(string s) +{ + guard_lock tx_proc_lock(&fsq_tx_mutex); + + if (active_modem != fsq_modem) return; + + if(!s.empty()) { + _fsq_xmt(s); + } +} + +void fsq_transmit(void *a = (void *)0) +{ + guard_lock tx_proc_lock(&fsq_tx_mutex); + + if (active_modem != fsq_modem) return; + + if (!tx_text_queue.empty()) { + size_t p = tx_text_queue.find("^r"); + tx_text_queue.erase(p); + tx_text_queue += ' '; + int nxt = fsq_tx_text->nextChar(); + while (nxt != -1) { + tx_text_queue += nxt; + nxt = fsq_tx_text->nextChar(); + } + commands.erase(commands.begin(), commands.begin()); + commands.insert(commands.begin(), 1, tx_text_queue); + tx_text_queue.append("^r"); + fsq_tx_text->clear(); + return; +//LOG_WARN("A: %s", tx_text_queue.c_str()); + } + + int nxt = fsq_tx_text->nextChar(); + while (nxt != -1) { + tx_text_queue += nxt; + nxt = fsq_tx_text->nextChar(); + } + if (commands.size() > NUMCOMMANDS) + commands.pop_back(); + commands.insert(commands.begin(), 1, tx_text_queue); + tx_text_queue.append("^r"); + fsq_tx_text->clear(); +//LOG_WARN("B: %s", tx_text_queue.c_str()); + + xmt_repeat_try = progdefaults.fsq_time_out; + Fl::add_timeout(0.5 + fsq_xmtdelay(), try_transmit); +} + +void timed_xmt(void *) +{ +//LOG_WARN("%s", fsq_delayed_string.c_str()); + fsq_xmt(fsq_delayed_string); } static float secs = 0; -void fsq_add_tx_timeout(void *who) +void fsq_add_tx_timeout(void *a = 0) { - fsq *me = (fsq *)who; - if (me != active_modem) return; - Fl::add_timeout(secs, timed_xmt, me); + Fl::add_timeout(secs, timed_xmt); } void fsq::reply(std::string s) { - write_fsq_que(std::string("REPLY: ").append(s)); - xmt_string = s; - xmt_string.append("^r"); - xmt_tries = progdefaults.fsq_time_out; - secs = 0.1; - Fl::awake(fsq_add_tx_timeout, this); + fsq_string = std::string("SEND: ").append(s); + write_fsq_que(fsq_string); + char *cs = (char *)0; + cs = new char[s.size() + 1]; + if(!cs) return; + cs[s.size()] = 0; + memcpy(cs, s.c_str(), s.size()); + Fl::awake(fsq_xmt_mt, (void *) cs); } void fsq::delayed_reply(std::string s, int delay) { - write_fsq_que(std::string("DELAYED REPLY: ").append(s)); - xmt_string = s; - xmt_string.append("^r"); - xmt_tries = progdefaults.fsq_time_out; + fsq_string = std::string("DELAYED SEND: ").append(s); + write_fsq_que(fsq_string); + fsq_delayed_string = s; secs = delay; - Fl::awake(fsq_add_tx_timeout, this); -} - -static float try_tries = 6.0; - -void try_transmit(void *who) -{ - fsq *me = (fsq *)who; - if (me != active_modem) return; - - if (trx_state == STATE_TX) { - display_fsq_rx_text("\nWait for Rx!\n", FTextBase::ALTR); - return; - } - if (me->fsq_squelch_open() && try_tries > 0) { - float delay = me->xmtdelay(); - try_tries -= delay; - if (try_tries <= 0) { - display_fsq_rx_text("\nSquelch open. Transmit timed out!\n", FTextBase::ALTR); - return; - } - Fl::repeat_timeout(delay, try_transmit, me); - return; - } - fsq_tx_text->add("^r"); - start_tx(); -} - -void fsq_transmit(void *who) -{ - fsq *me = (fsq *)who; - try_tries = progdefaults.fsq_time_out; - Fl::add_timeout(0, try_transmit, me); + Fl::awake(fsq_add_tx_timeout, 0); +//LOG_WARN("%s : %d", s.c_str(), delay); } //============================================================================== @@ -1566,47 +1633,47 @@ void fsq::stop_aging() //============================================================================== static int sounder_tries = 10; static double sounder_secs = 60; -void sounder(void *who) + +void sounder(void *) { - fsq *me = (fsq *)who; - if (me != active_modem) return; + if (active_modem != fsq_modem) return; if (trx_state == STATE_TX) { - Fl::repeat_timeout(me->xmtdelay(), timed_xmt, me); + Fl::repeat_timeout(active_modem->fsq_xmtdelay(), timed_xmt); return; } - if (me->fsq_squelch_open()) { + if (active_modem->fsq_squelch_open()) { if (--sounder_tries < 0) { - display_fsq_rx_text("\nSounder timed out!\n"); + display_fsq_rx_text("\nSounder timed out!\n", FTextBase::ALTR); sounder_tries = 10; - Fl::repeat_timeout(sounder_secs, sounder, me); + Fl::repeat_timeout(sounder_secs, sounder); return; } - Fl::repeat_timeout(10, sounder, me); // retry in 10 seconds + Fl::repeat_timeout(10, sounder); // retry in 10 seconds return; } - std::string xmtstr = me->FSQBOL; - xmtstr.append(me->mycall).append(":").append(me->FSQEOT); + std::string xmtstr = FSQBOL; + xmtstr.append(active_modem->fsq_mycall()).append(":").append(FSQEOT); int numsymbols = xmtstr.length(); - int xmtsecs = (int)(1.0 * numsymbols * (me->symlen / 4096.0) / me->samplerate); + int xmtsecs = (int)(1.0 * numsymbols * (symlen / 4096.0) / SR); if (fsq_tx_text->eot()) { std::string stime = ztime(); stime.erase(4); stime.insert(2,":"); std::string sndx = "\nSounded @ "; sndx.append(stime); - display_fsq_rx_text(sndx, FTextBase::XMIT); - fsq_tx_text->add("^r"); - start_tx(); + fsq_string = std::string("SOUNDEX:").append(sndx); + write_fsq_que(fsq_string); + fsq_xmt(sndx); } - Fl::repeat_timeout(sounder_secs + xmtsecs, sounder, me); + Fl::repeat_timeout(sounder_secs + xmtsecs, sounder); } -void fsq_start_sounder(void *who) +void fsq_start_sounder() { - fsq *me = (fsq *)who; + if (active_modem != fsq_modem) return; Fl::remove_timeout(sounder); - Fl::add_timeout(sounder_secs, sounder, me); + Fl::add_timeout(sounder_secs, sounder); } void fsq_stop_sounder() @@ -1632,7 +1699,7 @@ void fsq::start_sounder(int interval) case 3: sounder_secs = 1800; break; // 30 minutes default: sounder_secs = 600; } - REQ(fsq_start_sounder, this); + REQ(fsq_start_sounder); } #include "bitmaps.cxx" diff --git a/src/fsq/fsq_monitor.cxx b/src/fsq/fsq_monitor.cxx index 26d104b2..a7fa355c 100644 --- a/src/fsq/fsq_monitor.cxx +++ b/src/fsq/fsq_monitor.cxx @@ -202,6 +202,6 @@ void fsq_que_clear() void write_fsq_que(std::string s) { if (!fsq_que) return; - REQ(&FTextRX::clear, fsq_que); +// REQ(&FTextRX::clear, fsq_que); REQ(&FTextRX::addstr, fsq_que, s, FTextBase::ALTR); } diff --git a/src/include/FTextView.h b/src/include/FTextView.h index 015ca60e..36629520 100644 --- a/src/include/FTextView.h +++ b/src/include/FTextView.h @@ -43,6 +43,7 @@ public: // CLICK_START: same as first clickable style // NATTR: number of styles (last style + 1) enum TEXT_ATTR { RECV, XMIT, CTRL, SKIP, ALTR, + FSQ_TX, FSQ_DIR, FSQ_UND, CLICK_START, QSY = CLICK_START, /* FOO, BAR, ..., */ NATTR }; diff --git a/src/include/confdialog.h b/src/include/confdialog.h index 95a5f536..f0225cd0 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -327,6 +327,10 @@ extern Fl_Button *btn_select_auditlog; extern Fl_Output *txtHeardLog; extern Fl_Light_Button *btn_enable_fsq_heard_log; extern Fl_Button *btn_select_fsq_heard_log; +extern Fl_Button *btn_fsq_xmt_color; +extern Fl_Button *btn_fsq_directed_color; +extern Fl_Button *btn_fsq_undirected_color; +extern Fl_Button *btn_fsq_color_defaults; extern Fl_Group *tabMT63; extern Fl_Check_Button *btnMT63_8bit; extern Fl_Check_Button *btnMT63_rx_integration; diff --git a/src/include/configuration.h b/src/include/configuration.h index b6db73ae..b42caf59 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -678,6 +678,15 @@ ELEM_(std::string, fsq_audit_log, "FSQ_AUDIT_LOG", \ "FSQ audit log pathname", \ "fsq_audit_log.txt") \ + ELEM_(Fl_Color, fsq_xmt_color, "FSQXMTCOLOR", \ + "Color for FSQ xmt text", \ + FL_RED) \ + ELEM_(Fl_Color, fsq_directed_color, "FSQDIRECTEDCOLOR", \ + "Color for FSQ directed text", \ + FL_BLUE) \ + ELEM_(Fl_Color, fsq_undirected_color, "FSQUNDIRECTEDCOLOR", \ + "Color for FSQ undirected text", \ + FL_DARK_GREEN) \ /* Waterfall & UI */ \ ELEM_(uchar, red, "", "", 0) \ ELEM_(uchar, green, "", "", 255) \ diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index 34ecd38a..2f98cf3e 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -188,6 +188,8 @@ extern void clear_heard_list(); extern void age_heard_list(); extern void add_to_heard_list(std::string, std::string); extern void fsq_transmit_string(std::string s); +extern void fsq_xmt_mt(void *s); +extern void fsq_xmt(std::string s); extern void fsq_repeat_last_heard(); extern void fsq_repeat_last_command(); extern void display_fsq_rx_text(std::string text, int style = FTextBase::SKIP); @@ -429,6 +431,7 @@ extern bool xml_get_record(const char *); extern const char* zdate(void); extern const char* ztime(void); +extern void ztimer(void* first_call); extern void setTabColors(); diff --git a/src/include/fsq.h b/src/include/fsq.h index 4d1b0d11..db6b9e1b 100644 --- a/src/include/fsq.h +++ b/src/include/fsq.h @@ -45,9 +45,7 @@ class fsq : public modem { #define SHIFT_SIZE (FSQ_SYMLEN / 16) #define NUMBINS 142 -//#define FSQBOL " \n" -//#define FSQEOL "\n " -//#define FSQEOT " \b " + enum STATE {TEXT, IMAGE}; friend void timed_xmt(void *); @@ -55,13 +53,10 @@ friend void sounder(void *); friend void aging(void *); friend void fsq_add_tx_timeout(void *); friend void fsq_stop_aging(); -friend void fsq_start_sounder(void *); -friend void fsq_stop_sounder(); friend void try_transmit(void *); friend void fsq_transmit(void *); public: -static int symlen; protected: // Rx @@ -130,8 +125,6 @@ protected: void send_idle (); void send_symbol(int sym); void send_tone(int tone); - std::string xmt_string; - double xmtdelay(); void reply(std::string); void delayed_reply(std::string, int delay); void send_ack(std::string relay = ""); @@ -168,10 +161,6 @@ protected: bool valid_char(int); - static const char *FSQBOL; - static const char *FSQEOL; - static const char *FSQEOT; - STATE state; public: @@ -185,7 +174,7 @@ public: int tx_process (); - const char *fsq_mycall() { return mycall.c_str(); } + std::string fsq_mycall() { return mycall; } bool fsq_squelch_open(); @@ -193,7 +182,6 @@ public: private: double amplitude; double pixel; - bool TX_IMAGE; unsigned char tx_pixel; int tx_pixelnbr; int image_mode; @@ -221,7 +209,7 @@ public: int TXspp; void recvpic(double smpl); void send_image(); - void fsq_send_image(); + void fsq_send_image(std::string s); }; diff --git a/src/include/modem.h b/src/include/modem.h index 725aab6d..1e993110 100644 --- a/src/include/modem.h +++ b/src/include/modem.h @@ -150,11 +150,6 @@ public: virtual void send_color_image(std::string) {} virtual void send_Grey_image(std::string) {} - virtual void fsq_send_image(){} - virtual const char *fsq_mycall() {return "";} - virtual bool fsq_squelch_open() {return false;} - virtual void fsq_transmit(void *) {} - void set_stopflag(bool b) { stopflag = b;}; bool get_stopflag() const { return stopflag; }; @@ -251,7 +246,15 @@ public: virtual double track_freq() { return 0;} // fsq mode - virtual void send_ack(std::string relay) {}; + bool fsq_tx_image; + std::string xmt_string; + virtual double fsq_xmtdelay() {return 0;}; + virtual void send_ack(std::string relay) {}; + virtual void fsq_send_image(std::string s){} + virtual std::string fsq_mycall() {return "";} + virtual bool fsq_squelch_open() {return false;} + virtual void fsq_transmit(void *) {} + }; extern modem *null_modem; diff --git a/src/main.cxx b/src/main.cxx index cec7287a..d72f63f8 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -357,6 +357,9 @@ int main(int argc, char ** argv) // for KISS_IO status information program_start_time = time(0); + // ztimer must be run by FLTK's timeout handler + ztimer((void*)true); + active_modem = new NULLMODEM; string appdir = appname = argv[0]; diff --git a/src/widgets/FTextRXTX.cxx b/src/widgets/FTextRXTX.cxx index f3bcfc39..710c8f8a 100644 --- a/src/widgets/FTextRXTX.cxx +++ b/src/widgets/FTextRXTX.cxx @@ -693,9 +693,9 @@ const char* FTextRX::dxcc_lookup_call(int x, int y) QRB::qrb(lon1, lat1, lon2, lat2, &distance, &azimuth) == QRB::QRB_OK) { if (progdefaults.us_units) { stip << "QTE " << fixed << setprecision(0) << azimuth << '\260' << " (" - << QRB::azimuth_long_path(azimuth) << '\260' << ") QRB " + << QRB::azimuth_long_path(azimuth) << '\260' << ") QRB " << distance * 0.62168188 << "mi"<< " (" << - QRB::distance_long_path(distance) * 0.62168188 << + QRB::distance_long_path(distance) * 0.62168188 << "mi)\n"; } else { @@ -811,7 +811,7 @@ int FTextTX::handle(int event) case FL_KEYBOARD: if (active_modem->get_mode() == MODE_FSQ) { if (Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter) { - fsq_transmit(active_modem); + fsq_transmit(0); return 1; } } diff --git a/src/widgets/FTextView.cxx b/src/widgets/FTextView.cxx index 42aa77e7..e890509a 100644 --- a/src/widgets/FTextView.cxx +++ b/src/widgets/FTextView.cxx @@ -469,6 +469,10 @@ void FTextBase::reset_styles(int set) set_style(CTRL, FL_HELVETICA, FL_NORMAL_SIZE, FL_DARK_GREEN, set); set_style(SKIP, FL_HELVETICA, FL_NORMAL_SIZE, FL_BLUE, set); set_style(ALTR, FL_HELVETICA, FL_NORMAL_SIZE, FL_DARK_MAGENTA, set); + set_style(FSQ_TX, FL_HELVETICA, FL_NORMAL_SIZE, FL_RED, set); + set_style(FSQ_DIR, FL_HELVETICA, FL_NORMAL_SIZE, FL_BLUE, set); + set_style(FSQ_UND, FL_HELVETICA, FL_NORMAL_SIZE, FL_DARK_GREEN, set); + } // ---------------------------------------------------------------------------- From 0606d1a34affffe3227d448a44e6832a751fc8c1 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 3 Sep 2015 13:15:26 -0500 Subject: [PATCH 002/138] Doxygen help * Update to doxgen to 1.8.10 - Corrected various doxygen parse errors --- fldigi_doxygen/user_src_docs/FSQ.txt | 22 +++++++++++----------- fldigi_doxygen/user_src_docs/configFSQ.txt | 8 ++++---- fldigi_doxygen/user_src_docs/configPSK.txt | 1 + 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/fldigi_doxygen/user_src_docs/FSQ.txt b/fldigi_doxygen/user_src_docs/FSQ.txt index 72dd9471..6611426b 100644 --- a/fldigi_doxygen/user_src_docs/FSQ.txt +++ b/fldigi_doxygen/user_src_docs/FSQ.txt @@ -58,12 +58,13 @@ can be resized vertically by dragging the dividing bar which separates them. \image latex fsq-undirected-mode.png "Undirected Mode" width=1.5in + \image html fsq-directed-mode.png "Directed Mode" \image latex fsq-directed-mode.png "Directed Mode" width=1.5in - + The Rx-text panel displays only recognized text in the Directed Mode. The text @@ -73,8 +74,8 @@ and your sending case must match the senders case, i.e. w1hkj and W1HKJ are not the same for the purposes of FSQ Directed Mode. fldigi-FSQ is active and will respond to directed triggers when the SELCAL button is lit. -Toggling the SELCAL button to "sleep" causes the FSQ parser to only respond to the -∗ trigger. When the ∗ trigger is received the program will return to +Toggling the SELCAL button to "sleep" causes the FSQ parser to only respond to the * +trigger. When the * trigger is received the program will return to the active SELCAL state.
@@ -391,7 +392,6 @@ This list shows all the reserved characters, and their current or planned use. Blank entries are reserved, with no currently planned application.
- CHAR | ASCII | USE :-----:|:-----:|:-------------------------------------------: Space | 32 | Directed chat @@ -426,8 +426,8 @@ _ | 95 | Report the squelch setting in dB (1) \| | 124 | Send Alert } | 125 | -- ~ | 126 | Delayed Repeat command -
(1) not supported +
\section fsq_commands Commands @@ -445,13 +445,13 @@ The syntax for currently defined commands is listed below.
  • callsign text Addressee station starts to print text. No trigger character used except space following callsign. You MUST use a space or the trigger will not be recognised.
  • callsign? text (Is station hearing me?) Addressee station starts to print text. When squelch closes, station responds: origin_callsign snr=xxdB -
  • callsign\* Switches station to ACTIVE if FSQSEL is in SLEEP. Addressee station starts to print. When squelch closes, station responds: callsign: Active -
  • callsign! message (Repeat my message) Addressee station starts to print. When squelch closes, station responds: callsign: message. This is a simple relay mechanism. message may contain further trigger commands. -
  • callsign~ message (Repeat my message later) Addressee station starts to print. When squelch closes, after a delay of about 15 seconds, station responds: callsign: message This delayed relay is useful when stations mentioned in message can hear and respond to the original message. +
  • callsign\* Switches station to ACTIVE if FSQSEL is in SLEEP. Addressee station starts to print. When squelch closes, station responds: callsign:CRC-VAL Active +
  • callsign! message (Repeat my message) Addressee station starts to print. When squelch closes, station responds: callsign:CRC-VAL message. This is a simple relay mechanism. message may contain further trigger commands. +
  • callsign~ message (Repeat my message later) Addressee station starts to print. When squelch closes, after a delay of about 15 seconds, station responds: callsign:CRC-VAL message This delayed relay is useful when stations mentioned in message can hear and respond to the original message.
  • callsign; [relay_to]{trigger}{message} Relay my message to the 'relay_to' station. See Relay section for details.
  • callsign!sendto message Relay message to the 'sendto' station. Addressee station starts to print. When squelch closes, station relays the message. -
  • callsign#[nnn] (Send file to station) Addressee station starts to print. Text following [nnn] will be saved in or appended to text file nnn.txt in the same folder as the log/audit files. When squelch closes, station responds callsign: Ack if the message stored OK. There is no response if the message was not received. [nnn] can be alpha, numeric or mixed. -
  • callsign#[filename.txt] (Send file to station) Addressee station starts to print. File is opened from menu, and filename appended to message before file body text, File will be saved in or appended to text file filename.txt in the same folder as the log/audit files. When squelch closes, station responds callsign: if the message stored OK. There is no response if the message was not received. [nnn] can be alpha, numeric or mixed. +
  • callsign#[nnn] (Send file to station) Addressee station starts to print. Text following [nnn] will be saved in or appended to text file nnn.txt in the same folder as the log/audit files. When squelch closes, station responds callsign:CRC-VAL Ack if the message stored OK. There is no response if the message was not received. [nnn] can be alpha, numeric or mixed. +
  • callsign#[filename.txt] (Send file to station) Addressee station starts to print. File is opened from menu, and filename appended to message before file body text, File will be saved in or appended to text file filename.txt in the same folder as the log/audit files. When squelch closes, station responds callsign:CRC-VAL if the message stored OK. There is no response if the message was not received. [nnn] can be alpha, numeric or mixed.
  • callsign\@ (Request station position or location information) Addressee station starts to print. When squelch closes, station responds with pre-recorded sentence, typically containing QTH information. This could be GPS position, locator, or physical address. This is the message stored and retreived by the QTH button.
  • callsign& (Request station message) Addressee station starts to print. When squelch closes, station responds with pre-recorded sentence, typically containing station information or an 'Out to Lunch' message. This is the message stored by the QTC button.
  • callsign^ (Request Software Version) Addressee station starts to print. When squelch closes, station responds with current FSQCALL software version. @@ -469,7 +469,7 @@ If the speed is already at the maximum or minimum speed, the response is the sam and there is no speed change.
  • allcall#[nnn] (Send file to all stations) All stations within range start to print. Text following [nnn] will be saved in or appended to text file nnn.txt. When -squelch closes, station responds callsign: Ack if the message stored OK. There +squelch closes, station responds callsign:CRC-VAL Ack if the message stored OK. There is no response if the message was not received. allcall#[filename.txt] works the same as callsign#[filename.txt].
diff --git a/fldigi_doxygen/user_src_docs/configFSQ.txt b/fldigi_doxygen/user_src_docs/configFSQ.txt index 60c787a9..cd563d6a 100644 --- a/fldigi_doxygen/user_src_docs/configFSQ.txt +++ b/fldigi_doxygen/user_src_docs/configFSQ.txt @@ -63,19 +63,19 @@ are located in the fldigi temp folder: - + - + - + - + diff --git a/fldigi_doxygen/user_src_docs/configPSK.txt b/fldigi_doxygen/user_src_docs/configPSK.txt index 74082182..ade60207 100644 --- a/fldigi_doxygen/user_src_docs/configPSK.txt +++ b/fldigi_doxygen/user_src_docs/configPSK.txt @@ -43,6 +43,7 @@ This table shows the amount of transmit power used by the pilot tone dB | -20 | -26 | -29 | -32 | -36 | -40 :------:|:----:|:----:|:----:|:----:|:----:|:---- Pwr Lvl | 10% | 5% | 3.5% | 2.5% | 1.6% | 1.0% +
\ref signal_browser_page "Signal Browser" From db696170c8d0b1f73d656c5742436e319414f3b2 Mon Sep 17 00:00:00 2001 From: David Freese Date: Mon, 27 Jul 2015 08:25:38 -0500 Subject: [PATCH 003/138] LSB modes * Add recognition of flrig LSB modes - adjust waterfall for LSB - correct logging frequency for LSB --- src/dialogs/confdialog.cxx | 1 + src/dialogs/confdialog.fl | 2 +- src/include/rigsupport.h | 2 ++ src/rigcontrol/rigio.cxx | 7 +------ src/rigcontrol/rigsupport.cxx | 16 +++++++++++++++- src/waterfall/waterfall.cxx | 29 ++++++++++++++--------------- 6 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index 8d3ad6e2..c71f002c 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -10579,6 +10579,7 @@ gured on the\n\"Notifications\" configure dialog.")); { Fl_Group* o = new Fl_Group(55, 151, 490, 60, _("K3 A1A configuation")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); + o->hide(); { Fl_Check_Button* o = btnCWIsLSB = new Fl_Check_Button(270, 172, 70, 15, _("CW is LSB")); btnCWIsLSB->tooltip(_("Select this for Elecraft K3\nOther radios should not need it.")); btnCWIsLSB->down_box(FL_DOWN_BOX); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 8bcc9dd7..2637b7b7 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -5889,7 +5889,7 @@ OFF - keep current wf cursor position} xywh {65 112 348 20} down_box DOWN_BOX va } Fl_Group {} { label {K3 A1A configuation} open - xywh {55 151 490 60} box ENGRAVED_FRAME align 21 + xywh {55 151 490 60} box ENGRAVED_FRAME align 21 hide } { Fl_Check_Button btnCWIsLSB { label {CW is LSB} diff --git a/src/include/rigsupport.h b/src/include/rigsupport.h index 9b5e777a..b6079175 100644 --- a/src/include/rigsupport.h +++ b/src/include/rigsupport.h @@ -63,6 +63,8 @@ extern bool readRigXML(); extern bool init_Xml_RigDialog(); extern bool init_NoRig_RigDialog(); +extern bool ModeIsLSB(std::string); + #if USE_HAMLIB extern bool init_Hamlib_RigDialog(); extern void selMode(rmode_t m); diff --git a/src/rigcontrol/rigio.cxx b/src/rigcontrol/rigio.cxx index ae38383f..18ecb4e2 100644 --- a/src/rigcontrol/rigio.cxx +++ b/src/rigcontrol/rigio.cxx @@ -1271,13 +1271,8 @@ void rigCAT_set_qsy(long long f) } #endif -bool ModeIsLSB(const string& s) +bool ModeIsLSB(string s) { - if (nonCATrig) { - if (s == "LSB" || s == "PKTLSB" || s == "CW" || s == "RTTY") - return true; - return false; - } list::iterator pM = LSBmodes.begin(); while (pM != LSBmodes.end() ) { if (*pM == s) diff --git a/src/rigcontrol/rigsupport.cxx b/src/rigcontrol/rigsupport.cxx index 04f61edc..ad50163a 100644 --- a/src/rigcontrol/rigsupport.cxx +++ b/src/rigcontrol/rigsupport.cxx @@ -478,11 +478,25 @@ bool init_NoRig_RigDialog() for (size_t i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) { qso_opMODE->add(modes[i].name); } +// list of LSB type modes that various xcvrs report via flrig LSBmodes.clear(); LSBmodes.push_back("LSB"); - LSBmodes.push_back("CWR"); + LSBmodes.push_back("LSB-D"); + LSBmodes.push_back("LSB-D1"); + LSBmodes.push_back("LSB-D2"); + LSBmodes.push_back("LSB-D3"); + LSBmodes.push_back("CW"); + LSBmodes.push_back("LCW"); + LSBmodes.push_back("CW-N"); + LSBmodes.push_back("CWL"); LSBmodes.push_back("RTTY"); + LSBmodes.push_back("RTTY-L"); LSBmodes.push_back("PKTLSB"); + LSBmodes.push_back("PKT-L"); + LSBmodes.push_back("USER-L"); + LSBmodes.push_back("DATA-L"); + LSBmodes.push_back("DATA"); + LSBmodes.push_back("D-LSB"); qso_opMODE->index(0); qso_opMODE->activate(); diff --git a/src/waterfall/waterfall.cxx b/src/waterfall/waterfall.cxx index 59721168..44056fef 100644 --- a/src/waterfall/waterfall.cxx +++ b/src/waterfall/waterfall.cxx @@ -70,6 +70,7 @@ #include "rtty.h" #include "flslider2.h" #include "debug.h" +#include "rigsupport.h" using namespace std; @@ -648,28 +649,27 @@ void WFdisp::sig_data( double *sig, int len, int sr ) update_freq: static char szFrequency[14]; if (active_modem && rfc != 0) { // use a boolean for the waterfall - int cwoffset = 0; - int rttyoffset = 0; + int offset = 0; + double afreq = active_modem->get_txfreq(); trx_mode mode = active_modem->get_mode(); if (mode == MODE_RTTY && progdefaults.useMARKfreq) { - rttyoffset = (progdefaults.rtty_shift < rtty::numshifts ? + offset = (progdefaults.rtty_shift < rtty::numshifts ? rtty::SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); - rttyoffset /= 2; - if (active_modem->get_reverse()) rttyoffset *= -1; + offset /= 2; + if (active_modem->get_reverse()) offset *= -1; } string testmode = qso_opMODE->value(); - if (testmode == "CW" or testmode == "CWR") { - cwoffset = progdefaults.CWsweetspot; - usb = ! (progdefaults.CWIsLSB ^ (testmode == "CWR")); - } + usb = !ModeIsLSB(testmode); + if (testmode.find("CW") != string::npos) + afreq = 0;//-progdefaults.CWsweetspot; if (mode == MODE_ANALYSIS) { dfreq = active_modem->track_freq(); } else { if (usb) - dfreq = rfc + active_modem->get_txfreq() - cwoffset + rttyoffset; + dfreq = rfc + afreq + offset; else - dfreq = rfc - active_modem->get_txfreq() + cwoffset - rttyoffset; + dfreq = rfc - afreq - offset; } snprintf(szFrequency, sizeof(szFrequency), "%-.3f", dfreq / 1000.0); } else { @@ -803,10 +803,9 @@ void WFdisp::drawScale() { else { int cwoffset = 0; string testmode = qso_opMODE->value(); - if (testmode == "CW" or testmode == "CWR") { - cwoffset = ( progdefaults.CWOffset ? progdefaults.CWsweetspot : 0 ); - usb = ! (progdefaults.CWIsLSB ^ (testmode == "CWR")); - } + usb = !ModeIsLSB(testmode); + if (testmode.find("CW") != string::npos) + cwoffset = progdefaults.CWsweetspot; if (usb) fr = (rfc - (rfc%500))/1000.0 + 0.5*i - cwoffset/1000.0; else From 670479756fc18d6b2a53e6e893937eade6c4255f Mon Sep 17 00:00:00 2001 From: David Freese Date: Mon, 27 Jul 2015 10:47:51 -0500 Subject: [PATCH 004/138] Nu opBW combos --- src/dialogs/fl_digi.cxx | 140 +++++++++++++---- src/include/fl_digi.h | 14 +- src/include/rigsupport.h | 4 + src/rigcontrol/rigsupport.cxx | 33 +++- src/rigcontrol/xmlrpc_rig.cxx | 275 ++++++++++++++++++++++------------ 5 files changed, 334 insertions(+), 132 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index ab70c2c3..f9e76cc3 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -303,8 +303,14 @@ Fl_Button *btnQRZ; static Fl_Button *qsoClear; Fl_Button *qsoSave; cFreqControl *qsoFreqDisp = (cFreqControl *)0; +Fl_Group *qso_combos = (Fl_Group *)0; Fl_ComboBox *qso_opMODE = (Fl_ComboBox *)0; +Fl_Group *qso_opGROUP = (Fl_Group *)0; Fl_ComboBox *qso_opBW = (Fl_ComboBox *)0; +Fl_Button *qso_btnBW1 = (Fl_Button *)0; +Fl_ComboBox *qso_opBW1 = (Fl_ComboBox *)0; +Fl_Button *qso_btnBW2 = (Fl_Button *)0; +Fl_ComboBox *qso_opBW2 = (Fl_ComboBox *)0; Fl_Button *qso_opPICK = (Fl_Button *)0; Fl_Input2 *inpFreq; @@ -3716,13 +3722,11 @@ void toggle_smeter() if (progStatus.meters && !smeter->visible()) { pwrmeter->hide(); smeter->show(); - qso_opMODE->hide(); - qso_opBW->hide(); + qso_combos->hide(); } else if (!progStatus.meters && smeter->visible()) { pwrmeter->hide(); smeter->hide(); - qso_opMODE->show(); - qso_opBW->show(); + qso_combos->show(); } RigControlFrame->redraw(); } @@ -4457,16 +4461,25 @@ void show_frequency(long long freq) REQ(_show_frequency, freq); } -void show_mode(const string& sMode) +void show_mode(const string sMode) { REQ(&Fl_ComboBox::put_value, qso_opMODE, sMode.c_str()); } -void show_bw(const string& sWidth) +void show_bw(const string sWidth) { REQ(&Fl_ComboBox::put_value, qso_opBW, sWidth.c_str()); } +void show_bw1(const string sVal) +{ + REQ(&Fl_ComboBox::put_value, qso_opBW1, sVal.c_str()); +} + +void show_bw2(const string sVal) +{ + REQ(&Fl_ComboBox::put_value, qso_opBW2, sVal.c_str()); +} void show_spot(bool v) { @@ -4675,6 +4688,8 @@ void LOGGING_colors_font() // combo boxes combo_color_font(qso_opMODE); combo_color_font(qso_opBW); + combo_color_font(qso_opBW1); + combo_color_font(qso_opBW2); fl_digi_main->redraw(); @@ -5169,33 +5184,94 @@ void create_fl_digi_main_primary() { set_smeter_colors(); smeter->hide(); - qso_opMODE = new Fl_ComboBox( - smeter->x(), smeter->y(), mode_cbo_w, Hentry); - qso_opMODE->box(FL_DOWN_BOX); - qso_opMODE->color(FL_BACKGROUND2_COLOR); - qso_opMODE->selection_color(FL_BACKGROUND_COLOR); - qso_opMODE->labeltype(FL_NORMAL_LABEL); - qso_opMODE->labelfont(0); - qso_opMODE->labelsize(14); - qso_opMODE->labelcolor(FL_FOREGROUND_COLOR); - qso_opMODE->callback((Fl_Callback*)cb_qso_opMODE); - qso_opMODE->align(FL_ALIGN_TOP); - qso_opMODE->when(FL_WHEN_RELEASE); - qso_opMODE->end(); + qso_combos = new Fl_Group( + qsoFreqDisp1->x(), qsoFreqDisp1->y() + qsoFreqDisp1->h() + pad, + smeter_w, Hentry); + qso_combos->box(FL_FLAT_BOX); - qso_opBW = new Fl_ComboBox( - qso_opMODE->x() + mode_cbo_w + pad, smeter->y(), bw_cbo_w, Hentry); - qso_opBW->box(FL_DOWN_BOX); - qso_opBW->color(FL_BACKGROUND2_COLOR); - qso_opBW->selection_color(FL_BACKGROUND_COLOR); - qso_opBW->labeltype(FL_NORMAL_LABEL); - qso_opBW->labelfont(0); - qso_opBW->labelsize(14); - qso_opBW->labelcolor(FL_FOREGROUND_COLOR); - qso_opBW->callback((Fl_Callback*)cb_qso_opBW); - qso_opBW->align(FL_ALIGN_TOP); - qso_opBW->when(FL_WHEN_RELEASE); - qso_opBW->end(); + qso_opMODE = new Fl_ComboBox( + smeter->x(), smeter->y(), mode_cbo_w, Hentry); + qso_opMODE->box(FL_DOWN_BOX); + qso_opMODE->color(FL_BACKGROUND2_COLOR); + qso_opMODE->selection_color(FL_BACKGROUND_COLOR); + qso_opMODE->labeltype(FL_NORMAL_LABEL); + qso_opMODE->labelfont(0); + qso_opMODE->labelsize(14); + qso_opMODE->labelcolor(FL_FOREGROUND_COLOR); + qso_opMODE->callback((Fl_Callback*)cb_qso_opMODE); + qso_opMODE->align(FL_ALIGN_TOP); + qso_opMODE->when(FL_WHEN_RELEASE); + qso_opMODE->end(); + + qso_opBW = new Fl_ComboBox( + qso_opMODE->x() + mode_cbo_w + pad, + smeter->y(), + bw_cbo_w, Hentry); + qso_opBW->box(FL_DOWN_BOX); + qso_opBW->color(FL_BACKGROUND2_COLOR); + qso_opBW->selection_color(FL_BACKGROUND_COLOR); + qso_opBW->labeltype(FL_NORMAL_LABEL); + qso_opBW->labelfont(0); + qso_opBW->labelsize(14); + qso_opBW->labelcolor(FL_FOREGROUND_COLOR); + qso_opBW->callback((Fl_Callback*)cb_qso_opBW); + qso_opBW->align(FL_ALIGN_TOP); + qso_opBW->when(FL_WHEN_RELEASE); + qso_opBW->end(); + + qso_opGROUP = new Fl_Group( + qso_opMODE->x() + mode_cbo_w + pad, + smeter->y(), + bw_cbo_w, Hentry); + qso_opGROUP->box(FL_FLAT_BOX); + + qso_btnBW1 = new Fl_Button( + qso_opGROUP->x(), qso_opGROUP->y(), + qso_opGROUP->h() * 3 / 4, qso_opGROUP->h()); + qso_btnBW1->callback((Fl_Callback*)cb_qso_btnBW1); + + qso_opBW1 = new Fl_ComboBox( + qso_btnBW1->x()+qso_btnBW1->w(), qso_btnBW1->y(), + qso_opGROUP->w() - qso_btnBW1->w(), qso_btnBW1->h()); + qso_opBW1->box(FL_DOWN_BOX); + qso_opBW1->color(FL_BACKGROUND2_COLOR); + qso_opBW1->selection_color(FL_BACKGROUND_COLOR); + qso_opBW1->labeltype(FL_NORMAL_LABEL); + qso_opBW1->labelfont(0); + qso_opBW1->labelsize(14); + qso_opBW1->labelcolor(FL_FOREGROUND_COLOR); + qso_opBW1->callback((Fl_Callback*)cb_qso_opBW1); + qso_opBW1->align(FL_ALIGN_TOP); + qso_opBW1->when(FL_WHEN_RELEASE); + qso_opBW1->end(); + + qso_btnBW1->hide(); + qso_opBW1->hide(); + + qso_btnBW2 = new Fl_Button( + qso_opGROUP->x(), qso_opGROUP->y(), + qso_opGROUP->h() * 3 / 4, qso_opGROUP->h()); + qso_btnBW2->callback((Fl_Callback*)cb_qso_btnBW2); + + qso_opBW2 = new Fl_ComboBox( + qso_btnBW2->x()+qso_btnBW2->w(), qso_btnBW2->y(), + qso_opGROUP->w() - qso_btnBW2->w(), qso_btnBW2->h()); + qso_opBW2->box(FL_DOWN_BOX); + qso_opBW2->color(FL_BACKGROUND2_COLOR); + qso_opBW2->selection_color(FL_BACKGROUND_COLOR); + qso_opBW2->labeltype(FL_NORMAL_LABEL); + qso_opBW2->labelfont(0); + qso_opBW2->labelsize(14); + qso_opBW2->labelcolor(FL_FOREGROUND_COLOR); + qso_opBW2->callback((Fl_Callback*)cb_qso_opBW2); + qso_opBW2->align(FL_ALIGN_TOP); + qso_opBW2->when(FL_WHEN_RELEASE); + qso_opBW2->end(); + + qso_opGROUP->end(); + qso_opGROUP->hide(); + + qso_combos->end(); Fl_Button *smeter_toggle = new Fl_Button( qso_opBW->x() + qso_opBW->w() + pad, smeter->y(), Wbtn, Hentry); diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index 2f98cf3e..9e9db411 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -120,8 +120,14 @@ extern Fl_Group *QsoInfoFrame1B; extern Fl_Group *qsoFrameView; extern Fl_Group *QsoInfoFrame; extern cFreqControl *qsoFreqDisp; +extern Fl_Group *qso_combos; extern Fl_ComboBox *qso_opMODE; +extern Fl_Group *qso_opGROUP; extern Fl_ComboBox *qso_opBW; +extern Fl_Button *qso_btnBW1; +extern Fl_ComboBox *qso_opBW1; +extern Fl_Button *qso_btnBW2; +extern Fl_ComboBox *qso_opBW2; extern Fl_Button *qso_opPICK; extern Fl_Browser *qso_opBrowser; @@ -308,8 +314,12 @@ extern void put_Status1(const char *msg, double timeout = 0.0, status_timeout ac extern void put_Status2(const char *msg, double timeout = 0.0, status_timeout action = STATUS_CLEAR); extern void show_frequency(long long); -extern void show_mode(const std::string& mode); -extern void show_bw(const std::string& sWidth); + +extern void show_mode(const std::string sMode); +extern void show_bw(const std::string sWidth); +extern void show_bw1(const std::string sVal); +extern void show_bw2(const std::string sVal); + extern void show_spot(bool v); extern void showMacroSet(); extern void setwfrange(); diff --git a/src/include/rigsupport.h b/src/include/rigsupport.h index b6079175..07db8819 100644 --- a/src/include/rigsupport.h +++ b/src/include/rigsupport.h @@ -47,6 +47,10 @@ extern void buildlist(); extern void qso_movFreq(Fl_Widget* w, void*); extern int cb_qso_opMODE(); extern int cb_qso_opBW(); +extern int cb_qso_btnBW1(); +extern int cb_qso_opBW1(); +extern int cb_qso_btnBW2(); +extern int cb_qso_opBW2(); extern void qso_setMode(); extern void setTitle(); diff --git a/src/rigcontrol/rigsupport.cxx b/src/rigcontrol/rigsupport.cxx index ad50163a..04e8a87e 100644 --- a/src/rigcontrol/rigsupport.cxx +++ b/src/rigcontrol/rigsupport.cxx @@ -330,9 +330,38 @@ int cb_qso_opMODE() int cb_qso_opBW() { if (progdefaults.chkUSERIGCATis) -// if (!progdefaults.chkUSEXMLRPCis) rigCAT_setwidth(qso_opBW->value()); - set_flrig_bw(qso_opBW->index()); + set_flrig_bw(qso_opBW->index(), -1); + return 0; +} + +int cb_qso_btnBW1() +{ + qso_btnBW1->hide(); + qso_opBW1->hide(); + qso_btnBW2->show(); + qso_opBW2->show(); + return 0; +} + +int cb_qso_btnBW2() +{ + qso_btnBW2->hide(); + qso_opBW2->hide(); + qso_btnBW1->show(); + qso_opBW1->show(); + return 0; +} + +int cb_qso_opBW1() +{ + set_flrig_bw(qso_opBW2->index(), qso_opBW1->index()); + return 0; +} + +int cb_qso_opBW2() +{ + set_flrig_bw(qso_opBW2->index(), qso_opBW1->index()); return 0; } diff --git a/src/rigcontrol/xmlrpc_rig.cxx b/src/rigcontrol/xmlrpc_rig.cxx index bcc67996..58003445 100644 --- a/src/rigcontrol/xmlrpc_rig.cxx +++ b/src/rigcontrol/xmlrpc_rig.cxx @@ -107,7 +107,8 @@ void xmlrpc_rig_set_qsy(long long rfc) wf->rfcarrier(rfc); wf->movetocenter(); show_frequency(rfc); -if (XMLRPC_DEBUG) std::cout << "set qsy: " << rfc << "\n"; + if (XMLRPC_DEBUG) + LOG_INFO("set qsy: %d", (int)rfc); } //====================================================================== @@ -132,7 +133,8 @@ void set_flrig_ptt(int on) { wait_ptt = true; wait_ptt_timeout = 10; ptt_state = on; -if (XMLRPC_DEBUG) std::cout << "ptt: " << on << "\n"; + if (XMLRPC_DEBUG) + LOG_INFO("ptt: %s", on ? "ON" : "OFF"); } else { wait_ptt = false; wait_ptt_timeout = 0; @@ -159,7 +161,8 @@ void flrig_get_ptt() ptt_state = val; guard_lock flrig_lock(&mutex_flrig_ptt); Fl::awake(xmlrpc_rig_show_ptt, reinterpret_cast(val) ); -if (XMLRPC_DEBUG) std::cout << "get_ptt: " << ptt_state << "\n"; + if (XMLRPC_DEBUG) + LOG_INFO("get_ptt: %s", ptt_state ? "ON" : "OFF"); } else if (wait_ptt && (val == ptt_state)) { wait_ptt = false; wait_ptt_timeout = 0; @@ -172,7 +175,7 @@ if (XMLRPC_DEBUG) std::cout << "get_ptt: " << ptt_state << "\n"; connected_to_flrig = false; wait_ptt = false; wait_ptt_timeout = 5; -if (XMLRPC_DEBUG) std::cout << "get_ptt failed!\n"; + LOG_ERROR("%s", "get_ptt failed!"); } } @@ -200,7 +203,8 @@ void set_flrig_freq(long int fr) wait_freq = true; wait_freq_timeout = 5; xcvr_freq = fr; -if (XMLRPC_DEBUG) std::cout << "set freq: " << xcvr_freq << "\n"; + if (XMLRPC_DEBUG) + LOG_INFO("set freq: %d", (int)fr); } } @@ -228,7 +232,8 @@ void flrig_get_frequency() xcvr_freq = fr; guard_lock flrig_lock(&mutex_flrig_freq); Fl::awake(xmlrpc_rig_show_freq, reinterpret_cast(fr)); -if (XMLRPC_DEBUG) std::cout << "get freq: " << xcvr_freq << "\n"; + if (XMLRPC_DEBUG) + LOG_INFO("get freq: %d", fr); } else if (wait_freq && (fr == xcvr_freq)) { wait_freq = false; wait_freq_timeout = 0; @@ -240,7 +245,7 @@ if (XMLRPC_DEBUG) std::cout << "get freq: " << xcvr_freq << "\n"; connected_to_flrig = false; wait_freq = false; wait_freq_timeout = 5; -if (XMLRPC_DEBUG) std::cout << "get freq failed\n"; + LOG_ERROR("%s", "get freq failed"); } } @@ -253,6 +258,12 @@ bool wait_mode = false; // wait for transceiver to respond int wait_mode_timeout = 5; // 5 polls and then disable wait string posted_mode = ""; +bool wait_bw = false; // wait for transceiver to respond +int wait_bw_timeout = 5; // 5 polls and then disable wait +string posted_bw = ""; +string posted_bw1 = ""; +string posted_bw2 = ""; + void set_flrig_mode(const char *md) { if (!connected_to_flrig) return; @@ -270,7 +281,7 @@ void set_flrig_mode(const char *md) bws_posted = false; wait_mode = true; wait_mode_timeout = 5; -if (XMLRPC_DEBUG) std::cout << "set mode: " << posted_mode << "\n"; + if (XMLRPC_DEBUG) LOG_INFO("set mode: %s", md); } } @@ -296,7 +307,8 @@ void flrig_get_mode() posted_mode = md; guard_lock flrig_lock(&mutex_flrig_mode); Fl::awake(xmlrpc_rig_post_mode, reinterpret_cast(&md)); -if (XMLRPC_DEBUG) std::cout << "get mode: " << posted_mode << "\n"; + if (XMLRPC_DEBUG) + LOG_INFO("get mode: %s", md.c_str()); } else if (wait_mode && posted) { wait_mode = false; wait_mode_timeout = 0; @@ -308,7 +320,7 @@ if (XMLRPC_DEBUG) std::cout << "get mode: " << posted_mode << "\n"; connected_to_flrig = false; wait_mode = false; wait_freq_timeout = 0; -if (XMLRPC_DEBUG) std::cout << "get mode failed\n"; + LOG_ERROR("%s", "get mode failed"); } } @@ -331,7 +343,8 @@ void xmlrpc_rig_post_modes(void *) for (int i = 0; i < nargs; i++) { qso_opMODE->add(string(modes_result[i]).c_str()); -if (XMLRPC_DEBUG) std::cout << "post mode: " << string(modes_result[i]) << "\n"; + if (XMLRPC_DEBUG) + LOG_INFO("post mode: %s", string(modes_result[i]).c_str()); } qso_opMODE->index(0); @@ -347,7 +360,9 @@ void flrig_get_modes() if (flrig_client->execute("rig.get_modes", XmlRpcValue(), modes_result, timeout) ) { guard_lock flrig_lock(&mutex_flrig_modes); Fl::awake(xmlrpc_rig_post_modes); -if (XMLRPC_DEBUG) std::cout << "get modes\n"; + posted_mode = posted_bw = posted_bw1 = posted_bw2 = "GETME"; + if (XMLRPC_DEBUG) + LOG_INFO("%s", "get modes"); } } @@ -355,73 +370,90 @@ if (XMLRPC_DEBUG) std::cout << "get modes\n"; // transceiver get / set bandwidth // transceiver get bandwidth table //---------------------------------------------------------------------- -bool wait_bw = false; // wait for transceiver to respond -int wait_bw_timeout = 5; // 5 polls and then disable wait -string posted_bw = ""; -void set_flrig_bw(int bw1, int bw2) +void set_flrig_bw(int bw2, int bw1) { if (!connected_to_flrig) return; XmlRpcValue val, result; - val = 256*bw2 + bw1; + int ival = bw2; + if (bw1 > 0) ival = 256*(bw1+128) + bw2; + val = ival; guard_lock flrig_lock(&mutex_flrig); + if (XMLRPC_DEBUG) + LOG_INFO("set_flrig_bw %04X", ival); if (!flrig_client->execute("rig.set_bw", val, result, timeout)) { LOG_ERROR("%s", "rig.set_bw failed"); wait_bw = false; wait_bw_timeout = 0; } else { - posted_bw = qso_opBW->value(); wait_bw = true; wait_bw_timeout = 5; -if (XMLRPC_DEBUG) std::cout << "set bw: " << posted_bw << "\n"; } } pthread_mutex_t mutex_flrig_bw = PTHREAD_MUTEX_INITIALIZER; -void xmlrpc_rig_post_bw(void *data) +void xmlrpc_rig_post_bw(void *) { guard_lock flrig_lock(&mutex_flrig_bw); if (!qso_opBW) return; - string *s = reinterpret_cast(data); - size_t p = s->find("|"); - if (p != string::npos) s->erase(p); - - qso_opBW->value(s->c_str()); + qso_opBW->value(posted_bw.c_str()); qso_opBW->redraw(); } +void xmlrpc_rig_post_bw1(void *) +{ + guard_lock flrig_lock(&mutex_flrig_bw); + if (!qso_opBW1) return; + + qso_opBW1->value(posted_bw1.c_str()); + qso_opBW1->redraw(); +} + +void xmlrpc_rig_post_bw2(void *) +{ + guard_lock flrig_lock(&mutex_flrig_bw); + if (!qso_opBW2) return; + + qso_opBW2->value(posted_bw2.c_str()); + qso_opBW2->redraw(); +} + void flrig_get_bw() { guard_lock flrig_lock(&mutex_flrig); XmlRpcValue res; + if (wait_bw_timeout) { + wait_bw_timeout--; + return; + } + if (flrig_client->execute("rig.get_bw", XmlRpcValue(), res, timeout) ) { static string s1; static string s2; - s1 = string(res[0]); - s2 = string(res[1]); - - bool posted = ((s1 == posted_bw)); - if (!wait_bw && !posted) { - posted_bw = s1; - guard_lock flrig_lock(&mutex_flrig_bw); - Fl::awake(xmlrpc_rig_post_bw, reinterpret_cast(&s1)); -if (XMLRPC_DEBUG) std::cout << "get bw: " << posted_bw << "\n"; - } else if (wait_bw && !posted) { - wait_bw = false; - wait_bw_timeout = 0; - } else if (wait_bw_timeout == 0) { - wait_bw = false; - } else if (wait_bw_timeout) - --wait_bw_timeout; + s2 = string(res[0]); + s1 = string(res[1]); + if (XMLRPC_DEBUG) + LOG_INFO("s1 %s, s2 %s", s1.c_str(), s2.c_str()); + if (!s1.empty()) { + posted_bw1 = s1; + Fl::awake(xmlrpc_rig_post_bw1); + posted_bw2 = s2; + Fl::awake(xmlrpc_rig_post_bw2); + } else { + if (!s2.empty()) { + posted_bw = s2; + Fl::awake(xmlrpc_rig_post_bw); + } + } + wait_bw_timeout = 0; } else { connected_to_flrig = false; - wait_bw = false; wait_bw_timeout = 0; -if (XMLRPC_DEBUG) std::cout << "get bw failed!\n"; + LOG_ERROR("%s", "get bw failed!"); } } @@ -433,61 +465,111 @@ void xmlrpc_rig_post_bws(void *) int nargs; - try { - nargs = bws_result[0].size(); + try { // two BW controls + nargs = bws_result[1].size(); - qso_opBW->clear(); -if (XMLRPC_DEBUG) std::cout << "cleared bw combo\n"; + static string bwstr; + qso_opBW1->clear(); + for (int i = 1; i < nargs; i++) { + bwstr = string(bws_result[1][i]); + qso_opBW1->add(bwstr.c_str()); + } - if (nargs == 0) { + string labels1 = bws_result[1][0]; + static char btn1_label[2]; + btn1_label[0] = labels1[0]; btn1_label[1] = 0; + qso_btnBW1->label(btn1_label); + qso_btnBW1->redraw_label(); + qso_btnBW1->redraw(); + static char tooltip1[20]; + snprintf(tooltip1,sizeof(tooltip1),"%s",labels1.substr(2).c_str()); + qso_opBW1->tooltip(tooltip1); + qso_opBW1->index(0); + qso_opBW1->redraw(); + + if (XMLRPC_DEBUG) { + static string debugstr = "opBW1:\n"; + for (int i = 0; i < nargs-1; i++) + debugstr.append(string(bws_result[1][i])).append(", "); + debugstr.append(string(bws_result[1][nargs - 1])).append("\n"); + debugstr.append(labels1).append("\n"); + debugstr.append("btn1 '").append(btn1_label); + debugstr.append("' tip '").append(tooltip1); + LOG_INFO("%s", debugstr.c_str()); + } + + try { + nargs = bws_result[0].size(); + + static string bwstr; + qso_opBW2->clear(); + for (int i = 1; i < nargs; i++) { + bwstr = string(bws_result[0][i]); + qso_opBW2->add(bwstr.c_str()); + } + + string labels2 = bws_result[0][0]; + static char btn2_label[2]; + btn2_label[0] = labels2[0]; btn2_label[1] = 0; + qso_btnBW2->label(btn2_label); + qso_btnBW2->redraw_label(); + qso_btnBW2->redraw(); + static char tooltip2[20]; + snprintf(tooltip2,sizeof(tooltip2),"%s",labels2.substr(2).c_str()); + qso_opBW2->tooltip(tooltip1); + qso_opBW2->index(0); + qso_opBW2->redraw(); + + if (XMLRPC_DEBUG) { + static string debugstr = "opBW2:\n"; + for (int i = 0; i < nargs-1; i++) + debugstr.append(string(bws_result[0][i])).append(", "); + debugstr.append(string(bws_result[0][nargs - 1])).append("\n"); + debugstr.append(labels2).append("\n"); + debugstr.append("btn2 '").append(btn2_label); + debugstr.append("' tip '").append(tooltip2); + LOG_INFO("%s", debugstr.c_str()); + } + + } catch ( XmlRpcException err) { + bws_posted = false; + return; + } + qso_opBW->hide(); + qso_opGROUP->show(); + bws_posted = true; + return; + } catch (XmlRpcException err) { + try { // one BW control + nargs = bws_result[0].size(); + string bwstr; + qso_opBW->clear(); + for (int i = 1; i < nargs; i++) { + bwstr = string(bws_result[0][i]); + qso_opBW->add(bwstr.c_str()); + } + qso_opBW->index(0); + qso_opBW->activate(); + qso_opBW->tooltip("xcvr bandwidth"); + qso_opBW->show(); + qso_opGROUP->hide(); + + if (XMLRPC_DEBUG) { + static string debugstr = "BW:\n"; + for (int i = 0; i < nargs-1; i++) + debugstr.append(string(bws_result[0][i])).append(", "); + debugstr.append(string(bws_result[0][nargs - 1])); + LOG_INFO("%s", debugstr.c_str()); + } + + } catch (XmlRpcException err) { + LOG_ERROR("%s", "no bandwidths specified"); qso_opBW->add(""); qso_opBW->index(0); qso_opBW->deactivate(); return; } - - string bwstr; - for (int i = 1; i < nargs; i++) { - bwstr = string(bws_result[0][i]); - qso_opBW->add(bwstr.c_str()); -if (XMLRPC_DEBUG) std::cout << "added bw: " << bwstr << "\n"; - } - - qso_opBW->index(0); - qso_opBW->activate(); - - qso_opBW->tooltip("xcvr bandwidth"); - - } catch (XmlRpcException err) { - ; } -/* - string label; - size_t p; -// add later - try { - nargs = bws_result[1].size(); - if (nargs > 1) { - label = string(bws_result[1][0]); - if ( (p = label.find("|")) != string::npos) - label.erase(0, p + 1); - bw2Label->value(label.c_str()); - for (int i = 1; i < nargs; i++) { - bw2->add(string(bws_result[1][i]).c_str()); - } - bw2Label->redraw(); - bw2->activate(); - } else - bw2->add(""); - } catch (XmlRpcException err) { - bw2->deactivate(); - } - bw1->redraw_label(); - bw1->redraw(); - bw2->redraw_label(); - bw2->redraw(); -*/ - bws_posted = true; } @@ -502,9 +584,10 @@ void flrig_get_bws() posted_bw.clear(); // guard_lock flrig_lock(&mutex_flrig_bws); Fl::awake(xmlrpc_rig_post_bws); -if (XMLRPC_DEBUG) std::cout << "get bws\n"; + if (XMLRPC_DEBUG) + LOG_INFO("%s", "get bws"); } else { -if (XMLRPC_DEBUG) std::cout << "get bws failed\n"; + LOG_ERROR("%s", "get bws failed"); } } @@ -716,7 +799,7 @@ bool flrig_get_xcvr() // xmlrpc read polling thread //====================================================================== bool run_flrig_thread = true; -int poll_interval = 100; // milliseconds +int poll_interval = 1000; // 100 // milliseconds //---------------------------------------------------------------------- // Set QSY to true if xmlrpc client connection is OK @@ -751,7 +834,7 @@ void flrig_connection() Fl::awake(flrig_setQSY); } else { connected_to_flrig = false; - poll_interval = 500; + poll_interval = 1000;//500; } } catch (...) {} } @@ -778,7 +861,7 @@ void connect_to_flrig() void * flrig_thread_loop(void *d) { for(;;) { - MilliSleep( poll_interval );//progStatus.poll_interval); + MilliSleep(poll_interval );//progStatus.poll_interval); if (!run_flrig_thread) break; @@ -806,7 +889,7 @@ void * flrig_thread_loop(void *d) void FLRIG_start_flrig_thread() { flrig_thread = new pthread_t; - poll_interval = 500; + poll_interval = 1000; if (pthread_create(flrig_thread, NULL, flrig_thread_loop, NULL)) { LOG_ERROR("%s", "flrig_thread create"); exit(EXIT_FAILURE); From 2df24b8f68e4ab9514a38506988668b7600872a7 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 30 Aug 2015 14:50:04 -0500 Subject: [PATCH 005/138] MS Read logbook * change to "rb" for correct reading of logbook file - do not allow M$ to make changes to CR/LF counts --- src/logbook/adif_io.cxx | 30 +++++++++++++++--------------- src/logbook/qso_db.cxx | 12 +++++++----- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/logbook/adif_io.cxx b/src/logbook/adif_io.cxx index 8b82d633..5570d669 100644 --- a/src/logbook/adif_io.cxx +++ b/src/logbook/adif_io.cxx @@ -185,7 +185,9 @@ void cAdifIO::fillfield (int fieldnum, char *buff) { char *p1 = strchr(buff, ':'); char *p2 = strchr(buff, '>'); - if (!p1 || !p2 || p2 < p1) return; // bad ADIF specifier ---> no ':' after field name + if (!p1 || !p2 || p2 < p1) { + return; // bad ADIF specifier ---> no ':' after field name + } p1++; int fldsize = 0; @@ -195,13 +197,14 @@ void cAdifIO::fillfield (int fieldnum, char *buff) } p1++; } + string tmp = ""; + tmp.assign(p2+1, fldsize); if ((fieldnum == TIME_ON || fieldnum == TIME_OFF) && fldsize < 6) { - string tmp = ""; - tmp.assign(p2+1, fldsize); while (tmp.length() < 6) tmp += '0'; adifqso->putField(fieldnum, tmp.c_str(), 6); - } else + } else { adifqso->putField (fieldnum, p2+1, fldsize); + } } static void write_rxtext(const char *s) @@ -212,12 +215,11 @@ static void write_rxtext(const char *s) void cAdifIO::do_readfile(const char *fname, cQsoDb *db) { long filesize = 0; - char *buff; int found; static char szmsg[200]; // open the adif file - FILE *adiFile = fopen (fname, "r"); + FILE *adiFile = fopen (fname, "rb"); if (adiFile == NULL) return; @@ -234,14 +236,16 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) return; } - buff = new char[filesize + 1]; + char buff[filesize + 1]; // read the entire file into the buffer fseek (adiFile, 0, SEEK_SET); - int retval = fread (buff, filesize, 1, adiFile); + int retval = fread (buff, 1, filesize, adiFile); + fclose (adiFile); - if (retval != 1) { + + if (retval != filesize) { snprintf(szmsg, sizeof(szmsg), _("Error reading %s"), fname); REQ(write_rxtext, "\n"); REQ(write_rxtext, szmsg); @@ -257,7 +261,6 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) REQ(write_rxtext, szmsg); REQ(write_rxtext, "\n"); LOG_INFO("%s", szmsg); - delete [] buff; db->clearDatabase(); return; } @@ -276,7 +279,6 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) p1 = strchr(p1+1, '<'); // find next <> field } if (!p1) { - delete [] buff; snprintf(szmsg, sizeof(szmsg), "Corrupt logbook file: %s", fname); REQ(write_rxtext, "\n"); REQ(write_rxtext, szmsg); @@ -288,7 +290,6 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) } p2 = strchr(p1,'<'); // find first ADIF specifier -// adifqso.clearRec(); adifqso = 0; while (p2) { @@ -302,7 +303,6 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) p1 = p2 + 1; p2 = strchr(p1,'<'); } - delete [] buff; #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); @@ -346,7 +346,7 @@ int cAdifIO::writeFile (const char *fname, cQsoDb *db) // open the adif file cQsoRec *rec; string sFld; - adiFile = fopen (fname, "w"); + adiFile = fopen (fname, "wb"); if (!adiFile) return 1; @@ -483,7 +483,7 @@ void cAdifIO::do_writelog() Ccrc16 checksum; string s_checksum; - adiFile = fopen (adif_file_name.c_str(), "w"); + adiFile = fopen (adif_file_name.c_str(), "wb"); if (!adiFile) { LOG_ERROR("Cannot write to %s", adif_file_name.c_str()); diff --git a/src/logbook/qso_db.cxx b/src/logbook/qso_db.cxx index 20f0e8a6..1fc0246d 100644 --- a/src/logbook/qso_db.cxx +++ b/src/logbook/qso_db.cxx @@ -161,8 +161,10 @@ void cQsoRec::trimFields () { } } +static const char *empty_field = ""; + const char * cQsoRec::getField (int n) const { - if (n < 0 || n >= NUMFIELDS) return 0; + if (n < 0 || n >= NUMFIELDS) return empty_field; return (qsofield[n].c_str()); } @@ -387,22 +389,22 @@ void cQsoDb::qsoUpdRec (int rnbr, cQsoRec *updrec) { void cQsoDb::SortByDate (bool how) { date_off = how; compby = COMPDATE; - qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); +// qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } void cQsoDb::SortByCall () { compby = COMPCALL; - qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); +// qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } void cQsoDb::SortByMode () { compby = COMPMODE; - qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); +// qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } void cQsoDb::SortByFreq () { compby = COMPFREQ; - qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); +// qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } bool cQsoDb::qsoIsValidFile(const char *fname) { From d4b6308ab931c6f81147a011d105234a472ffe09 Mon Sep 17 00:00:00 2001 From: David Freese Date: Mon, 31 Aug 2015 21:29:53 -0500 Subject: [PATCH 006/138] QSO rec * Changed qsorec data store to an arrary of string pointers vice an array of strings. - new mxe implementation string handler changes from standard gnu string template --- src/include/qso_db.h | 2 +- src/logbook/qso_db.cxx | 76 ++++++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/src/include/qso_db.h b/src/include/qso_db.h index 85814777..8917595a 100644 --- a/src/include/qso_db.h +++ b/src/include/qso_db.h @@ -45,7 +45,7 @@ friend std::ostream &operator<<( std::ostream &, const cQsoRec &); friend std::istream &operator>>( std::istream &, cQsoRec & ); private: - string qsofield[NUMFIELDS]; + string *qsofield[NUMFIELDS]; //bool normal; // sort ordering public: cQsoRec (); diff --git a/src/logbook/qso_db.cxx b/src/logbook/qso_db.cxx index 1fc0246d..c9cd066d 100644 --- a/src/logbook/qso_db.cxx +++ b/src/logbook/qso_db.cxx @@ -42,16 +42,20 @@ static bool date_off = true; bool cQsoDb::reverse = false; cQsoRec::cQsoRec() { - for (int i=0;i < NUMFIELDS; i++) - qsofield[i] = ""; + for (int i=0;i < NUMFIELDS; i++) { + qsofield[i] = new string; + qsofield[i]->clear(); + } } cQsoRec::~cQsoRec () { + for (int i = 0; i < NUMFIELDS; i++) + delete qsofield[i]; } void cQsoRec::clearRec () { for (int i = 0; i < NUMFIELDS; i++) - qsofield[i].clear(); + qsofield[i]->clear(); } int cQsoRec::validRec() { @@ -59,27 +63,27 @@ int cQsoRec::validRec() { } void cQsoRec::checkBand() { - size_t flen = qsofield[FREQ].length(), blen = qsofield[BAND].length(); + size_t flen = qsofield[FREQ]->length(), blen = qsofield[BAND]->length(); if (flen == 0 && blen != 0) { for (size_t n = 0; n < blen; n++) - qsofield[BAND][n] = tolower(qsofield[BAND][n]); - qsofield[FREQ] = band_freq(qsofield[BAND].c_str()); + (*qsofield[BAND])[n] = tolower((*qsofield[BAND])[n]); + *qsofield[FREQ] = band_freq((*qsofield[BAND]).c_str()); } else if (blen == 0 && flen != 0) - qsofield[BAND] = band_name(qsofield[FREQ].c_str()); + *qsofield[BAND] = band_name((*qsofield[FREQ]).c_str()); } void cQsoRec::checkDateTimes() { - size_t len1 = qsofield[TIME_ON].length(), len2 = qsofield[TIME_OFF].length(); + size_t len1 = qsofield[TIME_ON]->length(), len2 = qsofield[TIME_OFF]->length(); if (len1 == 0 && len2 != 0) - qsofield[TIME_ON] = qsofield[TIME_OFF]; + *qsofield[TIME_ON] = *qsofield[TIME_OFF]; else if (len1 != 0 && len2 == 0) - qsofield[TIME_OFF] = qsofield[TIME_ON]; - len1 = qsofield[QSO_DATE].length(); - len2 = qsofield[QSO_DATE_OFF].length(); + *qsofield[TIME_OFF] = *qsofield[TIME_ON]; + len1 = qsofield[QSO_DATE]->length(); + len2 = qsofield[QSO_DATE_OFF]->length(); if (len1 == 0 && len2 != 0) - qsofield[QSO_DATE] = qsofield[QSO_DATE_OFF]; + *qsofield[QSO_DATE] = *qsofield[QSO_DATE_OFF]; else if (len1 != 0 && len2 == 0) - qsofield[QSO_DATE_OFF] = qsofield[QSO_DATE]; + *qsofield[QSO_DATE_OFF] = *qsofield[QSO_DATE]; } // Sets the current time, with the right format. @@ -122,24 +126,24 @@ void cQsoRec::setFrequency(long long freq) { void cQsoRec::putField (int n, const char *s){ if (n < 0 || n >= NUMFIELDS) return; - qsofield[n] = s; + qsofield[n]->assign(s);// = s; } void cQsoRec::putField (int n, const char *s, int len) { if (n < 0 || n >= NUMFIELDS) return; - qsofield[n].assign(s, len); + qsofield[n]->assign(s, len); } void cQsoRec::addtoField (int n, const char *s){ if (n < 0 || n >= NUMFIELDS) return; - qsofield[n].append(s); + qsofield[n]->append(s); } void cQsoRec::trimFields () { size_t p; string s; for (int i = 0; i < NUMFIELDS; i++) { - s = qsofield[i]; + s = *qsofield[i]; //right trim string p = s.length(); while (p && s[p-1] == ' ') { @@ -157,7 +161,7 @@ void cQsoRec::trimFields () { for (p = 0; p < s.length(); p++) s[p] = toupper(s[p]); } - qsofield[i] = s; + *qsofield[i] = s; } } @@ -165,33 +169,33 @@ static const char *empty_field = ""; const char * cQsoRec::getField (int n) const { if (n < 0 || n >= NUMFIELDS) return empty_field; - return (qsofield[n].c_str()); + return (qsofield[n]->c_str()); } const cQsoRec &cQsoRec::operator=(const cQsoRec &right) { if (this != &right) { for (int i = 0; i < NUMFIELDS; i++) - this->qsofield[i] = right.qsofield[i]; + (this->qsofield[i])->assign(*(right.qsofield[i])); } return *this; } int compareTimes (const cQsoRec &r1, const cQsoRec &r2) { if (date_off) - return r1.qsofield[TIME_OFF].compare( r2.qsofield[TIME_OFF] ); - return r1.qsofield[TIME_ON].compare( r2.qsofield[TIME_ON] ); + return (*r1.qsofield[TIME_OFF]).compare( (*r2.qsofield[TIME_OFF]) ); + return (*r1.qsofield[TIME_ON]).compare( (*r2.qsofield[TIME_ON]) ); } int compareDates (const cQsoRec &r1, const cQsoRec &r2) { if (date_off) - return r1.qsofield[QSO_DATE_OFF].compare( r2.qsofield[QSO_DATE_OFF] ); - return r1.qsofield[QSO_DATE].compare( r2.qsofield[QSO_DATE] ); + return (*r1.qsofield[QSO_DATE_OFF]).compare( (*r2.qsofield[QSO_DATE_OFF]) ); + return (*r1.qsofield[QSO_DATE]).compare( (*r2.qsofield[QSO_DATE]) ); } int compareCalls (const cQsoRec &r1, const cQsoRec &r2) { int cmp = 0; - const char * s1 = r1.qsofield[CALL].c_str(); - const char * s2 = r2.qsofield[CALL].c_str(); + const char * s1 = (*r1.qsofield[CALL]).c_str(); + const char * s2 = (*r2.qsofield[CALL]).c_str(); const char * p1 = strpbrk (s1+1, "0123456789"); const char * p2 = strpbrk (s2+1, "0123456789"); @@ -208,13 +212,13 @@ int compareCalls (const cQsoRec &r1, const cQsoRec &r2) { } int compareModes (const cQsoRec &r1, const cQsoRec &r2) { - return r1.qsofield[MODE].compare( r2.qsofield[MODE] ); + return (r1.qsofield[MODE])->compare( *r2.qsofield[MODE] ); } int compareFreqs (const cQsoRec &r1, const cQsoRec &r2) { double f1, f2; - f1 = atof(r1.qsofield[FREQ].c_str()); - f2 = atof(r2.qsofield[FREQ].c_str()); + f1 = atof(r1.qsofield[FREQ]->c_str()); + f2 = atof(r2.qsofield[FREQ]->c_str()); return (f1 == f2 ? 0 : f1 < f2 ? -1 : 1); } @@ -280,7 +284,7 @@ static bool isVer3 = false; ostream &operator<< (ostream &output, const cQsoRec &rec) { for (int i = 0; i < EXPORT; i++) - output << rec.qsofield[i].c_str() << delim_out; + output << rec.qsofield[i]->c_str() << delim_out; return output; } @@ -288,7 +292,7 @@ istream &operator>> (istream &input, cQsoRec &rec ) { static char buf[1024]; // Must be big enough for a field. for (int i = 0; i < NUMFIELDS; i++) { input.getline( buf, sizeof(buf), delim_in ); - rec.qsofield[i] = buf ; + *rec.qsofield[i] = buf ; } return input; } @@ -389,22 +393,22 @@ void cQsoDb::qsoUpdRec (int rnbr, cQsoRec *updrec) { void cQsoDb::SortByDate (bool how) { date_off = how; compby = COMPDATE; -// qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); + qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } void cQsoDb::SortByCall () { compby = COMPCALL; -// qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); + qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } void cQsoDb::SortByMode () { compby = COMPMODE; -// qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); + qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } void cQsoDb::SortByFreq () { compby = COMPFREQ; -// qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); + qsort (qsorec, nbrrecs, sizeof (cQsoRec), compareqsos); } bool cQsoDb::qsoIsValidFile(const char *fname) { From c82de8e39c462c7eca80517cbfb910cda2e1c32b Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 10 Sep 2015 06:42:10 -0500 Subject: [PATCH 007/138] MXE update * code changes for update to mxe suite --- scripts/builddist.sh | 56 +++++++++++++++++++++++++++++++++++ scripts/buildmxe.sh | 24 +++++++++++++++ scripts/mknsisinst.sh | 4 +-- src/Makefile.am | 4 +++ src/include/dxcc.h | 11 +++++++ src/include/socket.h | 1 + src/include/threads.h | 4 +++ src/include/timeops.h | 7 +++-- src/logbook/lookupcall.cxx | 2 +- src/logbook/table.cxx | 4 +-- src/misc/dxcc.cxx | 18 +++++++---- src/rigcontrol/xmlrpc_rig.cxx | 9 +++++- src/spot/pskrep.cxx | 5 ++-- src/xmlrpcpp/XmlRpcSocket.cpp | 2 +- 14 files changed, 134 insertions(+), 17 deletions(-) create mode 100755 scripts/builddist.sh create mode 100755 scripts/buildmxe.sh diff --git a/scripts/builddist.sh b/scripts/builddist.sh new file mode 100755 index 00000000..313d5b65 --- /dev/null +++ b/scripts/builddist.sh @@ -0,0 +1,56 @@ +#!/bin/bash +#=============================================================================== +# linux binaries no longer created +#=============================================================================== + +#------------------------------------------------------------------------------- +# make the mxe-mingw32 executable +#------------------------------------------------------------------------------- + +autoreconf + +rm -f fldigi*$1* + +make clean + +./configure \ + $PKGCFG \ + $CROSSCFG \ + --without-asciidoc \ + --with-ptw32=$PREFIX/i686-w64-mingw32.static \ + --with-libiconv-prefix=$PREFIX/iconv \ + --enable-static \ + --with-libintl-prefix=$PREFIX/gettext \ + PTW32_LIBS="-lpthread -lpcreposix -lpcre -lregex" \ + FLTK_CONFIG=$PREFIX/bin/i686-w64-mingw32.static-fltk-config \ + +make + +$PREFIX/bin/i686-w64-mingw32.static-strip src/fldigi.exe +$PREFIX/bin/i686-w64-mingw32.static-strip src/flarq.exe + +make nsisinst + +mv src/*setup.exe . +ls -l *setup.exe + +make clean + +#------------------------------------------------------------------------------- +# build the distribution tarball +#------------------------------------------------------------------------------- + +./configure --without-asciidoc + +make distcheck + +make clean + +git co po/de.po +git co po/es.po +git co po/fr.po +git co po/it.po +git co po/pl.po +git co po/nl.po +git co po/fldigi.pot +git co src/dialogs/guide.cxx diff --git a/scripts/buildmxe.sh b/scripts/buildmxe.sh new file mode 100755 index 00000000..fc1c6457 --- /dev/null +++ b/scripts/buildmxe.sh @@ -0,0 +1,24 @@ +#!/bin/bash +#======================================================================= +# make the mxe-mingw32 executable + +./configure \ + $PKGCFG \ + $CROSSCFG \ + --without-asciidoc \ + --with-ptw32=$PREFIX/i686-w64-mingw32.static \ + --with-libiconv-prefix=$PREFIX/iconv \ + --enable-static \ + --with-libintl-prefix=$PREFIX/gettext \ + PTW32_LIBS="-lpthread -lpcreposix -lpcre -lregex" \ + FLTK_CONFIG=$PREFIX/bin/i686-w64-mingw32.static-fltk-config \ + +make + +$PREFIX/bin/i686-w64-mingw32.static-strip src/fldigi.exe +$PREFIX/bin/i686-w64-mingw32.static-strip src/flarq.exe + +make nsisinst + +mv src/*setup.exe . +ls -l *setup.exe diff --git a/scripts/mknsisinst.sh b/scripts/mknsisinst.sh index a36d6b16..3467344a 100755 --- a/scripts/mknsisinst.sh +++ b/scripts/mknsisinst.sh @@ -42,11 +42,11 @@ if test "x$WANT_FLDIGI" != "xyes" && test "x$WANT_FLARQ" != "xyes"; then exit 1 fi if test "x$WANT_FLDIGI" = "xyes"; then - test "x$NOSTRIP" = "x" && $STRIP -S "$fldigi_bin" +# test "x$NOSTRIP" = "x" && $STRIP -S "$fldigi_bin" def="$def -DHAVE_FLDIGI -DFLDIGI_NAME=$fldigi_name -DFLDIGI_BINARY=$fldigi_bin -DFLDIGI_VERSION=$PACKAGE_VERSION" fi if test "x$WANT_FLARQ" = "xyes"; then - test "x$NOSTRIP" = "x" && $STRIP -S "$flarq_bin" +# test "x$NOSTRIP" = "x" && $STRIP -S "$flarq_bin" def="$def -DHAVE_FLARQ -DFLARQ_NAME=$flarq_name -DFLARQ_BINARY=$flarq_bin -DFLARQ_VERSION=$FLARQ_VERSION" fi diff --git a/src/Makefile.am b/src/Makefile.am index 9cc419c8..07b4152b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -759,9 +759,12 @@ flarq_SOURCES += \ # Additional files that we distribute EXTRA_DIST = \ + $(srcdir)/../build-aux/config.rpath \ $(srcdir)/../scripts/mkappbundle.sh \ $(srcdir)/../scripts/mkhamlibstatic.sh \ $(srcdir)/../scripts/mknsisinst.sh \ + $(srcdir)/../scripts/buildmxe.sh \ + $(srcdir)/../scripts/builddist.sh \ $(srcdir)/../scripts/tests/cr.sh \ $(srcdir)/../scripts/tests/config-h.sh \ $(srcdir)/../data/fldigi-psk.png \ @@ -775,6 +778,7 @@ EXTRA_DIST = \ $(srcdir)/../data/mac/Info.plist.in \ $(srcdir)/../data/mac/fldigi.icns \ $(srcdir)/../data/win32/fldigi.ico \ + $(srcdir)/../data/win32/fldigi.nsi \ $(srcdir)/../data/flarq.desktop \ $(srcdir)/../data/flarq.xpm \ $(srcdir)/../data/mac/flarq.icns \ diff --git a/src/include/dxcc.h b/src/include/dxcc.h index e3575913..f09ee90d 100644 --- a/src/include/dxcc.h +++ b/src/include/dxcc.h @@ -24,6 +24,8 @@ #define DXCC_H_ #include +#include +#include struct dxcc { const char* country; @@ -35,6 +37,15 @@ struct dxcc { float gmt_offset; dxcc(const char* cn = "", int cq = 0, int itu = 0, const char* ct = "", float lat = 0.0f, float lon = 0.0f, float tz = 0.0f); + void print() { +std::cout << country << ", " + << cq_zone << ", " + << itu_zone << ", " + << continent << ", " + << latitude << ", " + << longitude << ", " + << gmt_offset << "\n"; + } }; enum qsl_t { QSL_LOTW, QSL_EQSL, QSL_END }; diff --git a/src/include/socket.h b/src/include/socket.h index 06d48493..ac1153ec 100644 --- a/src/include/socket.h +++ b/src/include/socket.h @@ -35,6 +35,7 @@ # include #else # include +# include #endif #include diff --git a/src/include/threads.h b/src/include/threads.h index b820a01c..5cfb6d3a 100644 --- a/src/include/threads.h +++ b/src/include/threads.h @@ -29,10 +29,14 @@ #include #include +#ifndef WIN32 #if !HAVE_SEM_TIMEDWAIT # include int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout); #endif +#else +#include +#endif int sem_timedwait_rel(sem_t* sem, double rel_timeout); int pthread_cond_timedwait_rel(pthread_cond_t* cond, pthread_mutex_t* mutex, double rel_timeout); diff --git a/src/include/timeops.h b/src/include/timeops.h index 1a703d21..da7fb0e3 100644 --- a/src/include/timeops.h +++ b/src/include/timeops.h @@ -26,11 +26,12 @@ #include #ifdef __MINGW32__ # include -#endif - -#if !HAVE_CLOCK_GETTIME +//#endif +#else +# if !HAVE_CLOCK_GETTIME enum clockid_t { CLOCK_REALTIME, CLOCK_MONOTONIC }; int clock_gettime(clockid_t clock_id, struct timespec* tp); +# endif #endif struct timespec operator+(const struct timespec &t0, const double &t); diff --git a/src/logbook/lookupcall.cxx b/src/logbook/lookupcall.cxx index 96b1b72e..faa5b278 100644 --- a/src/logbook/lookupcall.cxx +++ b/src/logbook/lookupcall.cxx @@ -1188,7 +1188,7 @@ static void *EQSL_loop(void *args) return NULL; size_t p; - if (fetch_http(EQSL_url, EQSL_xmlpage, 5.0) == -1) + if (fetch_http(EQSL_url, EQSL_xmlpage, 5.0) == false) LOG_ERROR("%s", "eQSL not available"); else if ((p = EQSL_xmlpage.find("Error:")) != std::string::npos) { diff --git a/src/logbook/table.cxx b/src/logbook/table.cxx index 744b43c5..31b755de 100644 --- a/src/logbook/table.cxx +++ b/src/logbook/table.cxx @@ -1654,9 +1654,9 @@ void Table::calcDimensions() { hideV = (tableHeight <= iH), hideH = (tableWidth <= iW); - if (!hideH & hideV) + if (!hideH && hideV) hideV = (tableHeight - iH - scrollbarSize) <= 0; - if (!hideV & hideH) + if (!hideV && hideH) hideH = (tableWidth - iW + scrollbarSize) <= 0; if (Vscroll == always) { diff --git a/src/misc/dxcc.cxx b/src/misc/dxcc.cxx index f80956fd..486b7c13 100644 --- a/src/misc/dxcc.cxx +++ b/src/misc/dxcc.cxx @@ -85,9 +85,16 @@ bool dxcc_open(const char* filename) cmap = new dxcc_map_t; cnames = new vector; - cnames->reserve(345); // approximate number of dxcc entities + +// this MUST be greater than the actual number of dcxx entities or +// the Windows gcc string library will move all of the strings and +// destroy the integrity of the cmap c_str() pointer to the country +// string in cnames + + cnames->reserve(500); // approximate number of dxcc entities + clist = new dxcc_list_t; - clist->reserve(345); + clist->reserve(500); dxcc* entry; string record; @@ -175,9 +182,9 @@ const dxcc* dxcc_lookup(const char* callsign) // first look for a full callsign (prefixed with '=') sstr[0] = '='; dxcc_map_t::const_iterator entry = cmap->find(sstr); - if (entry != cmap->end()) + if (entry != cmap->end()) { return entry->second; - +} // erase the '=' and do a longest prefix search sstr.erase(0, 1); size_t len = sstr.length(); @@ -192,8 +199,9 @@ const dxcc* dxcc_lookup(const char* callsign) } do { sstr.resize(len--); - if ((entry = cmap->find(sstr)) != cmap->end()) + if ((entry = cmap->find(sstr)) != cmap->end()) { return entry->second; + } } while (len); return NULL; diff --git a/src/rigcontrol/xmlrpc_rig.cxx b/src/rigcontrol/xmlrpc_rig.cxx index 58003445..b32fc1a6 100644 --- a/src/rigcontrol/xmlrpc_rig.cxx +++ b/src/rigcontrol/xmlrpc_rig.cxx @@ -819,6 +819,7 @@ void flrig_connection() bool ret; { guard_lock flrig_lock(&mutex_flrig); +//LOG_WARN("%s", "checking flrig listMethods"); ret = flrig_client->execute("system.listMethods", noArgs, result, timeout); } // if (flrig_client->execute("system.listMethods", noArgs, result, timeout)) { @@ -833,10 +834,13 @@ void flrig_connection() flrig_get_xcvr(); Fl::awake(flrig_setQSY); } else { +//LOG_WARN("%s", "not able to connect"); connected_to_flrig = false; poll_interval = 1000;//500; } - } catch (...) {} + } catch (...) { +//LOG_WARN("%s", "failure in flrig_client"); + } } void connect_to_flrig() @@ -847,6 +851,9 @@ void connect_to_flrig() flrig_client = (XmlRpcClient *)0; } try { +//LOG_WARN("creating flrig client %s, %d", +// progdefaults.flrig_ip_address.c_str(), +// atol(progdefaults.flrig_ip_port.c_str())); flrig_client = new XmlRpcClient( progdefaults.flrig_ip_address.c_str(), atol(progdefaults.flrig_ip_port.c_str())); diff --git a/src/spot/pskrep.cxx b/src/spot/pskrep.cxx index f06a8b0c..e7468777 100644 --- a/src/spot/pskrep.cxx +++ b/src/spot/pskrep.cxx @@ -418,9 +418,10 @@ void pskrep::append(string call, const char* loc, long long freq, trx_mode mode, band_map_t& bandq = queue[call][band(freq)]; if (bandq.empty() || rtime - bandq.back().rtime >= DUP_INTERVAL) { // add new bandq.push_back(rcpt_report_t(mode, freq, rtime, rtype, loc)); - LOG_VERBOSE("Added (call=\"%s\", loc=\"%s\", mode=\"%s\", freq=%d, time=%" PRIdMAX ", type=%u)", + LOG_VERBOSE("Added (call=\"%s\", loc=\"%s\", mode=\"%s\", freq=%d, time=%d, type=%u)", call.c_str(), loc, mode_info[mode].adif_name, - static_cast(freq), (intmax_t)rtime, rtype); + static_cast(freq), + static_cast(rtime), rtype); new_count++; save_queue(); } diff --git a/src/xmlrpcpp/XmlRpcSocket.cpp b/src/xmlrpcpp/XmlRpcSocket.cpp index f6f067ad..26e4cf94 100644 --- a/src/xmlrpcpp/XmlRpcSocket.cpp +++ b/src/xmlrpcpp/XmlRpcSocket.cpp @@ -59,7 +59,7 @@ static void initialize() #if defined(_WINDOWS) { - WORD wVersionRequested = MAKEWORD( WSA_MAJOR, WSA_MINOR ); + WORD wVersionRequested = MAKEWORD( 2, 0 ); WSADATA wsaData; WSAStartup(wVersionRequested, &wsaData); atexit((void(*)(void)) WSACleanup); From 30ad2a95c8bf8e8076515f8eeb2145d2ce350432 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 26 Aug 2015 05:37:23 -0500 Subject: [PATCH 008/138] WEFAX hang on INFO * WEFAX rx becomes unresponsive when writing to INFO log --- src/wefax/wefax.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wefax/wefax.cxx b/src/wefax/wefax.cxx index 03462a72..c35d3543 100644 --- a/src/wefax/wefax.cxx +++ b/src/wefax/wefax.cxx @@ -1129,7 +1129,7 @@ public: // So we trash the image. // TODO: It is done too many times: SOMETIMES THE MESSAGE IS REPEATED HUNDREDTH. // crr8row continues to grow although it makes no sense. - LOG_INFO("Flushing dummy image m_imag_corr_max=%f crr_row=%d 200 lines.", + LOG_DEBUG("Flushing dummy image m_imag_corr_max=%f crr_row=%d 200 lines.", m_imag_corr_max, crr_row ); static const char * garbage_200 = GARBAGE_STR ".200"; *stop_code = garbage_200; @@ -1137,7 +1137,7 @@ public: stable_state = RXAPTSTOP ; } else if( ( m_imag_corr_max < 0.20 ) && ( crr_row > 500 ) ) { // If the max line-to-line correlation still low for a bigger image. - LOG_INFO("Flushing dummy image m_imag_corr_max=%f crr_row=%d 500 lines.", + LOG_DEBUG("Flushing dummy image m_imag_corr_max=%f crr_row=%d 500 lines.", m_imag_corr_max, crr_row ); static const char * garbage_500 = GARBAGE_STR ".500"; *stop_code = garbage_500; @@ -1207,7 +1207,7 @@ public: if( reset_afc ) { /// Displays the message only once. if( prev_row != -1 ) { - LOG_INFO("Resetting AFC total_img_rows=%d",total_img_rows); + LOG_DEBUG("Resetting AFC total_img_rows=%d",total_img_rows); } prev_row = -1 ; total_img_rows = 0 ; From 7b42e019e9aff4f0aa1ec13bcae41c72c92bd8db Mon Sep 17 00:00:00 2001 From: David Freese Date: Fri, 4 Sep 2015 09:33:20 -0500 Subject: [PATCH 009/138] Macros * Added @WAIT macro * Added disable macro timer when changing modems --- src/dialogs/fl_digi.cxx | 1 + src/misc/macroedit.cxx | 3 ++- src/misc/macros.cxx | 55 ++++++++++++++++++++++++++++++++++------- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index f9e76cc3..c2d1176d 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -1247,6 +1247,7 @@ void update_scope() void init_modem(trx_mode mode, int freq) { ENSURE_THREAD(FLMAIN_TID); + stopMacroTimer(); if (data_io_enabled == KISS_IO) { if(!bcast_rsid_kiss_frame(freq, mode, (int) active_modem->get_txfreq(), active_modem->get_mode(), diff --git a/src/misc/macroedit.cxx b/src/misc/macroedit.cxx index a03f6cea..e6937008 100644 --- a/src/misc/macroedit.cxx +++ b/src/misc/macroedit.cxx @@ -164,7 +164,7 @@ void loadBrowser(Fl_Widget *widget) { w->add(_("\tidle signal for NN.nn sec")); w->add(_("\trepeat every NN sec")); w->add(_("\ttune signal for NN sec")); - w->add(_("\tdelay xmt for NN sec")); + w->add(_("\tdelay xmt for NN.n sec")); w->add(_("\trepeat macro continuously")); w->add(_("\tschedule execution")); @@ -216,6 +216,7 @@ void loadBrowser(Fl_Widget *widget) { w->add(LINE_SEP); w->add(_("\tAnalysis CSV on,off,toggle")); + w->add(LINE_SEP); assert(MODE_CONTESTIA < MODE_OLIVIA); char s[256]; diff --git a/src/misc/macros.cxx b/src/misc/macros.cxx index 23c3a24d..618dd6d6 100644 --- a/src/misc/macros.cxx +++ b/src/misc/macros.cxx @@ -106,6 +106,7 @@ std::string text2repeat = ""; size_t repeatchar = 0; bool macro_idle_on = false; +bool macro_rx_wait = false; static float idleTime = 0; static bool TransmitON = false; @@ -122,6 +123,8 @@ static bool GET = false; static bool timed_exec = false; static bool within_exec = false; +void rx_que_continue(void *); + static void postQueue(std::string s) { ReceiveText->addstr(s, FTextBase::CTRL); @@ -986,7 +989,7 @@ static void pTxQueIDLE(std::string &s, size_t &i, size_t endbracket) } static bool useTune = false; -static int tuneTime = 0; +static float tuneTime = 0; static void pTUNE(std::string &s, size_t &i, size_t endbracket) { @@ -1042,7 +1045,7 @@ static void pNRSID(std::string &s, size_t &i, size_t endbracket) } static bool useWait = false; -static int waitTime = 0; +static float waitTime = 0; static void pWAIT(std::string &s, size_t &i, size_t endbracket) { @@ -1050,10 +1053,10 @@ static void pWAIT(std::string &s, size_t &i, size_t endbracket) s.replace(i, endbracket - i + 1, ""); return; } - int number; + float number; std::string sTime = s.substr(i+6, endbracket - i - 6); if (sTime.length() > 0) { - sscanf(sTime.c_str(), "%d", &number); + sscanf(sTime.c_str(), "%f", &number); useWait = true; waitTime = number; } @@ -1069,12 +1072,12 @@ static void doneWAIT(void *) static void doWAIT(std::string s) { - int number; + float number; std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { - sscanf(sTime.c_str(), "%d", &number); + sscanf(sTime.c_str(), "%f", &number); Qwait_time = number; - Fl::add_timeout (number * 1.0, doneWAIT); + Fl::add_timeout (number, doneWAIT); } else Qwait_time = 0; } @@ -1090,6 +1093,27 @@ static void pTxQueWAIT(std::string &s, size_t &i, size_t endbracket) s.replace(i, endbracket - i + 1, "^!"); } +static void doRxWAIT(std::string s) +{ + float number = 0; + std::string sTime = s.substr(7, s.length() - 8); + if (sTime.length() > 0) { + sscanf(sTime.c_str(), "%f", &number); + macro_rx_wait = true; + Fl::add_timeout(number, rx_que_continue); + } +} + +static void pRxQueWAIT(std::string &s, size_t &i, size_t endbracket) +{ + if (within_exec) { + s.replace(i, endbracket - i + 1, ""); + return; + } + struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRxWAIT }; + push_rxcmd(cmd); + s.replace(i, endbracket - i + 1, ""); +} static void pINFO1(std::string &s, size_t &i, size_t endbracket) { @@ -2303,6 +2327,7 @@ static void doGOFREQ(std::string s) if (number > progdefaults.HighFreqCutoff) number = progdefaults.HighFreqCutoff; active_modem->set_freq(number); + wf->redraw(); } que_ok = true; } @@ -3006,10 +3031,17 @@ void Rx_queue_execute() cmd.cmd.erase(0,2); cmd.cmd.insert(0,"", pWX}, {" Date: Thu, 10 Sep 2015 08:05:09 -0500 Subject: [PATCH 010/138] ifkp modem * Incremental Frequency Keyed + modem - wide band, moderate speed differential MFSK signal with offset +1. - sample rate 16000 - symbol length 4096 - 33 tones spaced 3xSR/symlen apart approximately 398 Hz bandwidth. - multiple image transfer formats similar to FSQ . Avatar (59x74 WxH pixel) image transfers - tunable modem subcarrier (center freq) . may be configured fixed at 1500 Hz or . set to Psk sweet spot - raw data received written to audit log - if enabled - heard list entries written to heard log - if enbled - assigned fldigi secondary RSID code, (56, 1171) --- fldigi_doxygen/images/config-ifkp.png | Bin 0 -> 39652 bytes fldigi_doxygen/images/ifkp-WF-image-mode.png | Bin 0 -> 33290 bytes fldigi_doxygen/images/ifkp-avatar-1.png | Bin 0 -> 9677 bytes fldigi_doxygen/images/ifkp-avatar-2.png | Bin 0 -> 8824 bytes .../images/ifkp-image-completed.png | Bin 0 -> 57053 bytes fldigi_doxygen/images/ifkp-image-partial.png | Bin 0 -> 24169 bytes fldigi_doxygen/images/ifkp-image-xmt.png | Bin 0 -> 70748 bytes fldigi_doxygen/images/ifkp-rx-tx.png | Bin 0 -> 50418 bytes fldigi_doxygen/images/ifkp-send-image.png | Bin 0 -> 11394 bytes fldigi_doxygen/user_src_docs/Doxyfile | 7 +- fldigi_doxygen/user_src_docs/IFKP.txt | 423 +++++++++ fldigi_doxygen/user_src_docs/configIFKP.txt | 74 ++ .../user_src_docs/fldigi_configuration.txt | 1 + .../user_src_docs/fldigi_modems.txt | 1 + fldigi_doxygen/user_src_docs/index_order.txt | 6 +- src/Makefile.am | 6 + src/dialogs/confdialog.cxx | 192 +++- src/dialogs/confdialog.fl | 152 +++- src/dialogs/fl_digi.cxx | 479 +++++++++- src/globals/globals.cxx | 8 +- src/ifkp/ifkp-pic.cxx | 803 +++++++++++++++++ src/ifkp/ifkp.cxx | 808 +++++++++++++++++ src/ifkp/ifkp_bitmaps.cxx | 52 ++ src/ifkp/ifkp_varicode.cxx | 110 +++ src/ifkp/notes/ifkp_notes.txt | 214 +++++ src/ifkp/tux.cxx | 823 ++++++++++++++++++ src/include/FTextRXTX.h | 7 +- src/include/confdialog.h | 12 + src/include/configuration.h | 30 +- src/include/fl_digi.h | 22 + src/include/globals.h | 5 +- src/include/ifkp.h | 178 ++++ src/include/main.h | 1 + src/include/modem.h | 5 + src/include/picture.h | 8 + src/include/status.h | 2 + src/main.cxx | 2 + src/misc/macros.cxx | 164 +++- src/misc/status.cxx | 5 + src/rsid/rsid_defs.cxx | 2 + src/trx/modem.cxx | 2 + src/waterfall/waterfall.cxx | 10 +- src/widgets/FTextRXTX.cxx | 5 +- src/widgets/picture.cxx | 54 +- 44 files changed, 4547 insertions(+), 126 deletions(-) create mode 100644 fldigi_doxygen/images/config-ifkp.png create mode 100644 fldigi_doxygen/images/ifkp-WF-image-mode.png create mode 100644 fldigi_doxygen/images/ifkp-avatar-1.png create mode 100644 fldigi_doxygen/images/ifkp-avatar-2.png create mode 100644 fldigi_doxygen/images/ifkp-image-completed.png create mode 100644 fldigi_doxygen/images/ifkp-image-partial.png create mode 100644 fldigi_doxygen/images/ifkp-image-xmt.png create mode 100644 fldigi_doxygen/images/ifkp-rx-tx.png create mode 100644 fldigi_doxygen/images/ifkp-send-image.png create mode 100644 fldigi_doxygen/user_src_docs/IFKP.txt create mode 100644 fldigi_doxygen/user_src_docs/configIFKP.txt create mode 100644 src/ifkp/ifkp-pic.cxx create mode 100644 src/ifkp/ifkp.cxx create mode 100644 src/ifkp/ifkp_bitmaps.cxx create mode 100644 src/ifkp/ifkp_varicode.cxx create mode 100644 src/ifkp/notes/ifkp_notes.txt create mode 100644 src/ifkp/tux.cxx create mode 100644 src/include/ifkp.h diff --git a/fldigi_doxygen/images/config-ifkp.png b/fldigi_doxygen/images/config-ifkp.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7a3c80724f20a132b1eb726f86d08afd361280 GIT binary patch literal 39652 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 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/ifkp-WF-image-mode.png b/fldigi_doxygen/images/ifkp-WF-image-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..d95008795c4c9336e06cf049db4fa80b1630847c GIT binary patch literal 33290 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 Y=#7)-!!g(ifPfzb8CB^jN%OG(1IRrUp#T5? literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/ifkp-avatar-1.png b/fldigi_doxygen/images/ifkp-avatar-1.png new file mode 100644 index 0000000000000000000000000000000000000000..448adeb2111658fd865316d5f972c6d7d9a6ba6d GIT binary patch literal 9677 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 P00000NkvXXu0mjf60+DC literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/ifkp-avatar-2.png b/fldigi_doxygen/images/ifkp-avatar-2.png new file mode 100644 index 0000000000000000000000000000000000000000..4346dfb59511695b0ba4e9affb169e95c24883c3 GIT binary patch literal 8824 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%0A7`jEmoA*A_Ku6|mPoqLt!B_mViKwO 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 ChwJ75 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/ifkp-image-partial.png b/fldigi_doxygen/images/ifkp-image-partial.png new file mode 100644 index 0000000000000000000000000000000000000000..0b0e8faf9c4cf581d0462ab7c679f1ea3ed796f3 GIT binary patch literal 24169 zcmeEu^;6tl)Hf8071zaGiZ2cYibHXVyDaWf+}#!^?ogn(E?SDi;_mM5T3lYf&&>Nb zJik1dNp6yJCo}hR{NyB&%8JrxC`2eQFfeG}WF)@Bz`)AC@2p4&?{{{;Goil^@GfHC z)R5jcA0*R=_iMr*l3G7h9n62Y8#|l9SlBz*nX$NloXyPaT`V1boWpep!@y9$e3KAW z^T;}B^Q<@1)IWcE80DYW@jjoPD?L+VES3GPUW#&fh${orWl6(;B(@_t6Ya1e+3Pf0 za`)(Q0l=W9I@osGUOm2kXpNdjS4)x#jKIYF2}9|-uEAKkcVoe8Q_1gt9@l(Znt0?K zkrk5mK*-MMo!hWyaO(cDSFPKP{O5V}d;-TeSB3_A9AEff_<202!=?PI-sRk#mCd!m z+Eq`gu&ZwJJ9#}2eBu#!i?P~8|MpZ}fwUiGWbi)gaJ=2OL%JTOdJh%q<=O^`Z-5k%}C|jb2@#) ztBb*ftk}dh^faCQtgD#}hRv@RLyS5D{a1r08%)`tYq|^#73U`*^l=uaC$#y?A#x8= z@9~8TmP-GA@j9P99CG9JYXjKM8ILDIepZrMndbji#{06fe1KlIjqt~EnF^=(a-BT7 z3|mYj7@G@I%*a^T@#&<`!73Oh66%f~H_CiDp8Led*7nRTuM{I(3T*ehgSGG26fn4$ z(u6b+Zm09Gb_VuD`|PUvd(DJQ*j#zoeUGMH~3AW)k`dWA(F6``C}A7bsZ`0W-tg@I49}*m_RyG&X>-1_Ic$XXPKWub@ z!kZ6oTNaz`;57BTfOn)P**{ihEA+ZI;r(yc;3iJp_#HPok=;81!4L#$1o)!jVps;m zUF3crjql@E|Ek@a_js$fe9)awTiT(iXY0`|c{- z--Q4pw=Hv8M@ft;Zh61j`69t(@rD_H6!XKp|FgK>+a<_1gvr*-?mL$t@ z#Db}xEUF+E<9+F`foyl0Z?51^1|9-unQ=~> z4;bS!)l?!k<~GN~_rk5b9S90xGztyIu3FT&bW@I6uD&!~>^^0HOkDbS73-c(tmwit zA#)?A9l0%JImV?3s$gK7T~_GRT^$ra(0ZW9qbV~Ud-X(vW#Q*iqMevT^psNZi@9Q-K`5V+u&~dQ$`T0{Ze`Ubhru6-QbbHr7 zKi(Eztw)UYp`I^n+tqKUrX*D-&ikY87vBEvUuV~{AS}pdSIQuLZ%nF%_r6b4PT$IecS}$6Q@rUnY6;_@m$FDa}*N2a*Ta$QC-*EjI_pbxV z)4GM-h&x^*-@>8(LV@6(7ZcrNK3rhDQEcd!3{RLX>AxT`?DLOQnS}4PKEce0^WZ6 zGsi8AT+?bl+$q`#PeGRJo*?;aa5dzPAZNII-I;&fB8g=d^xX93L?3N&3JUicI#L5w zukG^-KOgo_WG@p6ULZX!b_ws@4-}J&yXPo+uKSTqai#-ujfU1oearwXDfcZMz5({T z$enP!>*H--YqPKKPBy@6EP@Mc9xt=RK<2Ade{XWm=*0ju6ORw@6nWq6nPFqTL|>9uyFaAnMS9x$57R z{`(Po*0~$b9fG|HHpDh1KqaoTQorMcj!Lr?KlPqSb2OqixBPWop)+emAzE^h26puV zYYYV1)m>I~eIdm_dU{@V9)Vbw@}iw=Q{xZx^^J7T714F0&z)~_7*cb(22U# zWLXw?P}uu2{Vvg3t^R3&w&lZwuSJoM*;&3$3f=O_;p}#&`s_!To5u-r`$TAteO-6l z&Y1J`c#lhj)bc0k{SN%#K;gtAzth2T|GW)iF_^i!4*eNOa+BzrsIN#U< z`6PvRKNOradk`eXT^o;G9}I;@c?pf8yUtjU+D;`tNUv_;F+CLF&zK^m2 zwmW^YI9Za?z41WvUU4JcS$f+h|07E0F<5Rm#3t;3=+Js$zV;%LTWa_5?>#0)+}Sp- z!Bkji@Cp>4)no9J$IJX{V23VWcwOJf=RV;{Ab%GJ{UiGLrt~I#RdaxxwAb^?+dbgz z+)nQ1%NNh{x7XDZ98pZ?!#aN~)^r9wyWd-9ITl%xWe_Vm&AzB%p<4J<@c3m*$HU$8 z>By1c@Pc2L3*TtghL$fepLWJ7WcvCXcQPqaK6@T_)INpWI;|pOE5~+)vKV{U!F45^ zd~MwSe(+oy`J(kr{0#|Z{&`_oPbsXMn4MVhpNItaCo}~s)#72|+;DuoCfvsV^~2iz-gWcg*R|eweG86VMc^&+ooD6xHy27Kb@hTuCxe@z z>xHITu(416cz<>7rn;u$<&x&<2C=^rQ`5q?DvzG_zQ499#OJ-c2Hd^GReXt=Z%44V zPdpZ9i(ScVizD-|SLS4^ZjYCrwbl_7UB3z%a9K&X>{#I`)CojfvBjF#4b6L8?dHgU zJ7%2_)knLXZ}8gQ#B)K{dzDOYzN52jWB;KM=HcQNEH#EXfI&34?D40*>4Vzo^- z#&5x9__ALOJiw?~X6tEctlTW}OsNUm{xwwk5yvvSG5j)^_nN6g_v$Qnsb5mlkL{dU zc(~f|4Ibpnw4AI20o^FRo?J)kc|CAB_?~L`-72A9Ws$%788mcV|HJSP>_D?{#=pB- zi?iMP+UCdGah1`3AF4FQ`4<#)@>}H!=lmMS-(vAk;a=R^4iC@kg+bMG>HJ068Ogl= zrSaLe-k5dD5YH)e%|qz?r<}*}aBe^1+Jj)(1GUd>?%7VeOHPkAB_`(8sKutk^M|)~ zfjIJxlV+a_eKvST^p%!eCI3zHvol-ca_#NQCw$L*pk_2(=SQ~ognZ7&`dzCWX2UDf z_>ZG!~QWlVvkAMr~ADZm;Vt# z0IjCF->sd4e>dqvUB^8Rnb(2n$*tVy=)-@_TREj^z}pk;jkb=*VrGu+MS_z}Jq>^1 z%t26bV1K0xPa;CvTJKn|^gTw08?_LgRMEJ}oxT4NWUf_z)WLQ+ceX;>7s;M{G^zD5Cv_w7)AdXLGQNd+fG`ZiLOE#V4Hp*H`5B%-W%a zZrHWEz)X|1-*yn=Yru<=Z{k|nKRyuWo!>5k-@~=xZ&Zr8c!#xq#A+D)y|j4zbge%3 zoWZN$JIB-WmCo;kFycUgt|AuQ1&(w|r2{cf=L)mF2KRG=_RAOt$ID)Vy6Y7Jc4KDG za+mJKRj)dMBf%Tw9RF9Bx%xAR-$0^d-Mse-sGrR5E01vB+U0`s_VL{q$=w&FvMCEA zo(uA~>vK#o+Y-o>>9z#D0dp|gc<=r6p+_;$>ruC z7_-gC!+vYGqZafqsN|P0-+tQ=_hj#B9Co`vQ)O8>^v~-Epko_1#w>JLpC8N_%>*LV zjlY&BbmuOvXOF9A4VepFUt*(!$P1FD@etQZKMXtk@VF*!&-HKOhqFfi>J!j$KcVnE z`xF#(jLAg|kPt4nA0Nb(Su-(h%2ZZ_RHLL#4*>Q{Y_BPw4`p>rxGJ>Zk{`ZuAcOCvI z=ObfzkZ?x!&}Jq$$^`ymqLPvEe6W(*Wdo|rCmzqA#T|i!(4~Xk3Vgi0 z2_ot!1_sQXgAQQ;Lg5sX96mzeLwoTJtejD^AqP^9V!092e1`EPSAS>YI{_NE3CU?Z zSmBgM5v~i><0rgJ_I+OPuwbn(bvB21WtVp^VO*54GV+UPr#7Vxv>dze z`vA?_2&0&CFAPGLcGqJ7(l2Gti}pSM`v(*FZTRROB5^vgy%52soiP)zq&jhOgbDLy zxMQD51r>uR*Q=W{6iG&pM?ygqz5=TP4-;ur-yxe4bD*MNy&5TCwDS{RJYOTD>CizR z@X9T7?pN>346ZafxzuszJ(Q16u3VjcijkdfsJ({0W8~@?tEi8Mz0C{}JIPOds?s_u zNQDv!fGE~kLV>=dF_1-Ti7Re{Mg$L~_+Zk2RU?9r8<&8Vi;AFE#K)|dREs{tU`YWl zTC+1}92u?_L*?-Sg&{wvWGklMCI(&^sFf;;WT~u{Y_!$PBQ?Mw`kBG^+bRc`62Js* zbT)6HU0tH4qd*X_>uIbICp9WXnR$VAXCc`tdWxO6mVQU{-1CU-(E|1x`+Q{R#=%Z( z_a`bcFs+T53=A^tmwK+CpSp7PBvPH_Ch81on5b(KHoavDiwvg2uHW31u?6|4chZe2 zyG-&Ob-L05oQ&*12N7}jX&^8D%%prRYG&p z1|@NL$Xcg(!95mQnAA(=m_=YE1=OWnx<%`^++B4l817Gi;@E+Zz!iZMeEdUm^lfHY zA0z<%$c?$BdTflYJA3m3*Hyle=NbF8i*%Znp1BVrnKb<`4=^m+5)y&wTs~3LB2t8< zApR&^_h-H>#mqmP0AL9>pj<1Er#ooo#+sJFNq-w6Lg{oOLP5dQVe^qBOw8_D!3Plf zmx@A-szmDp>_0L6C#i@$$CTh&P~s<+bLC_hOgc-LCuN_v4z{rr`;xXB|3IChq(Bl5F$x98D%g46`HBg zkp7CmL2dd$G*tGZWNE#*xl?+mK_q8Nq=slbKL-T992M!;hdvW4!Zj@ROhtKmC2)&*nomhu-E+7?w!8U z7;Ivj1^bg&1dmc!IV(*{q@bq1gAg7Q89)snmeddvX^54E0%o}8%HY8tCq*U>3`F4R z5kRmwap8mTL6|;1UZzA_mpHH>BvzfHe1!5KgkJB$isT_gwL&LE5zIo3yfQ|FmkdO6 z0)XY9nl!^z5E^TNUB5P~jZXx9Sq=A#pJa|Ud(a&oDMV?}_4VDW?g>m%xwpVvu+%q<$sDqk)#vNM#=%h84n326-VAn6{ zNw*Spx+Z&2&kbQ({>DIFFp1B-Us3V+#?8K-yaBEjo*1d*I+q5GL{kuUC{QQuQcKzf zV0-PzA(5w!Re`qP;Yd`DDUU#fuO5df$x;{A&5#cCz;KP2zF0v?cl9VxQ7#ZGknj&f zxDdsPQT1fL$7JyRb)4LeF++x*VuQ|no6f+@qVji*)0`z8pu;o4Xw;0J)CIC0HZAU* zV@X`Vl1A)zPV;AE`)7gopW2%^hX?|){y`sdHX=lmM^NUVnYzK45+ybO0S1r}t>QTX z(JTV~H3p6;?@%v363smpQ@TABb{0&Bn(b=u|UQN#(Jl-?eezr34C+f>G2y zNAXBbn)tMu3*R7jO&{7CIh%Ys&F|gpN52?&eOhP-ArkZEN>!HuR0{hN0Fp9~o3KcL8qlxmj?u+|=r!1`2YLx=poPmRslxERyO&Z`Cz&<9PvjcGM zySKE}hqX^Q1*9C?mbr@voDJ;+cXeqrX~)oe%WzS1_P(FQaCACkCWVj{`06MgRY^5= z1vSZ?67or#U+2cnYAIgatAP`>AE$A`URYii?&u)BEHa)H z>-z4D!{5M|bq=Ymk3^I9KE46KB_Dhr99tCON6tzWHMn%3%&wKL+^mz+z;=gbVBZV@l1fR3ZlTN{b6M}Y6X zK_~Pc-^+FMhR|Y)kXSsc2SyRsrr_QZCv+}vJelG3l3gNIa?hrMCmpGAaUHWJW}N4p zqbqM|coRHT{D!by)M}U-LMC8QXgo3O`6Q-De)KP~flWYt@9FbD7U0Nf*OJDw2!oE^3-s=g?yMD(zkQ7o$saT_F zaYuyrwinwZxtRkSBOT!|iz{OcCV8VEK%(-p``V&q@(pnXb2LwLe%~IX>tQ&A;3!Fq z%I;0w*byBmmwuU?M1BH?>AsU6GPrV)uwf<9mk#1gERPJXl1Qe1jBv0Bux3OEjY>lb z{S-Q}B}!(fkb*@wI=jqT`;5kAjM)u3XGhrn@&C97w%!5`Z3~(E8OnuC&`vd?3(KHp zvCK>!CmRLKV`Rqt=`DoIHIa)w7?2s_8qafKsU_CG0I}^SyJxgA2^;5w2>l0tA0xi} zTr9YZK;9^;ilGUlUoQA~9|dJB(G6EkQ3fssB!(N(ANzYW3IMGEuK3IHgUKaZTX99g zG-VYOPd_g1eTWou?sA$|W@byAKanLh?P~`2Y6; zU|0rBF|96bw^21%*<1F9xrG^}9p9E*;EMjLjbYA z$$2P*4Rr-KIoHY~L7AgdLiI%IP~!nR3kVs^N7vaiyP}aN45s$HE&jC{U>b?YD@f=xaiZx()ktF)4GZ#ZCA9WO{{CV&&a z@=*;wXeOkVqClkHwrG07nQ+Ptc&VN7+X>5?*G_cd3U*SJcoQ#@G9(zDDT=Jatl%#Ft&w5Hl-Vb@2&{r6Jc9Z{*r#a-)bc#F zJbS581=UcJ*)9zjf~TrKe4_lBDbh0Fs8E&a3SsC()+#Wi)6j1~>6#BK{cz8F=EVg-uijJ#XxNCcUaw3i?chPAH@^3H-xFgUCJ?H{}U_+7KGd8eFNGzF!)| zPW%}Gu~06;7VAg+f2NZBAZ!m11!7G6ngD#OSY_biZi4jw-+CA0T2lQOP1d zC|ze`2?8g$fDqVy=4{1G$ROIt=qRQaoX*yQpzvV3@4n-0ET=Y~Pg-a?KTob3g7)S` znc#USo9XtA)xA+kP!McS%?D{@DbTl4iD4G5z$_w3s6KJ%jlXVXaON(JMG=_uZ4Q5n46yIV?+Mxzsxk$YYeu{d@FlOn66=A(g3> zK~ylR_m`SkWdBBqQy+!srGc{bZ>&Z=W_)e47i2O=6qfB04kh(u8U5{=65^sU59RUi z?wy-w0g;M|!ry=H#%kCPq6EidN~RaUlH-VNH`%sx2cR=)XTB zn^NNt238xBA}_FgdA@;(NwZY>GHM$!ou31IZQegw5f=DL*l10q$|#TCG?94zsF4Y` zZj-}91Y(?ry0mR;yR2_B?XiB_S~;N+g+vT5I%%XcGnC3&#`(#c;P*paUiRc52YZUF zjTfch?)+0-=zsCi$*+Ff4s)A5q*KctK5BT3Jk*&YWX6)J74U}=U`U?;N*ROek7hzS zbCLppGe=O|xA{PkLMId=33hF;Ox#i$RQUZ}p=oTln6W~l>GXhPVlZDlL%3&hIhx+2 z7RK7N$U34A=_#FHtdp8{#H3|OrX69>YG&a#XojmPUBVZ%`Iw7!HVG8>yc@vY%Ey}^>Nilz$&lC zfMt*_)2f&y3Y-|u4F^0Pm;^5wuY3(LC}g3PdSEideJfZ_nZ$`1Pp(qAJW|*g2<0sH zfJ^V&Ahtuo7mRTrG=uiG!-(P$kmSXR(%H~T?Q`3Eh?G3$gc^*VYy~ii6S%|Ek(fs#5<0$hQ0L zR{;UCP1}sjeZoVkC&fkZ!DNh?G@_=LMwUFP_u8h;SQ%>48sGw#eWWq8jO@Qn)vC4^Z>puC; z$il?lUpk~2E6N|tX`ArsktdKK%+or-4Z>u)TVh1&q-?IZ;tiGnd>ENTQ5g1TMXZ0& zAJV~^JroQc1GYG-9AP?e25@VL_)j?${C)Gxnim@;sgd1|eI9FCFXHsh^?vHVzLsbo z%#OGUtqN!ayS8vw3QSn>FE!_xv7~63AGYP0ky;lRa$la({}*C@`xTS0oCd6vs_EGg z0Rr#0;Exh&t4i8_nh{E-s31q66jXu*qerQseKMtd!PPblOk5tVFeU?HxJw>QD9xPp zBs+9Qw)G+=$#S?j+jy$HftV^mkqsGtO|toiU|!11OATvRq7|qS8m3rm5Yz{Mp)mhI zgvUA9A#KG`W0BmeAuNgf%&8tA+F@es+1VD&y&4Iw`vSY~Y`a!8z!~H|lT1Goc&b~( z?>;WffqE@%KA;~Se~Ff+ygiI9eIq&-vlptx?l(ifC{e41OHAYs=__f{=9lRC>4vis zzd!<~m8|$fjk)(A>K>!`5GX2aq>;lRj%cbi*n-M9v!?8A*0@}V9vHsYGNMVw$=_EH zE!Ki5@SY=wP;tVe-LwpeeSL4A3TB+kn4YP(K%wL6MZ~{aQRZ4Cpqx?b>e{w0$6jas z&v|>=Ta{~n!$5{+E-nE~fdHQiOBgg-Jnja9$6!GOI%nyxYV~01I9vj_?*m`DdEDz`DS^BpJRP7j|qAlkl{%y zRrM)hX`Y0SYxs5CH%H&%%xHem+tOWX!Z|W0JbnzG#lrCjr2Nf>Q4mIvWDI4jFBmtm zz@(VQX3L-0M}CPQILdHP3_zA-Ojf4tq|VilCw>mnhVPmQ+xtn=KKfrcndKs*9o%!7lLyCk#iCL&A(oyrWD}Bx5qb z%v!ZZnj8iuwGELP1wba=y2P~D1peUn(tu7DsZ>a^kul#tbjrUd;I9IK)5iLg3P&YS zgRBBcVjRKYDk-%^u1S-|<>Fh}FXNU3DPuB$E@E_I_MoQx6tP0trjYpV8t-WaN!Fc4 z^9oMUFT}>m-WPa%NW!RTnO_H>2LKR`>crUuo1AS*L1S@1p--X)R=lHzhi5dZUjDxxM=-pycB@5MQk3{x3MC5TIt_Ac-7U z;S3*Qpem)wH(w8^^FU*2^0YS@EU>d?L4%kt@>oe|$g83gIt+=3NS5>(vHwB{n!v4x z!rMpAvKg2-yB8s0c<_b;sZ{*aPFUS&0LmZGNhKtD4p`!6OUIxN?! z$XTV CJ01YD59;J0-17rg6JP6j3k7pxVxK$1D=BMkyEFLRD2BR6u8)xqIONECmFn&@!_E?iZqO7+Bcz&Qgz;!f5K3P+7L1wQKAkT!v| z6u-InNS0ay;Nu|t1)gP5dP@HpJ_w~my)#%H?1DSDX%jckp%XZ#oJ>n3m_CZR9bp`z zHL3~_XHG?(alJAAhz6fIsX?&Zyy)SAJ{>}m(@n?$0*NCRXnmT?pyN0J5;-ay$=abd zU^@KhoDZ@-Stg{p-NB92_YUf&fFCOB;}bVVt6YiakCqY1{A|g!wI!Z!W};bSehr#7 zFv)to@DWkS{JXv#`^Db;Y=YWJHdlA4GRWB~@{9em!0H*5#d#Y{>KD3xX;2~-QEs_N zzt$0E)7N%>>a(UHWdMj=-Xdhd)PW($Px4w~>nTwll#H1F3!MNnGW25<4@Tg^5B^6U z5UhxD9&TYx;3czLH?KyCxR3OBAgvk1&}mMpCq)sw5Y4L~u|}#lvQPoU{7g5uK4B*O*v=ZsIF;Xx zE!G)n6eAvC#U}d;-^yN1R9wU-aXlPc9#xGGxI=a6`l;wLnWtff4*Ho-!Eu16>!(pc ziSBkhMG0OIw`HCsttF{%=4GMDsG1N1A^tYAHrbs>#fXI*rA2ETI#Vilz|eV_i3*ksTG z??byMayFLe3@4q@C)jEEX}F|@JWWaR<8;;7m`W0x3`7dxl0)xC#`QE#r&RQUmUvMP z!${cXvH_M7x5UHe*PIv9i-+$j|%R#P^is!Zl{pF0q_m&48Wfks%u%yyH>I z-bjZdjU=o?$b*1cU+T-l(AO{Xg>{cd2dkn^ft{j#z90G1#i zRn^=i^{yg40YR{&kSoXulBtViY_?>j|J=c~El>_I{B3masJDU-oZG>e>$t~5U__1A*52C#Vf2HvIDckcK%RcxmVE+C*OWf!mjrZB<(MI0Vz(+LeuZ~q%?3Es(q;Ds1r8wZe zvyxY@pZs~O1u0|NdiQ3S&w7zCxGl-m9@7zDi`-_I=Sk{O}<$?#nZrw%0pCe~WMl!&p#LW{U6f?LgPA&Q38 z0Z&;RZ|i&ti5aRlY8LSiDHkq<}3ZGV5}9G^O)D!28+yn z$Vhbw4Y0}zsru{-HuD*6u~1V14d`cm?+dv@J>DvJalx@k53in%Nsd_J+eM{|{*aNU zg{FlZfu>Nf445Nz(?vuA$da%3x6ORI8P0Gsx55i57*wD^U=Q%F=DhgoWc_c43Q$S%63 zHK1~jzvj(g?Rxm@Xm#7$-Jcu0b#e6+k*p|PG+~GqGR@|ey`qeHCZKpL2AzQRrW?jjWHQlQ7K6%M^U^2f;KHJVnK(Qn8Ory&HNb?FIlx zPx&8n_rXYz>b)9I)}9+m!XolsH?szmhNdKL=3DFAaaNA`O3VFNX7W629GlH#tv!Bu zVk(V(RNO~}e&=P09C6N3uCXAmEY750vbz-@IC7u;amV4xrk{j8-QC#P@jR!BQUJiv z)K*1-9oi|gv=lv3R~@_mPic(N8bR+6d;d0J zJ3wdL^Wq*>u&Q)PVRor+kTh4t-t&s*z?_TxTSj>Awd;aJ*(iI>72{6pW(JNGssJ)g z8(5(B5ji4E4>9O`r1tEJ7$zKd=|hpGuLI)}7I=~|iN05Si~9571$ZVBL}Gaq96=Ac zPEn9NAe<;vETVnHZ#SJ(jYRvF#GveOmSPTMw!qA%_yu(Ilg9-2#h*&7+{#&(3;71} zeWD+wu(qGN$tU~mN&oA(0`Ho{Dh8^2H0g4aPp z4Y2Ny%q&ZMp(HvfU+2@>D}MWJC|i632`-_DDA+20eQGA9f8qaC9k z(R>gdO6s=!oS>$dODl61liBp5epbx4Ysv|ZC>PjK>k8E+cqtV+8XiDjC|&7$8zAO7 z;kuKoF|AuPFS?Bh`*>Q$2)vXY$(O(1Q59Jf(csPel$}a+>$s5A3OP#Pd<|9k`qNzb z6si~X+5WSby>IJl+2M;$$?jxtIWA>K_H8mpbM`E2G{JXxwunK9AAo6s={tnj-8`lN zn2j)lFmaF=v@}$7PU8Vnn8XbcnGe_Ogsnz3K%>qDkEVE9xfE0Fr>SzU7P(n|i&s8Z z-P-tB+U8~Jkta_wq0^M3#$%23rv-6o)Ns@^%Y;d`g=JH^nz~mzx zb7r0PAGA<*OCwccdwpb8t-fQljJYZG&%ojY+6W^+dl5i%hSQ-9ClX*G@R&e z&5wL?i^2ADp3b8$dhWZqmji6%$V}1s*m5Z&#qO_qSvCoOlb{}Dw4qbTQmMcpV`4NZ zVud|d9fS6==)zBb2Zy-REIHU$#_7La(678~e~G{YR7TcF2!pkbX~bwzsKTR|>4xTm zo7{a=PxrAb1(&q)2XGqaxJ}cG7e~?t#2RSjEgyROaC#@I)JPhST>n7D2J_^Mg-e2K z8Vx^VuddCi26H4)DO8#Q1tjCA3^WKoD^zsjQzOb=hHmwE_mlW;6Bdku|GLg(7w&fB z_sLofIms8&wEP;yMIIqEsYi1N@PQKNj$ck2QAy&8&ls>064^qRLR5a(G1y45s3Z-C zegCG)MEutpxJpXPSQrw8EXkTc(~6bIaPn5!*5?uGgtE;A`8p9E`A@6-nsL*Z&Hk7x zT^&3_x*Sd{*kBQ|884t{rdAflH^$Uy6-Q+#eu&E#>_T+x^V%O)$)(q_fXINuIagNa zck26m$0R%uj8WCYBWOi3y{Zdpo!w~6T_4UsQ&Mik$LZDjsA3B#>s=TCuw;IZ!L=rd z)%_Fl-m<5i)oKe{rPs@q!4($v@Qk=V*5m#XqJ#UFSAOsp6Hw|4qpZqRlvd{8-`pKI zUXLr}(~R3%>DipMGftg3j-?A!UZWAlRt~^^gi{hK1J2ym(_kQ(7kwVya9{I1`lRpTl6^12-_h++u+IP~2 z*?HEj#hJDwR9L=!aw(D_-$VTtQ?O>8pWK&*r1V*yZ!A?fLk4GmS`W+v?F%W}VZ8a0 z0xrssfU4l`@mfpMPC@Bbs=|*pW3@tAD6k8GD5!)(U$W**AA|+xME7tN931gw+x2Vk zkLEbmE>L51Z)0Z;9k?flezkTlvwv*c{go4@H1E7Z=4-EcjI5egAKU#agyYW$ww1Vf z=84a? z7E9smS!BlKh;@Do{_Pk#U3ZLxm>88N!rX_A<>p%^!~K|fbUBz=0i zsCQty;LBI;9`{TNp5!vQe#OT-)tVzriBCyXHWC`4E=LCbUQs6cum^(%OP_t9cYS_dmBN?-BWS>A)AfcN#i+ZeA& z`AxMiTIZZdlWL?me=Fo)94MMJpGEE}vWz<+T+-MeyckFlwKqc`xn>`jAi=-->x zjD-m;T(6G?PN42CfYBw>vfb}fs1@)^QKH2fFdPyF5A_ymXv3zA6*@HXLKVDEecE?8 z)@4|S2cD{W!j%@Hpp)GYkbmF!?TkwN=7?vQyr;F3*zbgkC+ZPfk?`vhsl0%27h^7_ zIXdvve&K#TgTrE3jfuSc*LTG8e`skId{bsbr=Ay3qm7Cg+}GK=CR(=XX`^yBo|Qp` zmgy7fh59K^uR)k_hq&obQ2@Es)OSXaV&zjzVf4 ylWnU7kWTtiEfSgbi;Qgfp6 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 Fe*uTR>V*Vk)RcQw}Ss=D{= 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 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/ifkp-rx-tx.png b/fldigi_doxygen/images/ifkp-rx-tx.png new file mode 100644 index 0000000000000000000000000000000000000000..65f786edb5d388302f0aa2ab60810a4f72508bbd GIT binary patch literal 50418 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 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/ifkp-send-image.png b/fldigi_doxygen/images/ifkp-send-image.png new file mode 100644 index 0000000000000000000000000000000000000000..b784ccec30c0b4821f85ed7b47e379975d31f654 GIT binary patch literal 11394 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 b>>1mS+EfNk!TJHG3 +

+\image html ifkp-rx-tx.png "ifkp main dialog" +\image latex ifkp-rx-tx.png "ifkp main dialog" width=4.0in +
+
+ +The main dialog ifkp user interface provides an Rx-text panel, a Tx-text panel, +a "Heard" list, and an ifkp signal to noise indicator, and an avatar image. The +default avatar is the "Tux" logo. Sending, receiving and saving avatars is discussed +in the avatar section. + +Keyboard operation in ifkp is identical to other digital modes such as PSK, MFSK, +DominoEX, etc. with a primary difference; the alphabet is a truncated version of +the MicroSoft Code Page 1250, CP1250. This alphabet is described in the ifkp varicode +section. + +Unlike FSQ, which uses a similar incremental frequency keying technique, IFKP does +not employ any special protocols. The exception to this rule is for the transmission +and reception of IFKP images. + +IFKP transmission and reception can occur anywhere within the nominal passband of +500 to 3500 Hertz. fldigi will adjust the waterfall tracking point if the center frequency +selected would create a signal that is either above or below the nominal passband. +The default audio frequency is 1500 and most operators will elect to use the default. + +\section IFKPheard IFKP heard list + +The IFKP decoder includes a parser which continuously examines the received text +stream looking for a sequence of characters which begins with \de\, independent +of case. \ is the space character. The ensuing word is then tested for validity +as a callsign. The following examples would all be qualified as a valid callsign: +
+" DE W1HKJ "
+" de kl7cgf "
+" de     W3FQN "
+" de K2LBM"
+"de N2IKY"
+
+Note that the white space can be extended between the "de" and the callsign. The +callsign can be terminated with either a space character or a new line character. + +When a valid callsign is discovered it is added to the heard list along with the time +and detected signal to noise ratio. New callsigns are always prepended to the top of +the heard list. Any older heard list entries with the same callsign are purged. + +Left clicking on a heard list entry inserts that callsign in the Tx panel at the +cursor position. Right clicking on a heard list entry deletes that entry from +the list. + +\section IFKPspec IFKP specification + +IFKP is a incremental frequency keyed mode with an offset of +1. It is designed +for very high coding efficiency. This version uses 33 tones (32 differences), +a Varicoded Alphabet, with a rotating difference frequency. Modem statistics: +
+
+| Parameter | Value +:--------------|----------: +Samplerate | 16000 | +Bandwidth | 386 | +Center freq | 1500(1) | +Symbol length | 4096 | +Lower case cps | 3.65 | +(1) nominal, adjustable from 500 to 3500 Hertz +
+
+Tone differences are expressed as decimal numbers 0 - 31. The alphabet design +uses single-symbol and two-symbol character codes. The character set does not +include much extended ASCII, and has only 116 different codes. It is a strongly +'unsquare' design (29 x 3), which restricts the number of codes, but we don't +need the maximum anyway. This 'unsquare' code maximizes the single-symbol set to +29, so will fit all lower case in one symbol. Using 29 initials means using a +comparison process to discover where the initial symbols are. +
+ +Amateur communications does not follow standard English text for letter frequency. +It has a higher incidence of letters such as Q, X and Z (in Q codes and callsigns). +Lower case letters are more common than upper case. Numbers are considered equal +in frequency of occurance to upper case characters. +
+ +The IFKP character set has been designed for one set of 29 single-symbol characters, +and three two-symbol sets of upper case letters, number and punctuation. There +is some spare space, and a few extended ASCII characters have been included (± ÷ ° £ ×). +
+ +There are 29 single-symbol characters, 87 two-symbol codes, and a total +alphabet of 116 codes. This allows coding all upper case, lower case and +punctuation. The most common symbol is the NULL, a non printing character +and is assigned a single symbol entry in the table. +
+ +The nomenclature used for the character symbol numbers in the tables is +
+[1st_symbol], ([2nd_symbol])
+
+expressed in decimal, where the [1st_symbol] always has values less than 29, +and the [2nd_symbol] will have a value of 30 or 31. +
+\section IFKPvaricode IFKP Varicode + +The IFKP varicode table is defined as shown in the following tables: +
+| CHAR | ASCII | VAR | CHAR | ASCII | VAR | CHAR | ASCII | VAR +:------:|------:|-------:|:-----:|------:|-------:|:-----:|------:|-------: +| IDLE | 0 | 0 | \@ | 64 | 0,29 | ` | 96 | 9,31 +| ! | 33 | 11,30 | A | 65 | 1,29 | a | 97 | 1 +| \" | 34 | 12,30 | B | 66 | 2,29 | b | 98 | 2 +| # | 35 | 13,30 | C | 67 | 3,29 | c | 99 | 3 +| $ | 36 | 14,30 | D | 68 | 4,29 | d | 100 | 4 +| % | 37 | 15,30 | E | 69 | 5,29 | e | 101 | 5 +| & | 38 | 16,30 | F | 70 | 6,29 | f | 102 | 6 +| ' | 39 | 17,30 | G | 71 | 7,29 | g | 103 | 7 +| ( | 40 | 18,30 | H | 72 | 8,29 | h | 104 | 8 +| ) | 41 | 19,30 | I | 73 | 9,29 | i | 105 | 9 +| * | 42 | 20,30 | J | 74 | 10,29 | j | 106 | 10 +| + | 43 | 21,30 | K | 75 | 11,29 | k | 107 | 11 +| , | 44 | 27,29 | L | 76 | 12,29 | l | 108 | 12 +| - | 45 | 22,30 | M | 77 | 13,29 | m | 109 | 13 +| . | 46 | 27 | N | 78 | 14,29 | n | 110 | 14 +| / | 47 | 23,30 | O | 79 | 15,29 | o | 111 | 15 +| 0 | 48 | 10,30 | P | 80 | 16,29 | p | 112 | 16 +| 1 | 49 | 1,30 | Q | 81 | 17,29 | q | 113 | 17 +| 2 | 50 | 2,30 | R | 82 | 18,29 | r | 114 | 18 +| 3 | 51 | 3,30 | S | 83 | 19,29 | s | 115 | 19 +| 4 | 52 | 4,30 | T | 84 | 20,29 | t | 116 | 20 +| 5 | 53 | 5,30 | U | 85 | 21,29 | u | 117 | 21 +| 6 | 54 | 6,30 | V | 86 | 22,29 | v | 118 | 22 +| 7 | 55 | 7,30 | W | 87 | 23,29 | w | 119 | 23 +| 8 | 56 | 8,30 | X | 88 | 24,29 | x | 120 | 24 +| 9 | 57 | 9,30 | Y | 89 | 25,29 | y | 121 | 25 +| : | 58 | 24,30 | Z | 90 | 26,29 | z | 122 | 26 +| ; | 59 | 25,30 | [ | 91 | 1,31 | { | 123 | 6,31 +| < | 60 | 26,30 | \\ | 92 | 2,31 | \| | 124 | 7,31 +| = | 61 | 0,31 | ] | 93 | 3,31 | } | 125 | 8,31 +| > | 62 | 27,30 | ^ | 94 | 4,31 | ~ | 126 | 0,30 +| ? | 63 | 28,29 | _ | 95 | 5,31 | DEL | 127 | 28,31 +| CHAR | ASCII | VAR +:------:|------:|-------: +| CRLF | 13/10 | 28,30 +| SPACE | 32 | 28 +| ± | 241 | 10,31 +| ÷ | 246 | 11,31 +| ° | 248 | 12,31 +| × | 158 | 13,31 +| £ | 156 | 14,31 +| BS | 8 | 27,31 +
+
+ +Here is a simple analysis of projected text efficiency compared with DominoEX: +
+
+          |                       Symbols                         | Nbr
+Message   |The Quick Brown Fox jumps over the lazy dog 1234567890.|     
+DominoEX  |2211221221211211212122222112111121121221212122222222222|88   
+IFKP      |2111211111211111211111111111111111111111111122222222221|69   
+Message   |vk2abc de zl1xyz ge om ur rst529 name fred. hw? kkk    |     
+DominoEX  |222121111122222212111211111112221112112111212221222    |75   
+IFKP      |112111111111211111111111111112221111111111111121111    |57   
+
+
+It is about 27% more efficient than DominoEX. Note especially the score sending +typical 'ham speak' - some 30% more efficient than DominoEX. The typing speed at +3.65 cps is about 37 WPM. Q codes and callsigns should be sent in lower case when +possible. +
+ +Character rate statistics for various character sets when sent using IFKP, +
+
+text: abcdefghijklmnopqrstuvwxyz
+chars/sec: 3.65
+
+text: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+chars/sec: 1.84
+
+text: 0123456789
+chars/sec: 1.84
+
+text: !@#$%&*()_+-=[]{}\|;:'",\<\>/?\\
+chars/sec: 1.84
+
+ +\section IFKPspeed IFKP xmt speed + +fldigi-ifkp can transmit text in one of 3 speeds, 0.5X, 1.0X and 2.0X. The 1.0X +speed is the natural speed of the modem. The 0.5X and 2.0X speeds are obtained by +dividing or multiplying the symbol length by 2 respectively. You can expect to +experience decreased decoding errors with the 0.5X speed. Use it when s/n conditions +are well below minux 10 dB on the IFKP signal strength meter. The 2.0X speed should +probably not be used unless the s/n is well above plus 10 dB on the IFKP signal +strength meter. + +The three speeds can be selected at the time that IFKP is chosen from the mode menu. +The speed can also be changed using the IFKP modem configuration tab. The quickest +way to change speed is to left click on the left-most status indicator on the fldigi +status bar (lowest set of controls on the main dialog). A pop-up menu will appear with +the speed selections. The quick mode change and the configuration tab changes will +occur immediately even during transmission. The selection from the mode menu will +cause a complete reset of the IFKP modem. + +\section IFKPimage IFKP Image Mode + +fldigi-ifkp has the ability to transmit and receive small digital images selected +from those stored on the disk. The image transmission is similar to but not +compatible with the MFSKpic modes. IFKP images are always transmitted in a fixed +width to height ratio. The W x H format is not limited to a single ratio, nor is +it limited to just color, or just gray scale. The image mode is nearly identical +to the FSQ image mode with the exception of the RGB transmission sequence. IFKP +transmits in Blue-Green-Red order, whereas IFKP transmits in Red-Green-Blue order. +The IFKP image bandwidth is less than 400 Hz. + +The start of the picture is signalled digitally, and the receiver simply captures +data continuously for W lines of H pixels, as requested, resulting in a WxH pixel +image, then reception stops. + +IFKP Image Mode was designed for NVIS propagation on the lower HF bands. +Unlike SSTV, the pictures are sent relatively slowly, in a narrow bandwidth +(1/4 of SSTV), and as a result the picture signal to noise ratio is generally +better than SSTV for the same transmission power. As a guideline, IFKP signals +(before the picture is started) need to be about +10dB SNR for relatively +noise-free picture reception. + +IFKP pictures also offer significantly better reception than SSTV under NVIS +conditions. Because there is no picture sync, there is no risk of the picture +tearing due to timing changes, or breaking up during selective fades. All that +happens is that the image may noise up momentarily, but will stay correctly +aligned. The mode is also significantly less affected by ghosting. + +Image Format + +The images are approximately in 4:3 or 3:4 aspect ratio. IFKP images can be received +by any IFKP capable decoder. + +Available image aspect ratios / formats include: + +
    +
  • 59x74 color +
  • 160x120 color +
  • 320x240 color +
  • 640x480 grey scale +
  • 640x480 color +
  • 240x300 color +
  • 240x300 grey scale +
  • 120x150 color +
  • 120x150 grey scale +
+ +These formats correspond roughly to a portrait (3x4) and landscape (4x3) photo. +fldigi will scale any computer stored image to the target image. You should +edit the images off line to be at least close to the 3x4 or 4x3 ratio. That will +prevent the fldigi loader from distorting the loaded image. + +The image mode sampling rate is 16,000 samples/sec, the same as the text mode. +Each pixel consists of 8 samples, and there are P pixels/line. Therefore the +line period is 8 x P/16000 seconds, or the line rate 16000/(8 x P) lines/sec. +In colour, each line is sent three times, in Red-Green-Blue (RGB) order. + +As an example, if there were 320 pixels per line, and 240 lines, the line rate +would be 6.25 lines/sec, and 240 x 3 (for RGB) lines would take 115.2 seconds, or +1.92 minutes for a colour picture containing 76,800 pixels. + +There is a single sync signal sent at the beginning of each image. This sync signal +is a tone placed 186 Hz below the center frequency, or at 1384 Hertz. The sync signal +is 1.5 symbol lengths in duration, or 5.8 seconds. + +If the sound cards in the transmitting and receiving computers differ markedly +in sample rate, the resulting picture can also be skewed. A small timing +difference is enough to cause a noticeable slant in the picture. This is easily +fixed after reception using the Slant control. High quality sound cards should +be better than 5ppm, and result in barely noticeable slant, but some cheaper +computer built-in sound modules may be rather worse. If you plan to send IFKP +images you should calibrate your sound card to WWV. + +Transmit Image + +Transmitting an image in IFKP is initiated by selecting the "Send image" menu item +from the pop up Tx menu. Right click on the Tx panel + +
+\image html ifkp-send-image.png "Send Image" +\image latex ifkp-send-image.png "Send Image" width=2in +
+ +This selection opens up the Send Image dialog + +
+\image html ifkp-image-xmt.png "Send Image Dialog" +\image latex ifkp-image-xmt.png "Send Image Dialog" width=3.5in +
+ +shown with a 160x120 color image loaded and ready to transmit. + +Transmission begins when you press the "Xmt" button. fldigi will insert the text +preamble and immediately begin the image transmission. fldigi returns to the receive +mode when the image transmission is completed. + +
+\image html ifkp-WF-image-mode.png "Image Mode Waterfall" +\image latex ifkp-WF-image-mode.png "Image Mode Waterfall" width=3.5in +
+ +Receive Image + +Reception is completely automatic. The decoder will identify the picture start, +and record the picture. In doing so, it automatically opens a separate "IFKP Rx Image" dialog. + +
+\image html ifkp-image-partial.png "Image Reception" +\image latex ifkp-image-partial.png "Image Reception" width=3.5in +
+ +Demodulation uses a phase detection algorithm based on quadrature demodulation +using the current and previous samples at 16000 samples/sec. All the samples are +converted to pixels and stored, but only the average over every 16 samples is +displayed. + +The raw image is stored in a temporary buffer of expanded size, which allows +fine adjustment of the slant and phase to be made before the image is sampled +and displayed. + +If the transmitting station goes off the air or reception is lost during +recording of a picture, the recording will continue until the necessary number +of samples has been made, then reception stops. + +
+\image html ifkp-image-completed.png "Image Reception Completed" +\image latex ifkp-image-completed.png "Image Reception Completed" width=3.5in +
+ +The Rx Image dialog controls from left to right are: +- Reset: clears all rx data +- Phase adjustment: moves image left and right +- Slant adjustment: slews image diagonally +- Save: saves the image to the fldigi image folder with a date-time stamped file name +- Close: closes the image dialog + +Image phase and slant should not be adjusted before the picture reception has +finished, as then only part of the image will be corrected. + +\section ifkp_avatars Avatars + +Avatar images are 59 x 74 (width x height) color images that are associated with +a call sign. The avatar images are stored in the folder + +
+C:\\Documents and Settings\\\\\fldigi.files\\avatars\\
+C:\\Users\\\\\fldigi.files\\avatars\\
+/home/\/.fldigi/avatars/
+
+ +as "png" images. + +You should prepare an image file for your own call sign, in lower case. For example + +
+/home/dave/.fldigi/avatars/w1hkj.png
+
+ +in a 4x5 aspect ratio, preferably in the 59x74 format, but any larger 4x5 image can be used. +fldigi will scale the image to 59x74 when it is read from the file. + +You can send your avatar very simply by right clicking on the IFKP avatar. + +If you receive an avatar from another station it will automatically be displayed in +the avatar box. You should have previously entered the call sign of the other station in +the Call logging control. Left clicking on the avatar will then save the image in the +avatars folder with the appropriate callsign. The correct avatar will then be displayed +the next time you enter that call sign in the Call logging control. This is an example +of a received avatar with timing misalignment. + +
+
+\image html ifkp-avatar-1.png "received avatar" +\image latex ifkp-avatar-1.png "received avatar" width=1.0in +
+
+ +The received image may be misaligned left or right in the image box. This is caused +by an error in the start timing of the reception. You can realign the image using a +combination of SHIFT, CONTROL and LEFT/RIGHT mouse clicks on the image. Be careful +to use either the SHIFT or CONTROL in combination with the mouse button. Mouse left +and right click without the SHIFT/CONTROL will cause either a save or an own avatar +transmit to occur. + +
+CONTROL LEFT click  - move image left by 1 pixel
+SHIFT   LEFT click  - move image left by 5 pixels
+
+CONTROL RIGHT click - move image right by 1 pixel
+SHIFT   RIGHT click - move image right by 5 pixels
+
+ +The same image after alignment. + +
+
+\image html ifkp-avatar-2.png "received avatar" +\image latex ifkp-avatar-2.png "received avatar" width=1.0in +
+
+ +You will probably need to manage the avatar images using your OS file explorer. Easy +access to the image folder is obtained by the menu item File/Folders. + +The avatar image format is identical to the IFKP image 59x74 format. If you receive +and save a 59x74 image you can always rename the saved image (date-time-stamped) to +a \"callsign.png\" in the avatar folder. + +\ref ifkp_page "Return to Top of Page" +
+\ref main_page "Return to Main Page" +*/ + diff --git a/fldigi_doxygen/user_src_docs/configIFKP.txt b/fldigi_doxygen/user_src_docs/configIFKP.txt new file mode 100644 index 00000000..4ea113b5 --- /dev/null +++ b/fldigi_doxygen/user_src_docs/configIFKP.txt @@ -0,0 +1,74 @@ +/** +\page ifkp_configuration_page IFKP Configuration + +\tableofcontents +\image html config-ifkp.png "" +\image latex config-ifkp.png "" width=5.0in +
+ +\section IFKP_tx_parameters Tx Parameters + +IFKP transmissions can occur ar 0.5, 1, or 2 times the nominal baud rate. The +baud rate can be selected on the IFKP configuration tab, or by left clicking on the left +most entry on the fldigi main dialog status bar. + +Lower case letters are transmitted within a single symbol length, while +upper case letters require two symbols. You may configure IFKP to always +transmit your own call sign, MYCALL, and the other call, CALLSIGN, using +lower case letters. + +The transmit center frequency can be locked to 1500 Hertz. + +\section IFKP_logging Logging + +Any of the text in the Rx Panel for copy, and saving to a file. Simply +right click on the panel for a pop menu. + +Fldigi's IFKP can save a continuous record of all received date to +an audit log. The heard list can also save a record of all stations +added to the IFKP heard list. These logs are named IFKP_audit_log.txt and +IFKP_heard_log.txt respectively. The logs are never cleared unless the operator +does so using the operating system file handling facilities. Data is +appended to each log as it occurs. These logs are located in the fldigi temp folder: +
+
+
XPC:\\Documents and Settings\\\\fldigi.files\\tempC:\\Documents and Settings\\\\\fldigi.files\\temp
VistaC:\\Users\\\\fldigi.files\\tempC:\\Users\\\\\fldigi.files\\temp
Win7C:\\Users\\\\fldigi.files\\tempC:\\Users\\\\\fldigi.files\\temp
Win8C:\\Users\\\\fldigi.files\\tempC:\\Users\\\\\fldigi.files\\temp
Linux
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
XPC:\\Documents and Settings\\\\\fldigi.files\\temp
VistaC:\\Users\\\\\fldigi.files\\temp
Win7C:\\Users\\\\\fldigi.files\\temp
Win8C:\\Users\\\\\fldigi.files\\temp
Linux/home/\/.fldigi/temp
OS X/home/\/.fldigi/temp
Unix/home/\/.fldigi/temp
+ + +You can change the name of each log and elect to disable the logging functions. + +
+\ref ifkp_configuration_page "Return to Top of Page" +
+\ref main_page "Return to Main Page" + +*/ diff --git a/fldigi_doxygen/user_src_docs/fldigi_configuration.txt b/fldigi_doxygen/user_src_docs/fldigi_configuration.txt index 844c2d6f..47cf277b 100644 --- a/fldigi_doxygen/user_src_docs/fldigi_configuration.txt +++ b/fldigi_doxygen/user_src_docs/fldigi_configuration.txt @@ -77,6 +77,7 @@ but the defaults should be satisfactory for most users.
  • \subpage domino_ex_configuration_page
  • \subpage feld_hell_configuration_page
  • \subpage fsq_configuration_page
  • +
  • \subpage ifkp_configuration_page
  • \subpage id_configuration_page
  • \subpage miscellaneous_configuration_page
  • \subpage mt63_configuration_page
  • diff --git a/fldigi_doxygen/user_src_docs/fldigi_modems.txt b/fldigi_doxygen/user_src_docs/fldigi_modems.txt index 8c1be970..6decc505 100644 --- a/fldigi_doxygen/user_src_docs/fldigi_modems.txt +++ b/fldigi_doxygen/user_src_docs/fldigi_modems.txt @@ -8,6 +8,7 @@
  • \subpage domino_ex_page
  • \subpage feld_hell_page
  • \subpage fsq_page
  • +
  • \subpage ifkp_page
  • \subpage mfsk_page
  • \subpage mt63_page
  • \subpage navtex_and_sitorb_page
  • diff --git a/fldigi_doxygen/user_src_docs/index_order.txt b/fldigi_doxygen/user_src_docs/index_order.txt index ba5ca7a3..da9d19aa 100644 --- a/fldigi_doxygen/user_src_docs/index_order.txt +++ b/fldigi_doxygen/user_src_docs/index_order.txt @@ -2,7 +2,8 @@ fldigi_configuration.txt fldigi_developer.txt fldigi_logging.txt \ fldigi_macros.txt fldigi_modems.txt fldigi_operating.txt \ New-Install.txt thumb_drive.txt colorsandfonts.txt \ configcallsigndb.txt configContestia.txt configCW.txt \ -configDomEX.txt configFSQ.txt configFH.txt ConfigID.txt ConfigMisc.txt \ +configDomEX.txt configFSQ.txt configFH.txt ConfigID.txt \ +configIFKP.txt ConfigMisc.txt \ configMT63.txt configOlivia.txt ConfigOperator.txt configPSK.txt \ configRTTY.txt configThor.txt ConfigUI-browser.txt \ ConfigUI-contest.txt ConfigUI-general.txt ConfigUI-logging.txt \ @@ -10,7 +11,8 @@ ConfigUI-macros.txt ConfigUI-WF-controls.txt ConfigWaterfall.txt \ SoundCardSetup.txt Contest-How-To.txt cabrilloreporter.txt \ Logbook.txt LogExports.txt working_logs.txt Macros.txt \ InlineMacroTags.txt atMacroTags.txt advanced_qsy.txt execmacro.txt CW.txt \ -DominoEX.txt hell.txt Contestia.txt MFSK.txt MT63.txt FSQ.txt \ +DominoEX.txt hell.txt Contestia.txt MFSK.txt MT63.txt \ +FSQ.txt IFKP.txt \ Navtex.txt psk.txt Olivia.txt RTTYFSK.txt Thor.txt \ throb.txt tune.txt WEFAX.txt WWV-xmt.txt FrequencyAnalysis.txt \ DigiscopeDisplay.txt DigiWWV.txt map.txt MousingKeyboardShortcuts.txt \ diff --git a/src/Makefile.am b/src/Makefile.am index 07b4152b..69a2ed53 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -475,6 +475,7 @@ fldigi_SOURCES += \ include/viterbi.h \ include/waterfall.h \ include/fsq.h \ + include/ifkp.h \ include/wwv.h \ include/xmlreader.h \ include/adif_def.h \ @@ -605,6 +606,7 @@ fldigi_SOURCES += \ widgets/smeter.cxx \ widgets/pwrmeter.cxx \ fsq/fsq.cxx \ + ifkp/ifkp.cxx \ fsq/fsq_monitor.cxx \ wwv/analysis.cxx \ wwv/fftscan.cxx \ @@ -643,6 +645,10 @@ EXTRA_fldigi_SOURCES += \ include/Fl_Text_Editor_mod.H \ fsq/fsq-pic.cxx \ fsq/bitmaps.cxx \ + ifkp/ifkp_bitmaps.cxx \ + ifkp/ifkp_varicode.cxx \ + ifkp/ifkp-pic.cxx \ + ifkp/tux.cxx \ mfsk/mfsk-pic.cxx \ mt63/alias_1k.dat \ mt63/alias_2k.dat \ diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index c71f002c..8bdab147 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -63,6 +63,10 @@ static void cbRxFontBrowser(Fl_Widget*, void*) { fsq_rx_text->setFontSize(size); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); + ifkp_rx_text->setFont(font); + ifkp_rx_text->setFontSize(size); + ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); + font_browser->hide(); progdefaults.changed = true; @@ -90,7 +94,11 @@ static void cbTxFontBrowser(Fl_Widget*, void*) { fsq_tx_text->setFontSize(size); fsq_tx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); - font_browser->hide(); + ifkp_rx_text->setFont(font); + ifkp_rx_text->setFontSize(size); + ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); + + font_browser->hide(); progdefaults.changed = true; } @@ -2991,6 +2999,106 @@ fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND) progdefaults.changed = true; } +Fl_Group *tabIFKP=(Fl_Group *)0; + +static void cb_btn_ifkpbaud(Fl_Round_Button* o, void*) { + if (o->value() == 1) { +progdefaults.ifkp_baud = 0; +btn_ifkpbaud[1]->value(0); +btn_ifkpbaud[2]->value(0); +} +progdefaults.changed = true; +} + +static void cb_btn_ifkpbaud1(Fl_Round_Button* o, void*) { + if (o->value() == 1) { +progdefaults.ifkp_baud = 1; +btn_ifkpbaud[0]->value(0); +btn_ifkpbaud[2]->value(0); +} +progdefaults.changed = true; +} + +Fl_Round_Button *btn_ifkpbaud[3]={(Fl_Round_Button *)0}; + +static void cb_btn_ifkpbaud2(Fl_Round_Button* o, void*) { + if (o->value() == 1) { +progdefaults.ifkp_baud = 2; +btn_ifkpbaud[0]->value(0); +btn_ifkpbaud[1]->value(0); +} +progdefaults.changed = true; +} + +Fl_Check_Button *btn_ifkp_lowercase=(Fl_Check_Button *)0; + +static void cb_btn_ifkp_lowercase(Fl_Check_Button* o, void*) { + progdefaults.ifkp_lowercase=o->value(); +progdefaults.changed = true; +} + +Fl_Check_Button *btn_ifkp_lowercase_call=(Fl_Check_Button *)0; + +static void cb_btn_ifkp_lowercase_call(Fl_Check_Button* o, void*) { + progdefaults.ifkp_lowercase_call=o->value(); +progdefaults.changed = true; +} + +Fl_Check_Button *btn_ifkp_freqlock=(Fl_Check_Button *)0; + +static void cb_btn_ifkp_freqlock(Fl_Check_Button* o, void*) { + progdefaults.ifkp_freqlock=o->value(); +if (active_modem == ifkp_modem && + o->value() ) + active_modem->set_freq(1500); +progdefaults.changed = true; +} + +Fl_Output *txt_ifkp_audit_log=(Fl_Output *)0; + +Fl_Light_Button *btn_enable_ifkp_audit_log=(Fl_Light_Button *)0; + +static void cb_btn_enable_ifkp_audit_log(Fl_Light_Button* o, void*) { + progdefaults.ifkp_enable_audit_log = o->value(); +progdefaults.changed = true; +} + +Fl_Button *btn_ifkp_select_auditlog=(Fl_Button *)0; + +static void cb_btn_ifkp_select_auditlog(Fl_Button*, void*) { + std::string str = std::string(TempDir); +str.append(progdefaults.ifkp_audit_log); +const char *fname = FSEL::saveas("Audit log", "*.txt\t*", str.c_str()); + +if (fname) { + progdefaults.ifkp_audit_log = fl_filename_name(fname); + txt_ifkp_audit_log->value(progdefaults.ifkp_audit_log.c_str()); + progdefaults.changed = true; +}; +} + +Fl_Output *txt_ifkp_heard_log=(Fl_Output *)0; + +Fl_Light_Button *btn_enable_ifkp_heard_log=(Fl_Light_Button *)0; + +static void cb_btn_enable_ifkp_heard_log(Fl_Light_Button* o, void*) { + progdefaults.ifkp_enable_heard_log = o->value(); +progdefaults.changed = true; +} + +Fl_Button *btn_select_ifkp_heard_log=(Fl_Button *)0; + +static void cb_btn_select_ifkp_heard_log(Fl_Button*, void*) { + std::string str = std::string(TempDir); +str.append(progdefaults.ifkp_heard_log); +const char *fname = FSEL::saveas("Heard log", "*.txt\t*", str.c_str()); +if (fname) { + progdefaults.ifkp_heard_log = fl_filename_name(fname); + txt_ifkp_heard_log->value(progdefaults.ifkp_heard_log.c_str()); + progdefaults.changed = true; +}; +} + Fl_Group *tabMT63=(Fl_Group *)0; Fl_Check_Button *btnMT63_8bit=(Fl_Check_Button *)0; @@ -5590,7 +5698,6 @@ Fl_Double_Window* ConfigureDialog() { tabOperator->tooltip(_("Operator information")); tabOperator->callback((Fl_Callback*)cb_tabOperator); tabOperator->when(FL_WHEN_CHANGED); - tabOperator->hide(); { Fl_Group* o = new Fl_Group(55, 35, 490, 170, _("Station")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -7284,11 +7391,11 @@ i on a\ntouch screen device such as a tablet.")); tabWaterfall->end(); } // Fl_Group* tabWaterfall { tabModems = new Fl_Group(0, 25, 600, 355, _("Modems")); + tabModems->hide(); { tabsModems = new Fl_Tabs(0, 25, 600, 355); tabsModems->selection_color(FL_LIGHT1); tabsModems->align(Fl_Align(FL_ALIGN_TOP_RIGHT)); { tabCW = new Fl_Group(0, 50, 600, 330, _("CW")); - tabCW->hide(); { tabsCW = new Fl_Tabs(0, 50, 600, 330); tabsCW->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("General")); @@ -8073,6 +8180,7 @@ i on a\ntouch screen device such as a tablet.")); tabFeld->end(); } // Fl_Group* tabFeld { tabFSQ = new Fl_Group(0, 50, 600, 330, _("FSQ")); + tabFSQ->hide(); { Fl_Group* o = new Fl_Group(5, 60, 585, 66, _("Rx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -8233,6 +8341,76 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o tabFSQ->end(); } // Fl_Group* tabFSQ + { tabIFKP = new Fl_Group(0, 50, 600, 330, _("IFKP")); + tabIFKP->hide(); + { Fl_Group* o = new Fl_Group(5, 65, 587, 120, _("Tx Parameters")); + o->box(FL_ENGRAVED_BOX); + o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); + { Fl_Round_Button* o = btn_ifkpbaud[0] = new Fl_Round_Button(100, 93, 100, 17, _("1/2 speed")); + btn_ifkpbaud[0]->down_box(FL_ROUND_DOWN_BOX); + btn_ifkpbaud[0]->callback((Fl_Callback*)cb_btn_ifkpbaud); + o->value(progdefaults.ifkp_baud == 0); + } // Fl_Round_Button* btn_ifkpbaud[0] + { Fl_Round_Button* o = btn_ifkpbaud[1] = new Fl_Round_Button(208, 93, 100, 17, _("1x speed")); + btn_ifkpbaud[1]->tooltip(_("default")); + btn_ifkpbaud[1]->down_box(FL_ROUND_DOWN_BOX); + btn_ifkpbaud[1]->callback((Fl_Callback*)cb_btn_ifkpbaud1); + o->value(progdefaults.ifkp_baud == 1); + } // Fl_Round_Button* btn_ifkpbaud[1] + { Fl_Round_Button* o = btn_ifkpbaud[2] = new Fl_Round_Button(316, 93, 100, 17, _("2x speed")); + btn_ifkpbaud[2]->down_box(FL_ROUND_DOWN_BOX); + btn_ifkpbaud[2]->callback((Fl_Callback*)cb_btn_ifkpbaud2); + o->value(progdefaults.ifkp_baud == 2); + } // Fl_Round_Button* btn_ifkpbaud[2] + { Fl_Check_Button* o = btn_ifkp_lowercase = new Fl_Check_Button(100, 125, 220, 15, _("MYCALL always lower case")); + btn_ifkp_lowercase->tooltip(_("convert operator callsign to lower case")); + btn_ifkp_lowercase->down_box(FL_DOWN_BOX); + btn_ifkp_lowercase->callback((Fl_Callback*)cb_btn_ifkp_lowercase); + o->value(progdefaults.ifkp_lowercase); + } // Fl_Check_Button* btn_ifkp_lowercase + { Fl_Check_Button* o = btn_ifkp_lowercase_call = new Fl_Check_Button(325, 125, 220, 15, _("CALLSIGN always lower case")); + btn_ifkp_lowercase_call->tooltip(_("convert other callsign to lower case")); + btn_ifkp_lowercase_call->down_box(FL_DOWN_BOX); + btn_ifkp_lowercase_call->callback((Fl_Callback*)cb_btn_ifkp_lowercase_call); + o->value(progdefaults.ifkp_lowercase_call); + } // Fl_Check_Button* btn_ifkp_lowercase_call + { Fl_Check_Button* o = btn_ifkp_freqlock = new Fl_Check_Button(100, 155, 220, 15, _("lock WF at 1500 Hz")); + btn_ifkp_freqlock->tooltip(_("Always transmit at 1500 Hertz center freq.")); + btn_ifkp_freqlock->down_box(FL_DOWN_BOX); + btn_ifkp_freqlock->callback((Fl_Callback*)cb_btn_ifkp_freqlock); + o->value(progdefaults.ifkp_freqlock); + } // Fl_Check_Button* btn_ifkp_freqlock + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(5, 190, 587, 100, _("Logging")); + o->box(FL_ENGRAVED_BOX); + o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); + { Fl_Output* o = txt_ifkp_audit_log = new Fl_Output(92, 220, 323, 25, _("Audit log")); + o->value(progdefaults.ifkp_audit_log.c_str()); + } // Fl_Output* txt_ifkp_audit_log + { Fl_Light_Button* o = btn_enable_ifkp_audit_log = new Fl_Light_Button(429, 220, 73, 25, _("Enable")); + btn_enable_ifkp_audit_log->selection_color((Fl_Color)2); + btn_enable_ifkp_audit_log->callback((Fl_Callback*)cb_btn_enable_ifkp_audit_log); + o->value(progdefaults.ifkp_enable_audit_log); + } // Fl_Light_Button* btn_enable_ifkp_audit_log + { btn_ifkp_select_auditlog = new Fl_Button(510, 220, 70, 25, _("Select")); + btn_ifkp_select_auditlog->callback((Fl_Callback*)cb_btn_ifkp_select_auditlog); + } // Fl_Button* btn_ifkp_select_auditlog + { Fl_Output* o = txt_ifkp_heard_log = new Fl_Output(92, 249, 323, 25, _("Heard log")); + o->value(progdefaults.ifkp_heard_log.c_str()); + } // Fl_Output* txt_ifkp_heard_log + { Fl_Light_Button* o = btn_enable_ifkp_heard_log = new Fl_Light_Button(429, 249, 73, 25, _("Enable")); + btn_enable_ifkp_heard_log->selection_color((Fl_Color)2); + btn_enable_ifkp_heard_log->callback((Fl_Callback*)cb_btn_enable_ifkp_heard_log); + o->value(progdefaults.ifkp_enable_heard_log); + } // Fl_Light_Button* btn_enable_ifkp_heard_log + { btn_select_ifkp_heard_log = new Fl_Button(510, 249, 70, 25, _("Select")); + btn_select_ifkp_heard_log->callback((Fl_Callback*)cb_btn_select_ifkp_heard_log); + } // Fl_Button* btn_select_ifkp_heard_log + o->end(); + } // Fl_Group* o + tabIFKP->end(); + } // Fl_Group* tabIFKP { tabMT63 = new Fl_Group(0, 50, 600, 330, _("MT-63")); tabMT63->hide(); { Fl_Group* o = new Fl_Group(55, 73, 490, 84); @@ -8292,7 +8470,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o tabMT63->end(); } // Fl_Group* tabMT63 - { tabOlivia = new Fl_Group(0, 50, 600, 330, _("Olivia")); + { tabOlivia = new Fl_Group(0, 50, 600, 330, _("Oliv")); tabOlivia->hide(); { Fl_Group* o = new Fl_Group(55, 76, 490, 280); o->box(FL_ENGRAVED_FRAME); @@ -8388,7 +8566,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o tabOlivia->end(); } // Fl_Group* tabOlivia - { tabContestia = new Fl_Group(0, 50, 600, 330, _("Cont\'")); + { tabContestia = new Fl_Group(0, 50, 600, 330, _("Cont")); tabContestia->hide(); { Fl_Group* o = new Fl_Group(55, 80, 490, 200); o->box(FL_ENGRAVED_FRAME); @@ -8621,7 +8799,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Tabs* tabsPSK tabPSK->end(); } // Fl_Group* tabPSK - { tabRTTY = new Fl_Group(0, 50, 600, 330, _("RTTY")); + { tabRTTY = new Fl_Group(0, 50, 600, 330, _("TTY")); tabRTTY->hide(); { tabsRTTY = new Fl_Tabs(0, 50, 600, 330); tabsRTTY->selection_color(FL_LIGHT1); @@ -9032,7 +9210,7 @@ le Earth)")); } // Fl_Check_Button* btnNvtxKmlLog tabNavtex->end(); } // Fl_Group* tabNavtex - { tabWefax = new Fl_Group(0, 50, 600, 330, _("WFax")); + { tabWefax = new Fl_Group(0, 50, 600, 330, _("WFx")); tabWefax->hide(); { Fl_Group* o = new Fl_Group(2, 63, 598, 300); { Fl_Check_Button* o = btnWefaxAdifLog = new Fl_Check_Button(94, 137, 235, 30, _("Log Wefax messages to Adif file")); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 2637b7b7..079a428f 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -149,6 +149,10 @@ Function {cbRxFontBrowser(Fl_Widget*, void*)} {open private return_type void fsq_rx_text->setFontSize(size); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); + ifkp_rx_text->setFont(font); + ifkp_rx_text->setFontSize(size); + ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); + font_browser->hide(); progdefaults.changed = true;} {} @@ -177,7 +181,11 @@ Function {cbTxFontBrowser(Fl_Widget*, void*)} {open private return_type void fsq_tx_text->setFontSize(size); fsq_tx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); - font_browser->hide(); + ifkp_rx_text->setFont(font); + ifkp_rx_text->setFontSize(size); + ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); + + font_browser->hide(); progdefaults.changed = true;} {} } @@ -358,8 +366,8 @@ static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} } { Fl_Group tabOperator { label Operator - callback {progdefaults.changed = true;} open - tooltip {Operator information} xywh {0 25 600 355} when 1 hide + callback {progdefaults.changed = true;} open selected + tooltip {Operator information} xywh {0 25 600 355} when 1 } { Fl_Group {} { label Station open @@ -2820,14 +2828,14 @@ behaves inside the waterfall} xywh {65 207 150 22} box DOWN_BOX color 7 align 8 } Fl_Group tabModems { label Modems open - xywh {0 25 600 355} + xywh {0 25 600 355} hide } { Fl_Tabs tabsModems {open xywh {0 25 600 355} selection_color 50 align 9 } { Fl_Group tabCW { label CW open - xywh {0 50 600 330} hide + xywh {0 50 600 330} } { Fl_Tabs tabsCW {open xywh {0 50 600 330} selection_color 50 @@ -3434,7 +3442,7 @@ progdefaults.changed = true;} } Fl_Group tabFSQ { label FSQ open - xywh {0 50 600 330} + xywh {0 50 600 330} hide } { Fl_Group {} { label {Rx Parameters} open @@ -3616,7 +3624,7 @@ if (fname) { } } Fl_Group {} { - label {Text Colors} open selected + label {Text Colors} open xywh {5 318 585 55} box ENGRAVED_BOX align 21 } { Fl_Button btn_fsq_xmt_color { @@ -3681,6 +3689,128 @@ progdefaults.changed = true;} } } } + Fl_Group tabIFKP { + label IFKP open + xywh {0 50 600 330} hide + } { + Fl_Group {} { + label {Tx Parameters} open + xywh {5 65 587 120} box ENGRAVED_BOX align 21 + } { + Fl_Round_Button {btn_ifkpbaud[0]} { + label {1/2 speed} + callback {if (o->value() == 1) { +progdefaults.ifkp_baud = 0; +btn_ifkpbaud[1]->value(0); +btn_ifkpbaud[2]->value(0); +} +progdefaults.changed = true;} + xywh {100 93 100 17} down_box ROUND_DOWN_BOX + code0 {o->value(progdefaults.ifkp_baud == 0);} + } + Fl_Round_Button {btn_ifkpbaud[1]} { + label {1x speed} + callback {if (o->value() == 1) { +progdefaults.ifkp_baud = 1; +btn_ifkpbaud[0]->value(0); +btn_ifkpbaud[2]->value(0); +} +progdefaults.changed = true;} + tooltip default xywh {208 93 100 17} down_box ROUND_DOWN_BOX + code0 {o->value(progdefaults.ifkp_baud == 1);} + } + Fl_Round_Button {btn_ifkpbaud[2]} { + label {2x speed} + callback {if (o->value() == 1) { +progdefaults.ifkp_baud = 2; +btn_ifkpbaud[0]->value(0); +btn_ifkpbaud[1]->value(0); +} +progdefaults.changed = true;} + xywh {316 93 100 17} down_box ROUND_DOWN_BOX + code0 {o->value(progdefaults.ifkp_baud == 2);} + } + Fl_Check_Button btn_ifkp_lowercase { + label {MYCALL always lower case} + callback {progdefaults.ifkp_lowercase=o->value(); +progdefaults.changed = true;} + tooltip {convert operator callsign to lower case} xywh {100 125 220 15} down_box DOWN_BOX + code0 {o->value(progdefaults.ifkp_lowercase);} + } + Fl_Check_Button btn_ifkp_lowercase_call { + label {CALLSIGN always lower case} + callback {progdefaults.ifkp_lowercase_call=o->value(); +progdefaults.changed = true;} + tooltip {convert other callsign to lower case} xywh {325 125 220 15} down_box DOWN_BOX + code0 {o->value(progdefaults.ifkp_lowercase_call);} + } + Fl_Check_Button btn_ifkp_freqlock { + label {lock WF at 1500 Hz} + callback {progdefaults.ifkp_freqlock=o->value(); +if (active_modem == ifkp_modem && + o->value() ) + active_modem->set_freq(1500); +progdefaults.changed = true;} + tooltip {Always transmit at 1500 Hertz center freq.} xywh {100 155 220 15} down_box DOWN_BOX + code0 {\#include "trx.h"} + code1 {o->value(progdefaults.ifkp_freqlock);} + } + } + Fl_Group {} { + label Logging open + xywh {5 190 587 100} box ENGRAVED_BOX align 21 + } { + Fl_Output txt_ifkp_audit_log { + label {Audit log} + xywh {92 220 323 25} + code0 {o->value(progdefaults.ifkp_audit_log.c_str());} + } + Fl_Light_Button btn_enable_ifkp_audit_log { + label Enable + callback {progdefaults.ifkp_enable_audit_log = o->value(); +progdefaults.changed = true;} + xywh {429 220 73 25} selection_color 2 + code0 {o->value(progdefaults.ifkp_enable_audit_log);} + } + Fl_Button btn_ifkp_select_auditlog { + label Select + callback {std::string str = std::string(TempDir); +str.append(progdefaults.ifkp_audit_log); +const char *fname = FSEL::saveas("Audit log", "*.txt\\t*", str.c_str()); + +if (fname) { + progdefaults.ifkp_audit_log = fl_filename_name(fname); + txt_ifkp_audit_log->value(progdefaults.ifkp_audit_log.c_str()); + progdefaults.changed = true; +}} + xywh {510 220 70 25} + } + Fl_Output txt_ifkp_heard_log { + label {Heard log} + xywh {92 249 323 25} + code0 {o->value(progdefaults.ifkp_heard_log.c_str());} + } + Fl_Light_Button btn_enable_ifkp_heard_log { + label Enable + callback {progdefaults.ifkp_enable_heard_log = o->value(); +progdefaults.changed = true;} + xywh {429 249 73 25} selection_color 2 + code0 {o->value(progdefaults.ifkp_enable_heard_log);} + } + Fl_Button btn_select_ifkp_heard_log { + label Select + callback {std::string str = std::string(TempDir); +str.append(progdefaults.ifkp_heard_log); +const char *fname = FSEL::saveas("Heard log", "*.txt\\t*", str.c_str()); +if (fname) { + progdefaults.ifkp_heard_log = fl_filename_name(fname); + txt_ifkp_heard_log->value(progdefaults.ifkp_heard_log.c_str()); + progdefaults.changed = true; +}} + xywh {510 249 70 25} + } + } + } Fl_Group tabMT63 { label {MT-63} open xywh {0 50 600 330} hide @@ -3747,7 +3877,7 @@ progdefaults.changed = true;} } } Fl_Group tabOlivia { - label Olivia open + label Oliv open xywh {0 50 600 330} hide } { Fl_Group {} { @@ -3816,7 +3946,7 @@ progdefaults.changed = true;} } } Fl_Group tabContestia { - label {Cont'} open + label Cont open xywh {0 50 600 330} hide } { Fl_Group {} {open @@ -3977,7 +4107,7 @@ progdefaults.changed = true;} } } Fl_Group tabRTTY { - label RTTY open + label TTY open xywh {0 50 600 330} hide } { Fl_Tabs tabsRTTY {open @@ -4352,7 +4482,7 @@ progdefaults.changed = true;} } } Fl_Group tabWefax { - label WFax open + label WFx open xywh {0 50 600 330} hide } { Fl_Group {} {open diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index c2d1176d..fc17e87f 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -93,6 +93,7 @@ #include "throb.h" //#include "pkt.h" #include "fsq.h" +#include "ifkp.h" #include "wwv.h" #include "analysis.h" #include "fftscan.h" @@ -259,6 +260,18 @@ Fl_Button *btn_FSQQTC = (Fl_Button *)0; Progress *ind_fsq_speed = (Progress *)0; Progress *ind_fsq_s2n = (Progress *)0; +//------------------------------------------------------------------------------ +// groups and widgets used exclusively for IFKP +Fl_Group *ifkp_group = (Fl_Group *)0; +Fl_Box *ifkp_minbox = (Fl_Box *)0; +Fl_Group *ifkp_left = (Fl_Group *)0; +FTextRX *ifkp_rx_text = (FTextRX *)0; +FTextTX *ifkp_tx_text = (FTextTX *)0; +Fl_Group *ifkp_right = (Fl_Group *)0; +Fl_Browser *ifkp_heard = (Fl_Browser *)0; +Progress *ifkp_s2n_progress = (Progress *)0; +picture *ifkp_avatar = (picture *)0; + //------------------------------------------------------------------------------ Fl_Group *macroFrame1 = 0; @@ -493,6 +506,14 @@ void cb_fsq3(Fl_Widget *w, void *arg); void cb_fsq4p5(Fl_Widget *w, void *arg); void cb_fsq6(Fl_Widget *w, void *arg); +void cb_ifkp0p5(Fl_Widget *w, void *arg); +void cb_ifkp1p0(Fl_Widget *w, void *arg); +void cb_ifkp2p0(Fl_Widget *w, void *arg); + +void cb_ifkp0p5a(Fl_Widget *w, void *arg); +void cb_ifkp1p0a(Fl_Widget *w, void *arg); +void cb_ifkp2p0a(Fl_Widget *w, void *arg); + void set_colors(); //void cb_pkt1200(Fl_Widget *w, void *arg); @@ -712,6 +733,13 @@ static const Fl_Menu_Item quick_change_fsq[] = { { 0 } }; +static const Fl_Menu_Item quick_change_ifkp[] = { + { "IFKP 0.5", 0, cb_ifkp0p5a, (void *)MODE_IFKP }, + { "IFKP 1.0", 0, cb_ifkp1p0a, (void *)MODE_IFKP }, + { "IFKP 2.0", 0, cb_ifkp2p0a, (void *)MODE_IFKP }, + { 0} +}; + //Fl_Menu_Item quick_change_pkt[] = { // { " 300 baud", 0, cb_pkt300, (void *)MODE_PACKET }, // { "1200 baud", 0, cb_pkt1200, (void *)MODE_PACKET }, @@ -975,6 +1003,63 @@ void cb_fsq6(Fl_Widget *w, void *arg) cb_init_mode(w, arg); } +void set_ifkp_tab_widgets() +{ + btn_ifkpbaud[0]->value(0); + btn_ifkpbaud[1]->value(0); + btn_ifkpbaud[2]->value(0); + if (progdefaults.ifkp_baud == 0) { + btn_ifkpbaud[0]->value(1); + put_MODEstatus("IFKP 0.5"); + } else if (progdefaults.ifkp_baud == 1) { + btn_ifkpbaud[1]->value(1); + put_MODEstatus("IFKP 1.0"); + } + else { + btn_ifkpbaud[2]->value(1); + put_MODEstatus("IFKP 2.0"); + } +} + +void cb_ifkp0p5 (Fl_Widget *w, void *arg) +{ + progdefaults.ifkp_baud = 0; + set_ifkp_tab_widgets(); + cb_init_mode(w, arg); +} + +void cb_ifkp0p5a (Fl_Widget *w, void *arg) +{ + progdefaults.ifkp_baud = 0; + set_ifkp_tab_widgets(); +} + +void cb_ifkp1p0 (Fl_Widget *w, void *arg) +{ + progdefaults.ifkp_baud = 1; + set_ifkp_tab_widgets(); + cb_init_mode(w, arg); +} + +void cb_ifkp1p0a (Fl_Widget *w, void *arg) +{ + progdefaults.ifkp_baud = 1; + set_ifkp_tab_widgets(); +} + +void cb_ifkp2p0 (Fl_Widget *w, void *arg) +{ + progdefaults.ifkp_baud = 2; + set_ifkp_tab_widgets(); + cb_init_mode(w, arg); +} + +void cb_ifkp2p0a (Fl_Widget *w, void *arg) +{ + progdefaults.ifkp_baud = 2; + set_ifkp_tab_widgets(); +} + void set_dominoex_tab_widgets() { chkDominoEX_FEC->value(progdefaults.DOMINOEX_FEC); @@ -1026,17 +1111,26 @@ void startup_modem(modem* m, int f) if (id >= MODE_WEFAX_FIRST && id <= MODE_WEFAX_LAST) { center_group->hide(); fsq_group->hide(); + ifkp_group->hide(); wefax_group->show(); wefax_group->redraw(); } else if (id == MODE_FSQ) { center_group->hide(); wefax_group->hide(); + ifkp_group->hide(); fsq_group->show(); fsq_group->redraw(); + } else if (id == MODE_IFKP) { + center_group->hide(); + wefax_group->hide(); + fsq_group->hide(); + ifkp_group->show(); + ifkp_group->redraw(); } else { center_group->show(); wefax_group->hide(); fsq_group->hide(); + ifkp_group->hide(); if (id >= MODE_HELL_FIRST && id <= MODE_HELL_LAST) { ReceiveText->hide(); FHdisp->show(); @@ -1047,6 +1141,17 @@ void startup_modem(modem* m, int f) center_group->redraw(); } } + if (id == MODE_IFKP && !ifkp_avatar->visible()) { + QsoInfoFrame2->size(QsoInfoFrame2->w() - 60, QsoInfoFrame2->h()); + ifkp_load_avatar(inpCall->value()); + ifkp_avatar->show(); + ifkp_avatar->redraw(); + QsoInfoFrame->redraw(); + } else if (id != MODE_IFKP && ifkp_avatar->visible()) { + QsoInfoFrame2->size(QsoInfoFrame2->w() + 60, QsoInfoFrame2->h()); + ifkp_avatar->hide(); + QsoInfoFrame->redraw(); + } if (id == MODE_RTTY) { if (mvsquelch) { @@ -1157,6 +1262,14 @@ void remove_windows() fsqpicTxWin->hide(); delete fsqpicTxWin; } + if (ifkppicRxWin){ + ifkppicRxWin->hide(); + delete ifkppicRxWin; + } + if (ifkppicTxWin){ + ifkppicTxWin->hide(); + delete ifkppicTxWin; + } if (wefax_pic_rx_win) { wefax_pic_rx_win->hide(); delete wefax_pic_rx_win; @@ -1464,6 +1577,13 @@ void init_modem(trx_mode mode, int freq) quick_change = quick_change_fsq; break; + case MODE_IFKP: + startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : + *mode_info[mode].modem = new ifkp(mode), freq); + modem_config_tab = tabIFKP; + quick_change = quick_change_ifkp; + break; + case MODE_RTTY: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new rtty(mode), freq); @@ -1628,6 +1748,8 @@ void restoreFocus(int n) } if (active_modem->get_mode() == MODE_FSQ && fsq_tx_text) fsq_tx_text->take_focus(); + else if (active_modem->get_mode() == MODE_IFKP && ifkp_tx_text) + ifkp_tx_text->take_focus(); else if (TransmitText) TransmitText->take_focus(); } @@ -2645,8 +2767,12 @@ if (bWF_only) return; restoreFocus(16); } - if (old_call == new_call || new_call.empty()) + if (old_call == new_call) return; + + if (new_call.empty()) { + ifkp_load_avatar(); return; + } old_call = new_call; oktoclear = false; @@ -2661,6 +2787,9 @@ if (bWF_only) return; SearchLastQSO(inpCall->value()); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_load_avatar(inpCall->value()); + if (!inpAZ->value()[0] && progdefaults.autofill_qso_fields) { const struct dxcc* e = dxcc_lookup(inpCall->value()); if (e) { @@ -2744,6 +2873,8 @@ void qsoClear_cb(Fl_Widget *b, void *) clearQSO(); } clear_Lookup(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_clear_avatar(); } void qsoSave_cb(Fl_Widget *b, void *) @@ -3264,6 +3395,7 @@ void UI_check_swap() progStatus.tile_y = ReceiveText->h(); } +// resize fsq UI int fsq_rx_h = text_panel->h() * progStatus.fsq_ratio; if (fsq_rx_h < 66) fsq_rx_h = 66; int fsq_tx_h = text_panel->h() - fsq_rx_h; @@ -3287,6 +3419,34 @@ void UI_check_swap() fsq_left->add(fsq_minbox); fsq_left->resizable(fsq_minbox); +// resize IFKP UI + int ifkp_rx_h = text_panel->h() * progStatus.ifkp_ratio; + if (ifkp_rx_h < 66) ifkp_rx_h = 66; + int ifkp_tx_h = text_panel->h() - ifkp_rx_h; + if (ifkp_tx_h < 66) { + ifkp_tx_h = 66; + ifkp_rx_h = text_panel->h() - ifkp_tx_h; + } + + ifkp_left->remove(ifkp_minbox); + ifkp_left->remove(ifkp_rx_text); + ifkp_left->remove(ifkp_tx_text); + + ifkp_rx_text->resize( + ifkp_left->x(), ifkp_left->y(), + ifkp_left->w(), ifkp_rx_h); + ifkp_tx_text->resize( + ifkp_left->x(), ifkp_left->y() + ifkp_rx_text->h(), + ifkp_left->w(), ifkp_tx_h); + ifkp_minbox->resize( + text_panel->x(), text_panel->y() + 66, + text_panel->w(), text_panel->h() - 2 * 66); + + ifkp_left->add(ifkp_rx_text); + ifkp_left->add(ifkp_tx_text); + ifkp_left->add(ifkp_minbox); + ifkp_left->resizable(ifkp_minbox); + first_check = false; } @@ -3326,6 +3486,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wfpack->position(x, y1); @@ -3340,6 +3501,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe1(0, y1, w, mh); @@ -3356,6 +3518,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wfpack->position(x, y1); @@ -3376,6 +3539,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wfpack->position(x, y1); @@ -3393,6 +3557,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wfpack->position(x, y1); @@ -3403,6 +3568,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe1(0, y1, w, mh2); @@ -3420,7 +3586,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); - UI_select_central_frame(y1, HTh); + ifkp_group->resize(0, y1, w, HTh); y1 += HTh; resize_macroframe2(0, y1, w, mh2); macroFrame2->show(); @@ -3437,6 +3603,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe1(0, y1, w, mh2); @@ -3453,7 +3620,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); - UI_select_central_frame(y1, HTh); + ifkp_group->resize(0, y1, w, HTh); y1 += HTh; resize_macroframe2(0, y1, w, mh2); macroFrame2->show(); @@ -3469,6 +3636,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wfpack->position(x, y1); @@ -3486,6 +3654,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wfpack->position(x, y1); @@ -3507,6 +3676,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe1(0, y1, w, mh2); @@ -3523,6 +3693,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) center_group->resize(0, y1, w, HTh); wefax_group->resize(0, y1, w, HTh); fsq_group->resize(0, y1, w, HTh); + ifkp_group->resize(0, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe2(0, y1, w, mh2); @@ -3659,6 +3830,7 @@ UI_return: center_group->redraw(); wefax_group->redraw(); fsq_group->redraw(); + ifkp_group->redraw(); macroFrame1->redraw(); macroFrame2->redraw(); viewer_redraw(); @@ -3836,6 +4008,12 @@ static Fl_Menu_Item menu_[] = { { mode_info[MODE_HELL80].name, 0, cb_init_mode, (void *)MODE_HELL80, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, +{ "IFKP", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, +{ "IFKP 0.5", 0, cb_ifkp0p5, (void *)MODE_IFKP, 0, FL_NORMAL_LABEL, 0, 14, 0}, +{ "IFKP 1.0", 0, cb_ifkp1p0, (void *)MODE_IFKP, 0, FL_NORMAL_LABEL, 0, 14, 0}, +{ "IFKP 2.0", 0, cb_ifkp2p0, (void *)MODE_IFKP, 0, FL_NORMAL_LABEL, 0, 14, 0}, +{0,0,0,0,0,0,0,0,0}, + {"MFSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8, 0, FL_NORMAL_LABEL, 0, 14, 0}, @@ -5506,12 +5684,12 @@ void create_fl_digi_main_primary() { inpCountry = new Fl_Input2( rightof(QsoInfoFrame1) + pad, Hmenu + pad, - progStatus.mainW - rightof(QsoInfoFrame1) - 2*pad, Hentry, ""); + QsoInfoFrame2->w(), Hentry, ""); inpCountry->tooltip(_("Country")); inpNotes = new Fl_Input2( rightof(QsoInfoFrame1) + pad, y2, - progStatus.mainW - rightof(QsoInfoFrame1) - 2*pad, 2*Hentry + pad, ""); + QsoInfoFrame2->w(), 2*Hentry + pad, ""); inpNotes->type(FL_MULTILINE_INPUT); inpNotes->tooltip(_("Notes")); @@ -5519,6 +5697,15 @@ void create_fl_digi_main_primary() { QsoInfoFrame->resizable(QsoInfoFrame2); + ifkp_avatar = new picture( + QsoInfoFrame2->x() + QsoInfoFrame2->w() - 59, Hmenu + pad, 59, 74); + ifkp_avatar->box(FL_FLAT_BOX); + ifkp_avatar->noslant(); + ifkp_avatar->callback(cb_ifkp_send_avatar); + ifkp_avatar->tooltip(_("Left click - save avatar\nRight click - send my avatar")); + ifkp_load_avatar(); + ifkp_avatar->hide(); + QsoInfoFrame->end(); TopFrame1->resizable(QsoInfoFrame); @@ -6122,9 +6309,125 @@ int alt_btn_width = 2 * DEFAULT_SW; fsq_group->end(); + ifkp_group = new Fl_Group(0, Y, progStatus.mainW, Htext); + ifkp_group->box(FL_FLAT_BOX); +// upper, receive ifkp widgets + ifkp_left = new Panel( + 0, Y, + progStatus.mainW - (image_s2n.w()+4), Htext); +// add rx & tx + ifkp_rx_text = new FTextRX( + 0, Y, + ifkp_left->w(), ifkp_group->h() / 2); + ifkp_rx_text->color( + fl_rgb_color( + progdefaults.RxColor.R, + progdefaults.RxColor.G, + progdefaults.RxColor.B), + progdefaults.RxTxSelectcolor); + ifkp_rx_text->setFont(progdefaults.RxFontnbr); + ifkp_rx_text->setFontSize(progdefaults.RxFontsize); + ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); + ifkp_rx_text->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); + ifkp_rx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); + ifkp_rx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); + ifkp_rx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); + + ifkp_tx_text = new FTextTX( + 0, Y + ifkp_rx_text->h(), + ifkp_rx_text->w(), ifkp_group->h() - ifkp_rx_text->h()); + ifkp_tx_text->color( + fl_rgb_color( + progdefaults.TxColor.R, + progdefaults.TxColor.G, + progdefaults.TxColor.B), + progdefaults.RxTxSelectcolor); + ifkp_tx_text->setFont(progdefaults.TxFontnbr); + ifkp_tx_text->setFontSize(progdefaults.TxFontsize); + ifkp_tx_text->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); + ifkp_tx_text->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); + ifkp_tx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); + ifkp_tx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); + ifkp_tx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); + ifkp_tx_text->align(FL_ALIGN_CLIP); + + ifkp_minbox = new Fl_Box( + 0, Y + 66, + ifkp_tx_text->w(), ifkp_left->h() - 2 * 66); + ifkp_minbox->hide(); + + ifkp_left->resizable(ifkp_minbox); + ifkp_left->end(); + + ifkp_right = new Fl_Group( + ifkp_left->w(), Y, + image_s2n.w()+4, ifkp_group->h()); + ifkp_right->box(FL_FLAT_BOX); + + static int ifkp_heard_widths[] = + { 40*ifkp_right->w()/100, + 30*ifkp_right->w()/100, + 0 }; + ifkp_heard = new Fl_Browser( + ifkp_right->x(), ifkp_right->y(), + image_s2n.w()+4, ifkp_right->h() - (14 + image_s2n.h())); + ifkp_heard->column_widths(ifkp_heard_widths); + ifkp_heard->type(FL_MULTI_BROWSER); + ifkp_heard->callback((Fl_Callback*)cb_ifkp_heard); + ifkp_heard->column_char(','); + ifkp_heard->tooltip(_("Stations Heard")); + ifkp_heard->box(FL_DOWN_BOX); + ifkp_heard->labelfont(progdefaults.RxFontnbr); + ifkp_heard->labelsize(11); +#ifdef __APPLE__ + ifkp_heard->textfont(FL_SCREEN_BOLD); + ifkp_heard->textsize(13); +#else + ifkp_heard->textfont(FL_HELVETICA); + ifkp_heard->textsize(13); +#endif + Fl_Group *ifkp_sn_box = new Fl_Group( + ifkp_heard->x(), ifkp_heard->y() + ifkp_heard->h(), + ifkp_heard->w(), 14 + image_s2n.h(), ""); + ifkp_sn_box->box(FL_DOWN_BOX); + + ifkp_sn_box->color(FL_WHITE); + ifkp_s2n_progress = new Progress( + ifkp_sn_box->x() + 2, ifkp_sn_box->y() + 2, + image_s2n.w(), 10, ""); + ifkp_s2n_progress->color(FL_WHITE, FL_DARK_GREEN); + ifkp_s2n_progress->type(Progress::HORIZONTAL); + ifkp_s2n_progress->value(40); + + Fl_Box *ifkp_s2n = new Fl_Box( + ifkp_s2n_progress->x(), ifkp_s2n_progress->y() + ifkp_s2n_progress->h(), + image_s2n.w(), image_s2n.h(), ""); + ifkp_s2n->box(FL_FLAT_BOX); + ifkp_s2n->color(FL_WHITE); + ifkp_s2n->align(FL_ALIGN_INSIDE | FL_ALIGN_TOP | FL_ALIGN_CENTER | FL_ALIGN_CLIP); + ifkp_s2n->image(image_s2n); + + ifkp_sn_box->end(); +// ifkp_thumbnail = new Fl_Box( +// ifkp_heard->x(), ifkp_s2n->y() + ifkp_s2n->h(), +// 48,64); +// ifkp_thumbnail->box(FL_FLAT_BOX); +// ifkp_thumbnail->color(FL_BLACK); + + ifkp_right->end(); + ifkp_right->resizable(ifkp_heard); + + ifkp_right->end(); + +// lower, transmit ifkp widgets + ifkp_group->resizable(ifkp_left); + + ifkp_group->end(); + center_group->show(); wefax_group->hide(); fsq_group->hide(); + ifkp_group->hide(); Y += Htext; @@ -7024,6 +7327,9 @@ static void callback_set_metric(double metric) if (active_modem->get_mode() == MODE_FSQ) ind_fsq_s2n->value(metric); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_s2n_progress->value(metric); + if(progStatus.pwrsqlonoff) { if ((metric >= progStatus.sldrPwrSquelchValue) || inhibit_tx_seconds) btnPSQL->selection_color(progdefaults.Sql2Color); @@ -7234,6 +7540,8 @@ void add_tx_char(int data) static void display_rx_data(const unsigned char data, int style) { if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(data,style); + else if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add(data,style); else ReceiveText->add(data, style); @@ -7668,7 +7976,10 @@ int get_tx_char(void) goto transmit; } - c = TransmitText->nextChar(); + if (active_modem->get_mode() == MODE_IFKP) + c = ifkp_tx_text->nextChar(); + else + c = TransmitText->nextChar(); if (c == GET_TX_CHAR_ETX) { return c; @@ -7676,7 +7987,10 @@ int get_tx_char(void) if (c == '^' && state == STATE_CHAR) { state = STATE_CTRL; - c = TransmitText->nextChar(); + if (active_modem->get_mode() == MODE_IFKP) + c = ifkp_tx_text->nextChar(); + else + c = TransmitText->nextChar(); } if (c == -1) { @@ -7692,17 +8006,29 @@ int get_tx_char(void) TransmitText->pause(); break; case 'r': - REQ_SYNC(&FTextTX::clear_sent, TransmitText); + if (active_modem->get_mode() == MODE_IFKP) + REQ_SYNC(&FTextTX::clear_sent, ifkp_tx_text); + else + REQ_SYNC(&FTextTX::clear_sent, TransmitText); REQ(Rx_queue_execute); return(GET_TX_CHAR_ETX); break; case 'R': - if (TransmitText->eot()) { - REQ_SYNC(&FTextTX::clear_sent, TransmitText); - REQ(Rx_queue_execute); - return(GET_TX_CHAR_ETX); - } else - return(GET_TX_CHAR_NODATA); + if (active_modem->get_mode() == MODE_IFKP) { + if (ifkp_tx_text->eot()) { + REQ_SYNC(&FTextTX::clear_sent, ifkp_tx_text); + REQ(Rx_queue_execute); + return(GET_TX_CHAR_ETX); + } else + return(GET_TX_CHAR_NODATA); + } else { + if (TransmitText->eot()) { + REQ_SYNC(&FTextTX::clear_sent, TransmitText); + REQ(Rx_queue_execute); + return(GET_TX_CHAR_ETX); + } else + return(GET_TX_CHAR_NODATA); + } break; case 'L': REQ(qso_save_now); @@ -7806,6 +8132,8 @@ void put_echo_char(unsigned int data, int style) { if (active_modem->get_mode() == MODE_FSQ) REQ(&FTextRX::addstr, fsq_rx_text, echo_chd.data(), style); + else if (active_modem->get_mode() == MODE_IFKP) + REQ(&FTextRX::addstr, ifkp_rx_text, echo_chd.data(), style); else REQ(&FTextRX::addstr, ReceiveText, echo_chd.data(), style); if (progStatus.LOGenabled) @@ -8539,9 +8867,14 @@ std::string heard_list() void clear_heard_list() { - fsq_heard->clear(); - fsq_heard->add("allcall"); - fsq_heard->redraw(); + if (active_modem->get_mode() == MODE_FSQ) { + fsq_heard->clear(); + fsq_heard->add("allcall"); + fsq_heard->redraw(); + } else { + ifkp_heard->clear(); + ifkp_heard->redraw(); + } } int tm2int(string s) @@ -8565,20 +8898,35 @@ void age_heard_list() case 4: aging_secs = 1200; break; // 20 minutes case 5: aging_secs = 1800; break; // 30 minutes case 0: - default: return; + default: return; // no aging } - if (fsq_heard->size() < 2) return; - for (int i = fsq_heard->size(); i > 1; i--) { - entry = fsq_heard->text(i); - size_t pos = entry.find(","); - tm = entry.substr(pos+1,5); - tm.erase(2,1); - int tdiff = tnow - tm2int(tm); - if (tdiff < 0) tdiff += 24*60*60; - if (tdiff >= aging_secs) - fsq_heard->remove(i); + if (active_modem->get_mode() == MODE_FSQ) { + if (fsq_heard->size() < 2) return; + for (int i = fsq_heard->size(); i > 1; i--) { + entry = fsq_heard->text(i); + size_t pos = entry.find(","); + tm = entry.substr(pos+1,5); + tm.erase(2,1); + int tdiff = tnow - tm2int(tm); + if (tdiff < 0) tdiff += 24*60*60; + if (tdiff >= aging_secs) + fsq_heard->remove(i); + } + fsq_heard->redraw(); + } else { + if (ifkp_heard->size() == 0) return; + for (int i = ifkp_heard->size(); i > 0; i--) { + entry = ifkp_heard->text(i); + size_t pos = entry.find(","); + tm = entry.substr(pos+1,5); + tm.erase(2,1); + int tdiff = tnow - tm2int(tm); + if (tdiff < 0) tdiff += 24*60*60; + if (tdiff >= aging_secs) + ifkp_heard->remove(i); + } + ifkp_heard->redraw(); } - fsq_heard->redraw(); } void add_to_heard_list(string szcall, string szdb) @@ -8590,23 +8938,43 @@ void add_to_heard_list(string szcall, string szdb) str += time[0]; str += time[1]; str += ':'; str += time[2]; str += time[3]; str.append(",").append(szdb); - if (fsq_heard->size() < 2) { - fsq_heard->add(str.c_str()); - } else { - int found = 0; - std::string line; - for (int i = 2; i <= fsq_heard->size(); i++) { - line = fsq_heard->text(i); - if (line.find(szcall) == 0) { - found = i; - break; + if (active_modem->get_mode() == MODE_FSQ) { + if (fsq_heard->size() < 2) { + fsq_heard->add(str.c_str()); + } else { + int found = 0; + std::string line; + for (int i = 2; i <= fsq_heard->size(); i++) { + line = fsq_heard->text(i); + if (line.find(szcall) == 0) { + found = i; + break; + } } + if (found) + fsq_heard->remove(found); + fsq_heard->insert(2, str.c_str()); } - if (found) - fsq_heard->remove(found); - fsq_heard->insert(2, str.c_str()); + fsq_heard->redraw(); + } else { + if (ifkp_heard->size() == 0) { + ifkp_heard->add(str.c_str()); + } else { + int found = 0; + std::string line; + for (int i = 1; i <= ifkp_heard->size(); i++) { + line = ifkp_heard->text(i); + if (line.find(szcall) == 0) { + found = i; + break; + } + } + if (found) + ifkp_heard->remove(found); + ifkp_heard->insert(1, str.c_str()); + } + ifkp_heard->redraw(); } - fsq_heard->redraw(); } bool in_heard(string call) @@ -8654,6 +9022,31 @@ void cb_fsq_heard(Fl_Browser*, void*) restoreFocus(); } +void cb_ifkp_heard(Fl_Browser*, void*) +{ + heard_picked = ifkp_heard->value(); + if (!heard_picked) + return; + + int k = Fl::event_key(); + std::string selected_call = ifkp_heard->text(heard_picked); + size_t p = selected_call.find(','); + if (p != std::string::npos) selected_call.erase(p); + + switch (k) { + case FL_Button + FL_LEFT_MOUSE: + if (Fl::event_clicks()) { + ifkp_tx_text->add(" "); + ifkp_tx_text->add(selected_call.c_str()); + } + break; + case FL_Button + FL_RIGHT_MOUSE: + ifkp_heard->remove(heard_picked); + break; + } + restoreFocus(); +} + void display_fsq_rx_text(std::string text, int style) { REQ(&FTextRX::addstr, fsq_rx_text, text, style); diff --git a/src/globals/globals.cxx b/src/globals/globals.cxx index c068b0bf..54d99c9d 100644 --- a/src/globals/globals.cxx +++ b/src/globals/globals.cxx @@ -191,13 +191,13 @@ const struct mode_info_t mode_info[NUM_MODES] = { { MODE_2X_PSK1000R, &psk1000r_c2_modem, "PSK1000RC2", "2xPSK1000R", "PSK1000RC2", "PSK1000RC2", "P1KRC2", ARQ_IO | KISS_IO }, + { MODE_FSQ, &fsq_modem, "FSQ", "FSQ", "FSQ", "FSQ", "FSQ", DISABLED_IO }, + { MODE_IFKP, &ifkp_modem, "IFKP", "IFKP", "IFKP", "IFKP", "IFKP", DISABLED_IO }, + { MODE_SSB, &ssb_modem, "SSB", "SSB", "", "SSB", "", DISABLED_IO }, { MODE_WWV, &wwv_modem, "WWV", "WWV", "", "", "", DISABLED_IO }, { MODE_ANALYSIS, &anal_modem, "ANALYSIS", "Freq Analysis", "", "", "", DISABLED_IO }, - { MODE_FFTSCAN, &fftscan_modem, "FREQSCAN", "Freq Scan", "", "", "", DISABLED_IO }, - - { MODE_FSQ, &fsq_modem, "FSQ", "FSQ", "", "", "", DISABLED_IO } - + { MODE_FFTSCAN, &fftscan_modem, "FREQSCAN", "Freq Scan", "", "", "", DISABLED_IO } }; std::ostream& operator<<(std::ostream& s, const qrg_mode_t& m) diff --git a/src/ifkp/ifkp-pic.cxx b/src/ifkp/ifkp-pic.cxx new file mode 100644 index 00000000..d1f332ca --- /dev/null +++ b/src/ifkp/ifkp-pic.cxx @@ -0,0 +1,803 @@ +// ---------------------------------------------------------------------------- +// ifkppic.cxx -- ifkp image support functions +// +// Copyright (C) 2015 +// Dave Freese, W1HKJ +// +// This file is part of fldigi. Adapted from code contained in gifkp source code +// distribution. +// +// Fldigi is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Fldigi is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with fldigi. If not, see . +// ---------------------------------------------------------------------------- +#include +#include + +#include "gettext.h" +#include "fileselect.h" + +Fl_Double_Window *ifkppicRxWin = (Fl_Double_Window *)0; +picture *ifkppicRx = (picture *)0; +Fl_Button *btnifkpRxReset = (Fl_Button *)0; +Fl_Button *btnifkpRxSave = (Fl_Button *)0; +Fl_Button *btnifkpRxClose = (Fl_Button *)0; +Fl_Counter *ifkpcnt_phase = (Fl_Counter *)0; +Fl_Counter *ifkpcnt_slant = (Fl_Counter *)0; + +Fl_Double_Window *ifkppicTxWin = (Fl_Double_Window *)0; +picture *ifkppicTx = (picture *)0; +Fl_Button *btnifkppicTransmit = (Fl_Button *)0; +Fl_Button *btnifkppicTxSendAbort = (Fl_Button *)0; +Fl_Button *btnifkppicTxLoad = (Fl_Button *)0; +Fl_Button *btnifkppicTxClose = (Fl_Button *)0; +Fl_Choice *selifkppicSize = (Fl_Choice *)0; + +void ifkp_showTxViewer(char c); + +Fl_Shared_Image *ifkpTxImg = (Fl_Shared_Image *)0; +unsigned char *ifkpxmtimg = (unsigned char *)0; +unsigned char *ifkpxmtpicbuff = (unsigned char *)0; + +#define RAWSIZE 640*(480 + 8)*3*ifkp::IMAGEspp + +#define RAWSTART 640*4*3*ifkp::IMAGEspp + +unsigned char *ifkp_rawvideo = 0;//[RAWSIZE + 1]; + +int ifkp_numpixels; +int ifkp_pixelptr; +int ifkp_rawcol; +int ifkp_rawrow; +int ifkp_rawrgb; +char ifkp_image_type = 'S'; + +char ifkp_txclr_tooltip[24]; +char ifkp_txgry_tooltip[24]; + +static int translate = 0; +static bool enabled = false; + +void ifkp_correct_video() +{ + int W = ifkppicRx->w(); + int H = ifkppicRx->h(); + int slant = ifkpcnt_slant->value(); + int vidsize = W * H; + int index, rowptr, colptr; + float ratio = (((float)vidsize - (float)slant)/(float)vidsize); + unsigned char vid[W * H * 3]; + for (int row = 0; row < H; row++) { + rowptr = W * 3 * row * ifkp::IMAGEspp; + for (int col = 0; col < W; col++) { + colptr = ifkp::IMAGEspp*col; + for (int rgb = 0; rgb < 3; rgb++) { + index = ratio*(rowptr + colptr + 10*W*rgb); + index += RAWSTART - ifkp::IMAGEspp*ifkp_pixelptr; + if (index < 2) index = 2; + if (index > RAWSIZE - 2) index = RAWSIZE - 2; + vid[rgb + 3 * (col + row * W)] = ifkp_rawvideo[index]; + } + } + } + ifkppicRx->video(vid, W*H*3); +} + +void ifkp_updateRxPic(unsigned char data, int pos) +{ + if (!ifkppicRxWin->shown()) ifkppicRx->show(); + + ifkppicRx->pixel(data, pos); + + int W = ifkppicRx->w(); + if (ifkp_image_type == 'F' || ifkp_image_type == 'p' || ifkp_image_type == 'm') { + int n = RAWSTART + ifkp::IMAGEspp*(ifkp_rawcol + W * (ifkp_rawrgb + 3 * ifkp_rawrow)); + if (n < RAWSIZE) + for (int i = 0; i < ifkp::IMAGEspp; i++) ifkp_rawvideo[n + i] = data; + ifkp_rawrgb++; + if (ifkp_rawrgb == 3) { + ifkp_rawrgb = 0; + ifkp_rawcol++; + if (ifkp_rawcol == W) { + ifkp_rawcol = 0; + ifkp_rawrow++; + } + } + } else + for (int i = 0; i < ifkp::IMAGEspp; i++) + ifkp_rawvideo[RAWSTART + ifkp::IMAGEspp*ifkp_numpixels + i] = data; + ifkp_numpixels++; + if (ifkp_numpixels >= (RAWSIZE - RAWSTART - ifkp::IMAGEspp)) + ifkp_numpixels = RAWSIZE - RAWSTART - ifkp::IMAGEspp; +} + +void cb_btnifkpRxReset(Fl_Widget *, void *) +{ + progStatus.ifkp_rx_abort = true; +} + +void cb_btnifkpRxSave(Fl_Widget *, void *) +{ + ifkppicRx->save_png(PicsDir.c_str()); +// FILE *raw = fopen("image.raw", "wb"); +// std::cout << "wrote " << fwrite(ifkp_rawvideo, 1, RAWSIZE, raw) << "\n"; +// fclose(raw); +} + +void cb_btnifkpRxClose(Fl_Widget *, void *) +{ + ifkppicRxWin->hide(); + progStatus.ifkp_rx_abort = true; +// ifkppicRxWin->hide(); +// FILE *raw = fopen("image.raw", "rb"); +// std::cout << "read " << fread(ifkp_rawvideo, 1, RAWSIZE, raw) << "\n"; +// fclose(raw); +// ifkp_correct_video(); +} + +void cb_ifkp_cnt_phase(Fl_Widget *, void *data) +{ + ifkp_pixelptr = ifkpcnt_phase->value(); + if (ifkp_pixelptr >= RAWSTART/ifkp::IMAGEspp) { + ifkp_pixelptr = RAWSTART/ifkp::IMAGEspp - 1; + ifkpcnt_phase->value(ifkp_pixelptr); + } + if (ifkp_pixelptr < -RAWSTART/ifkp::IMAGEspp) { + ifkp_pixelptr = -RAWSTART/ifkp::IMAGEspp; + ifkpcnt_phase->value(ifkp_pixelptr); + } + ifkp_correct_video(); +} + +void cb_ifkp_cnt_slant(Fl_Widget *, void *) +{ + ifkp_correct_video(); +} + +void ifkp_disableshift() +{ + if (!ifkppicRxWin) return; + ifkpcnt_phase->deactivate(); + ifkpcnt_slant->deactivate(); + btnifkpRxSave->deactivate(); + ifkppicRxWin->redraw(); +} + +void ifkp_enableshift() +{ + if (!ifkppicRxWin) return; + ifkpcnt_phase->activate(); + ifkpcnt_slant->activate(); + btnifkpRxSave->activate(); + ifkppicRxWin->redraw(); +} + +void ifkp_createRxViewer() +{ + + ifkppicRxWin = new Fl_Double_Window(324, 274, _("IFKP Rx Image")); + ifkppicRxWin->xclass(PACKAGE_NAME); + ifkppicRxWin->begin(); + + ifkppicRx = new picture(2, 2, 320, 240); + ifkppicRx->noslant(); + + Fl_Group *buttons = new Fl_Group(0, ifkppicRxWin->h() - 26, ifkppicRxWin->w(), 26, ""); + buttons->box(FL_FLAT_BOX); + + btnifkpRxReset = new Fl_Button(2, ifkppicRxWin->h() - 26, 40, 24, "Reset"); + btnifkpRxReset->callback(cb_btnifkpRxReset, 0); + + ifkpcnt_phase = new Fl_Counter(46, ifkppicRxWin->h() - 24, 80, 20, ""); + ifkpcnt_phase->step(1); + ifkpcnt_phase->lstep(10); + ifkpcnt_phase->minimum(-RAWSTART + 1); + ifkpcnt_phase->maximum(RAWSTART - 1); + ifkpcnt_phase->value(0); + ifkpcnt_phase->callback(cb_ifkp_cnt_phase, 0); + ifkpcnt_phase->tooltip(_("Phase correction")); + + ifkpcnt_slant = new Fl_Counter(140, ifkppicRxWin->h() - 24, 80, 20, ""); + ifkpcnt_slant->step(1); + ifkpcnt_slant->lstep(10); + ifkpcnt_slant->minimum(-200); + ifkpcnt_slant->maximum(200); + ifkpcnt_slant->value(0); + ifkpcnt_slant->callback(cb_ifkp_cnt_slant, 0); + ifkpcnt_slant->tooltip(_("Slant correction")); + + btnifkpRxSave = new Fl_Button(226, ifkppicRxWin->h() - 26, 45, 24, _("Save")); + btnifkpRxSave->callback(cb_btnifkpRxSave, 0); + + btnifkpRxClose = new Fl_Button(273, ifkppicRxWin->h() - 26, 45, 24, _("Close")); + btnifkpRxClose->callback(cb_btnifkpRxClose, 0); + buttons->end(); + + ifkppicRxWin->end(); + ifkppicRxWin->resizable(ifkppicRx); + + ifkp_numpixels = 0; +} + +void ifkp_showRxViewer(char itype) +{ + int W = 320; + int H = 240; + switch (itype) { + case 'L' : W = 320; H = 240; break; + case 'S' : W = 160; H = 120; break; + case 'F' : W = 640; H = 480; break; + case 'V' : W = 640; H = 480; break; + case 'P' : W = 240; H = 300; break; + case 'p' : W = 240; H = 300; break; + case 'M' : W = 120; H = 150; break; + case 'm' : W = 120; H = 150; break; + case 'T' : W = 59; H = 74; break; + } + + if (!ifkppicRxWin) ifkp_createRxViewer(); + int winW, winH; + int ifkppicX, ifkppicY; + winW = W < 320 ? 324 : W + 4; + winH = H < 240 ? 274 : H + 34; + ifkppicX = (winW - W) / 2; + ifkppicY = (winH - 30 - H) / 2; + ifkppicRxWin->size(winW, winH); + ifkppicRx->resize(ifkppicX, ifkppicY, W, H); + ifkppicRxWin->init_sizes(); + + ifkppicRx->clear(); + ifkppicRxWin->show(); + ifkp_disableshift(); + + if (ifkp_rawvideo == 0) ifkp_rawvideo = new unsigned char [RAWSIZE + 1]; + memset(ifkp_rawvideo, 0, RAWSIZE); + ifkp_numpixels = 0; + ifkp_pixelptr = 0; + ifkp_rawrow = ifkp_rawrgb = ifkp_rawcol = 0; + ifkp_image_type = itype; +} + +void ifkp_clear_rximage() +{ + ifkppicRx->clear(); + ifkp_disableshift(); + translate = 0; + enabled = false; + ifkp_numpixels = 0; + ifkp_pixelptr = 0; + ifkpcnt_phase->value(0); + ifkpcnt_slant->value(0); + ifkp_rawrow = ifkp_rawrgb = ifkp_rawcol = 0; +} + +//------------------------------------------------------------------------------ +// image transmit functions +//------------------------------------------------------------------------------ + +int ifkp_load_image(const char *n) { + + int D = 0; + unsigned char *img_data; + int W = 640; + int H = 480; + + switch (selifkppicSize->value()) { + case 0 : W = 59; H = 74; break; + case 1 : W = 160; H = 120; break; + case 2 : W = 320; H = 240; break; + case 3 : W = 640; H = 480; break; + case 4 : W = 640; H = 480; break; + case 5 : W = 240; H = 300; break; + case 6 : W = 240; H = 300; break; + case 7 : W = 120; H = 150; break; + case 8 : W = 120; H = 150; break; + } + + if (ifkpTxImg) { + ifkpTxImg->release(); + ifkpTxImg = 0; + } + ifkpTxImg = Fl_Shared_Image::get(n, W, H); + + if (!ifkpTxImg) + return 0; + + if (ifkpTxImg->count() > 1) { + ifkpTxImg->release(); + ifkpTxImg = 0; + return 0; + } + + ifkppicTx->hide(); + ifkppicTx->clear(); + + img_data = (unsigned char *)ifkpTxImg->data()[0]; + + D = ifkpTxImg->d(); + + if (ifkpxmtimg) delete [] ifkpxmtimg; + + ifkpxmtimg = new unsigned char [W * H * 3]; + if (D == 3) + memcpy(ifkpxmtimg, img_data, W*H*3); + else if (D == 4) { + int i, j, k; + for (i = 0; i < W*H; i++) { + j = i*3; k = i*4; + ifkpxmtimg[j] = img_data[k]; + ifkpxmtimg[j+1] = img_data[k+1]; + ifkpxmtimg[j+2] = img_data[k+2]; + } + } else if (D == 1) { + int i, j; + for (i = 0; i < W*H; i++) { + j = i * 3; + ifkpxmtimg[j] = ifkpxmtimg[j+1] = ifkpxmtimg[j+2] = img_data[i]; + } + } else + return 0; + +// ifkp_showTxViewer(W, H); + char* label = strdup(n); + ifkppicTxWin->copy_label(basename(label)); + free(label); +// load the ifkppicture widget with the rgb image + + ifkppicTx->show(); + ifkppicTxWin->redraw(); + ifkppicTx->video(ifkpxmtimg, W * H * 3); + + btnifkppicTransmit->activate(); + + return 1; +} + +void ifkp_updateTxPic(unsigned char data, int pos) +{ + if (!ifkppicTxWin->shown()) ifkppicTx->show(); + ifkppicTx->pixel(data, pos); +} + +void cb_ifkppicTxLoad(Fl_Widget *, void *) +{ + const char *fn = + FSEL::select(_("Load image file"), "Image\t*.{png,,gif,jpg,jpeg}\n", PicsDir.c_str()); + if (fn) + ifkp_load_image(fn); +} + +void ifkp_clear_tximage() +{ + ifkppicTx->clear(); +} + +void cb_ifkppicTxClose( Fl_Widget *w, void *) +{ + ifkppicTxWin->hide(); +} + +int ifkppic_TxGetPixel(int pos, int color) +{ + return ifkpxmtimg[3*pos + color]; // color = {RED, GREEN, BLUE} +} + +void cb_ifkppicTransmit( Fl_Widget *w, void *) +{ + string picmode = " pic%"; + switch (selifkppicSize->value()) { + case 0: picmode += 'T'; break; + case 1: picmode += 'S'; break; + case 2: picmode += 'L'; break; + case 3: picmode += 'F'; break; + case 4: picmode += 'V'; break; + case 5: picmode += 'P'; break; + case 6: picmode += 'p'; break; + case 7: picmode += 'M'; break; + case 8: picmode += 'm'; break; + } + picmode.append("^r"); + ifkp_tx_text->add(picmode.c_str()); + active_modem->ifkp_send_image(); +} + +void cb_ifkppicTxSendAbort( Fl_Widget *w, void *) +{ +} + + +void cb_selifkppicSize( Fl_Widget *w, void *) +{ + switch (selifkppicSize->value()) { + case 0 : ifkp_showTxViewer('T'); break; + case 1 : ifkp_showTxViewer('S'); break; + case 2 : ifkp_showTxViewer('L'); break; + case 3 : ifkp_showTxViewer('F'); break; + case 4 : ifkp_showTxViewer('V'); break; + case 5 : ifkp_showTxViewer('P'); break; + case 6 : ifkp_showTxViewer('p'); break; + case 7 : ifkp_showTxViewer('M'); break; + case 8 : ifkp_showTxViewer('m'); break; + } +} + +void ifkp_createTxViewer() +{ + + ifkppicTxWin = new Fl_Double_Window(324, 270, _("IFKP Send image")); + ifkppicTxWin->xclass(PACKAGE_NAME); + ifkppicTxWin->begin(); + + ifkppicTx = new picture (2, 2, 320, 240); + ifkppicTx->noslant(); + ifkppicTx->hide(); + + selifkppicSize = new Fl_Choice(5, 244, 110, 24); + selifkppicSize->add("59 x 74 clr"); // case 0 + selifkppicSize->add("160x120 clr"); // case 1 + selifkppicSize->add("320x240 clr"); // case 2 + selifkppicSize->add("640x480 gry"); // case 3 + selifkppicSize->add("640x480 clr"); // case 4 + selifkppicSize->add("240x300 clr"); // case 5 + selifkppicSize->add("240x300 gry"); // case 6 + selifkppicSize->add("120x150 clr"); // case 7 + selifkppicSize->add("120x150 gry"); // case 8 + selifkppicSize->value(0); + selifkppicSize->callback(cb_selifkppicSize, 0); + + btnifkppicTxLoad = new Fl_Button(120, 244, 60, 24, _("Load")); + btnifkppicTxLoad->callback(cb_ifkppicTxLoad, 0); + + btnifkppicTransmit = new Fl_Button(ifkppicTxWin->w() - 130, 244, 60, 24, "Xmt"); + btnifkppicTransmit->callback(cb_ifkppicTransmit, 0); + + btnifkppicTxSendAbort = new Fl_Button(ifkppicTxWin->w() - 130, 244, 60, 24, "Abort Xmt"); + btnifkppicTxSendAbort->callback(cb_ifkppicTxSendAbort, 0); + + btnifkppicTxClose = new Fl_Button(ifkppicTxWin->w() - 65, 244, 60, 24, _("Close")); + btnifkppicTxClose->callback(cb_ifkppicTxClose, 0); + + btnifkppicTxSendAbort->hide(); + btnifkppicTransmit->deactivate(); + + ifkppicTxWin->end(); + +} + +void ifkp_showTxViewer(char c) +{ + if (!ifkppicTxWin) ifkp_createTxViewer(); + + int winW = 644, winH = 512, W = 480, H = 320; + int ifkppicX, ifkppicY; + + ifkppicTx->clear(); + + switch (c) { + case 'T' : + W = 59; H = 74; winW = 324; winH = 184; + selifkppicSize->value(0); + break; + case 'S' : + case 's' : + W = 160; H = 120; winW = 324; winH = 154; + selifkppicSize->value(1); + break; + case 'L' : + case 'l' : + W = 320; H = 240; winW = 324; winH = 274; + selifkppicSize->value(2); + break; + case 'F' : + W = 640; H = 480; winW = 644; winH = 514; + selifkppicSize->value(3); + break; + case 'V' : + W = 640; H = 480; winW = 644; winH = 514; + selifkppicSize->value(4); + break; + case 'P' : + W = 240; H = 300; winW = 324; winH = 334; + selifkppicSize->value(5); + break; + case 'p' : + W = 240; H = 300; winW = 324; winH = 334; + selifkppicSize->value(6); + break; + case 'M' : + W = 120; H = 150; winW = 324; winH = 184; + selifkppicSize->value(7); + break; + case 'm' : + W = 120; H = 150; winW = 324; winH = 184; + selifkppicSize->value(8); + break; + } + + ifkppicTxWin->size(winW, winH); + ifkppicX = (winW - W) / 2; + ifkppicY = (winH - 26 - H) / 2; + ifkppicTx->resize(ifkppicX, ifkppicY, W, H); + + selifkppicSize->resize(5, winH - 26, 110, 24); + + btnifkppicTxLoad->resize(120, winH - 26, 60, 24); + + btnifkppicTransmit->resize(winW - 130, winH - 26, 60, 24); + btnifkppicTxSendAbort->resize(winW - 130, winH - 26, 60, 24); + + btnifkppicTxClose->resize(winW -65, winH - 26, 60, 24); + + selifkppicSize->show(); + btnifkppicTransmit->show(); + btnifkppicTxLoad->show(); + btnifkppicTxClose->show(); + btnifkppicTxSendAbort->hide(); + + ifkppicTxWin->show(); + +} + +void ifkp_deleteTxViewer() +{ + if (ifkppicTxWin) ifkppicTxWin->hide(); + if (ifkppicTx) { + delete ifkppicTx; + ifkppicTx = 0; + } + delete [] ifkpxmtimg; + ifkpxmtimg = 0; + delete [] ifkpxmtpicbuff; + ifkpxmtpicbuff = 0; + if (ifkppicTxWin) delete ifkppicTxWin; + ifkppicTxWin = 0; +} + +void ifkp_deleteRxViewer() +{ + if (ifkppicRxWin) ifkppicRxWin->hide(); + if (ifkppicRx) { + delete ifkppicRx; + ifkppicRx = 0; + } + if (ifkppicRxWin) { + delete ifkppicRxWin; + ifkppicRxWin = 0; + } +} + +int ifkp_print_time_left(float time_sec, char *str, size_t len, + const char *prefix, const char *suffix) +{ + int time_min = (int)(time_sec / 60); + time_sec -= time_min * 60; + + if (time_min) + return snprintf(str, len, "%s %02dm %2.1fs%s", + prefix, time_min, time_sec, suffix); + else + return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); +} + +// ----------------------------------------------------------------------------- +// avatar send/recv +// ----------------------------------------------------------------------------- +#include "tux.cxx" + +static Fl_Shared_Image *shared_avatar_img = (Fl_Shared_Image *)0; + +static unsigned char *avatar_img = (unsigned char *)0; + +static Fl_Shared_Image *my_avatar_img = (Fl_Shared_Image *)0; + +static int avatar_phase_correction = 0; + +void ifkp_clear_avatar() +{ + ifkp_avatar->clear(); + avatar_phase_correction = 0; + ifkp_numpixels = 0; + ifkp_rawrow = ifkp_rawrgb = ifkp_rawcol = 0; + ifkp_avatar->video(tux_img, 59 * 74 * 3); +} + + +// W always 59, H always 74 +int ifkp_load_avatar(std::string image_fname, int W, int H) +{ + if (image_fname.empty()) { + ifkp_clear_avatar(); + return 1; + } + + int D = 0; + unsigned char *img_data; + + if (shared_avatar_img) { + shared_avatar_img->release(); + shared_avatar_img = 0; + } + + for (size_t n = 0; n < image_fname.length(); n++) + image_fname[n] = tolower(image_fname[n]); + std::string fname = AvatarDir; + fname.append(image_fname).append(".png"); + + FILE *temp = fopen(fname.c_str(), "rb"); + if (temp) { + fseek(temp, 0L, SEEK_SET); + fclose(temp); + } else { + ifkp_avatar->video(tux_img, W * H * 3); + return 1; + } + + shared_avatar_img = Fl_Shared_Image::get(fname.c_str(), W, H); + +// force image to be retrieved from hard drive vice shared image memory + shared_avatar_img->reload(); + + if (!shared_avatar_img) { + ifkp_avatar->video(tux_img, W * H * 3); + return 1; + } + + if (shared_avatar_img->count() > 1) { + shared_avatar_img->release(); + shared_avatar_img = 0; + ifkp_avatar->video(tux_img, W * H * 3); + return 0; + } + + img_data = (unsigned char *)shared_avatar_img->data()[0]; + + D = shared_avatar_img->d(); + + if (avatar_img) delete [] avatar_img; + + avatar_img = new unsigned char [W * H * 3]; + if (D == 3) + memcpy(avatar_img, img_data, W*H*3); + else if (D == 4) { + int i, j, k; + for (i = 0; i < W*H; i++) { + j = i*3; k = i*4; + avatar_img[j] = img_data[k]; + avatar_img[j+1] = img_data[k+1]; + avatar_img[j+2] = img_data[k+2]; + } + } else if (D == 1) { + int i, j; + for (i = 0; i < W*H; i++) { + j = i * 3; + avatar_img[j] = avatar_img[j+1] = avatar_img[j+2] = img_data[i]; + } + } else { + ifkp_avatar->video(tux_img, W * H * 3); + return 0; + } + ifkp_avatar->video(avatar_img, W * H * 3); + + shared_avatar_img->release(); + + return 1; +} + +void correct_avatar() +{ + int W = 59; + int H = 74; + int index, rowptr, colptr; + unsigned char vid[W * H * 3]; + + if (avatar_phase_correction >= RAWSTART/ifkp::IMAGEspp) { + avatar_phase_correction = RAWSTART/ifkp::IMAGEspp - 1; + } + if (avatar_phase_correction < -RAWSTART/ifkp::IMAGEspp) { + avatar_phase_correction = -RAWSTART/ifkp::IMAGEspp; + } + + for (int row = 0; row < H; row++) { + rowptr = W * 3 * row * ifkp::IMAGEspp; + for (int col = 0; col < W; col++) { + colptr = ifkp::IMAGEspp*col; + for (int rgb = 0; rgb < 3; rgb++) { + index = rowptr + colptr + W*rgb*ifkp::IMAGEspp; + index += RAWSTART - ifkp::IMAGEspp * avatar_phase_correction; + if (index < 2) index = 2; + if (index > RAWSIZE - 2) index = RAWSIZE - 2; + vid[rgb + 3 * (col + row * W)] = ifkp_rawvideo[index]; + } + } + } + ifkp_avatar->video(vid, W*H*3); +} + +void ifkp_update_avatar(unsigned char data, int pos) +{ + if (ifkp_rawvideo == 0) { + ifkp_rawvideo = new unsigned char [RAWSIZE + 1]; + memset(ifkp_rawvideo, 0, RAWSIZE); + } + + ifkp_avatar->pixel(data, pos); + for (int i = 0; i < ifkp::IMAGEspp; i++) + ifkp_rawvideo[RAWSTART + ifkp::IMAGEspp*ifkp_numpixels + i] = data; + + ifkp_numpixels++; + + if (ifkp_numpixels >= (RAWSIZE - RAWSTART - ifkp::IMAGEspp)) + ifkp_numpixels = RAWSIZE - RAWSTART - ifkp::IMAGEspp; + +} + +int ifkp_get_avatar_pixel(int pos, int color) +{ + return (int)my_avatar_img->data()[0][3*pos + color]; // color = {RED, GREEN, BLUE} +} + +// ADD CALLBACK HANDLING OF PHASE CORRECTIONS + +void cb_ifkp_send_avatar( Fl_Widget *w, void *) +{ + if (Fl::event_button() == FL_RIGHT_MOUSE) { + if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { + if (ifkp_numpixels == 0) return; + avatar_phase_correction += 5; + correct_avatar(); + return; + } + if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { + if (ifkp_numpixels == 0) return; + avatar_phase_correction++; + correct_avatar(); + return; + } + std::string mycall = progdefaults.myCall; + for (size_t n = 0; n < mycall.length(); n++) + mycall[n] = tolower(mycall[n]); + std::string fname = AvatarDir; + fname.append(mycall).append(".png"); + + my_avatar_img = Fl_Shared_Image::get(fname.c_str(), 59, 74); + + if (!my_avatar_img) return; + + string picmode = "\npic%A\n^r"; + ifkp_tx_text->add(picmode.c_str()); + active_modem->ifkp_send_avatar(); + return; + } + + if (Fl::event_button() == FL_LEFT_MOUSE) { + if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { + if (ifkp_numpixels == 0) return; + avatar_phase_correction -= 5; + correct_avatar(); + return; + } + if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { + if (ifkp_numpixels == 0) return; + avatar_phase_correction--; + correct_avatar(); + return; + } + std::string mycall = inpCall->value(); + if (mycall.empty()) return; + for (size_t n = 0; n < mycall.length(); n++) + mycall[n] = tolower(mycall[n]); + std::string fname = AvatarDir; + fname.append(mycall).append(".png"); + ifkp_avatar->save_png(fname.c_str()); + } +} + diff --git a/src/ifkp/ifkp.cxx b/src/ifkp/ifkp.cxx new file mode 100644 index 00000000..5d3227d7 --- /dev/null +++ b/src/ifkp/ifkp.cxx @@ -0,0 +1,808 @@ +// ---------------------------------------------------------------------------- +// ifkp.cxx -- ifkp modem +// +// Copyright (C) 2015 +// Dave Freese, W1HKJ +// +// This file is part of fldigi. +// +// Fldigi is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Fldigi is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with fldigi. If not, see . +// ---------------------------------------------------------------------------- + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "progress.h" +#include "ifkp.h" +#include "complex.h" +#include "fl_digi.h" +#include "ascii.h" +#include "misc.h" +#include "fileselect.h" +#include "threads.h" +#include "debug.h" + +#include "configuration.h" +#include "qrunner.h" +#include "fl_digi.h" +#include "status.h" +#include "main.h" +#include "icons.h" + +#include "confdialog.h" + +using namespace std; + +#include "ifkp_varicode.cxx" + +#define IFKP_SR 16000 + +#include "ifkp-pic.cxx" + +static fre_t call("([[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+)", REG_EXTENDED); +static string teststr = ""; +static string allowed = " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/"; +static char sz[21]; + +int ifkp::IMAGEspp = IMAGESPP; + +static string valid_callsign(char ch) +{ + if (allowed.find(ch) == std::string::npos) ch = ' '; + teststr += tolower(ch); + if (teststr.length() > 20) teststr.erase(0,1); + // wait for ' de ' + size_t p1; + if ((p1 = teststr.find(" de ")) != std::string::npos) { // test for callsign + p1 += 4; + if (p1 >= teststr.length()) return ""; + while (p1 < teststr.length() && teststr[p1] == ' ') p1++; + if (p1 == teststr.length()) return ""; + size_t p2 = teststr.rfind(' '); + if ((p2 > p1) && (p2 - p1 < 21)) { // found a word, test for callsign + memset(sz, 0, 21); + strcpy(sz, teststr.substr(p1, p2-p1).c_str()); + teststr.erase(0, p2); + if (call.match(sz)) { + return sz; + } + return ""; + } + } + return ""; +} + +// nibbles table used for fast conversion from tone difference to symbol + +static int nibbles[199]; +static void init_nibbles() +{ + int nibble = 0; + for (int i = 0; i < 199; i++) { + nibble = floor(0.5 + (i - 99.0)/IFKP_SPACING); + // allow for wrap-around (33 tones for 32 tone differences) + if (nibble < 0) nibble += 33; + if (nibble > 32) nibble -= 33; + // adjust for +1 symbol at the transmitter + nibble--; + nibbles[i] = nibble; + } +} + +ifkp::ifkp(trx_mode md) : modem() +{ + samplerate = IFKP_SR; + symlen = IFKP_SYMLEN; + + cap |= CAP_IMG; + + if (progdefaults.StartAtSweetSpot) { + frequency = progdefaults.PSKsweetspot; + } else + frequency = wf->Carrier(); + REQ(put_freq, frequency); + + mode = md; + fft = new g_fft(IFKP_FFTSIZE); + snfilt = new Cmovavg(200); + movavg_size = 4; + for (int i = 0; i < IFKP_NUMBINS; i++) binfilt[i] = new Cmovavg(movavg_size); + txphase = 0; + basetone = 197; + + rxfilter = new C_FIR_filter(); + float lo = frequency - 0.75 * bandwidth; + float hi = frequency + 0.75 * bandwidth; + rxfilter->init_bandpass(129, 1, lo/samplerate, hi/samplerate); + + picfilter = new C_FIR_filter(); + picfilter->init_lowpass(257, 1, 1.0 * bandwidth / samplerate); + + phase = 0; + phidiff = 2.0 * M_PI * frequency / samplerate; + + IMAGEspp = IMAGESPP; + pixfilter = new Cmovavg(IMAGEspp); + ampfilter = new Cmovavg(IMAGEspp); + syncfilter = new Cmovavg(3*IMAGEspp); + + bkptr = 0; + peak_counter = 0; + peak = last_peak = 0; + max = 0; + curr_nibble = prev_nibble = 0; + s2n = 0; + + memset(rx_stream, 0, sizeof(rx_stream)); + rx_text.clear(); + + for (int i = 0; i < IFKP_BLOCK_SIZE; i++) + a_blackman[i] = blackman(1.0 * i / IFKP_BLOCK_SIZE); + + state = TEXT; + + init_nibbles(); + + TX_IMAGE = TX_AVATAR = false; + + heard_log_fname = progdefaults.ifkp_heard_log; + std::string sheard = TempDir; + sheard.append(heard_log_fname); + heard_log.open(sheard.c_str(), ios::app); + + audit_log_fname = progdefaults.ifkp_audit_log; + std::string saudit = TempDir; + saudit.append(audit_log_fname); + audit_log.open(saudit.c_str(), ios::app); + + audit_log << "\n==================================================\n"; + audit_log << "Audit log: " << zdate() << ", " << ztime() << "\n"; + audit_log << "==================================================\n"; + audit_log.flush(); + + restart(); + +} + +ifkp::~ifkp() +{ + delete fft; + delete snfilt; + delete rxfilter; + delete picfilter; + for (int i = 0; i < IFKP_NUMBINS; i++) + delete binfilt[i]; + ifkp_deleteTxViewer(); + ifkp_deleteRxViewer(); + heard_log.close(); + audit_log.close(); +} + +void ifkp::tx_init(SoundBase *sc) +{ + scard = sc; + tone = prevtone = 0; + txphase = 0; + send_bot = true; + mycall = progdefaults.myCall; + if (progdefaults.ifkp_lowercase) + for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); + videoText(); +} + +void ifkp::rx_init() +{ + bkptr = 0; + peak_counter = 0; + peak = last_peak = 0; + max = 0; + curr_nibble = prev_nibble = 0; + s2n = 0; + + memset(rx_stream, 0, sizeof(rx_stream)); + + prevz = cmplx(0,0); + image_counter = 0; + state = TEXT; + + rx_text.clear(); + for (int i = 0; i < IFKP_NUMBINS; i++) { + tones[i] = 0.0; + binfilt[i]->reset(); + } + pixel = 0; + pic_str = " "; +} + +void ifkp::init() +{ + peak_hits = 4; + + mycall = progdefaults.myCall; + if (progdefaults.ifkp_lowercase) + for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); + + movavg_size = 3; + + for (int i = 0; i < IFKP_NUMBINS; i++) binfilt[i]->setLength(movavg_size); + + rx_init(); +} + +void ifkp::set_freq(double f) +{ + if (progdefaults.ifkp_freqlock) + frequency = 1500; + else + frequency = f; + + if (frequency < 100 + 0.5 * bandwidth) frequency = 100 + 0.5 * bandwidth; + if (frequency > 3900 - 0.5 * bandwidth) frequency = 3900 - 0.5 * bandwidth; + + tx_frequency = frequency; + + REQ(put_freq, frequency); + + set_bandwidth(33 * IFKP_SPACING * samplerate / symlen); + basetone = ceil((frequency - bandwidth / 2.0) * symlen / samplerate); + + float lo = frequency - 0.75 * bandwidth; + float hi = frequency + 0.75 * bandwidth; + rxfilter->init_bandpass(129, 1, lo/samplerate, hi/samplerate); + picfilter->init_lowpass(257, 1, 1.0 * bandwidth / samplerate); + phase = 0; + phidiff = 2.0 * M_PI * frequency / samplerate; + + std::ostringstream it; + it << "\nSamplerate..... " << samplerate; + it << "\nBandwidth...... " << bandwidth; + it << "\nlower cutoff... " << lo; + it << "\nupper cutoff... " << hi; + it << "\ncenter ........ " << frequency; + it << "\nSymbol length.. " << symlen << "\nBlock size..... " << IFKP_SHIFT_SIZE; + it << "\nMinimum Hits... " << peak_hits << "\nBasetone....... " << basetone << "\n"; + LOG_VERBOSE("%s", it.str().c_str()); +} + +void ifkp::show_mode() +{ + if (progdefaults.ifkp_baud == 0) + put_MODEstatus("IFKP 0.5"); + else if (progdefaults.ifkp_baud == 1) + put_MODEstatus("IFKP 1.0"); + else + put_MODEstatus("IFKP 2.0"); + return; +} + +void ifkp::restart() +{ + set_freq(wf->Carrier()); + + peak_hits = 4; + + mycall = progdefaults.myCall; + if (progdefaults.ifkp_lowercase) + for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); + + movavg_size = progdefaults.ifkp_baud == 2 ? 3 : 4; + + for (int i = 0; i < IFKP_NUMBINS; i++) binfilt[i]->setLength(movavg_size); + + show_mode(); + +} + +// valid printable character + +bool ifkp::valid_char(int ch) +{ + if ( ! (ch == 10 || ch == 163 || ch == 176 || + ch == 177 || ch == 215 || ch == 247 || + (ch > 31 && ch < 128))) + return false; + return true; +} + +//===================================================================== +// receive processing +//===================================================================== + +void ifkp::parse_pic(int ch) +{ + pic_str.erase(0,1); + pic_str += ch; + b_ava = false; + image_mode = 0; + if (pic_str.find("pic%") == 0) { + switch (pic_str[4]) { + case 'A': picW = 59; picH = 74; b_ava = true; break; + case 'T': picW = 59; picH = 74; break; + case 'S': picW = 160; picH = 120; break; + case 'L': picW = 320; picH = 240; break; + case 'F': picW = 640; picH = 480; break; + case 'V': picW = 640; picH = 480; break; + case 'P': picW = 240; picH = 300; break; + case 'p': picW = 240; picH = 300; image_mode = 1; break; + case 'M': picW = 120; picH = 150; break; + case 'm': picW = 120; picH = 150; image_mode = 1; break; + default: return; + } + } else + return; + if (!b_ava) + REQ( ifkp_showRxViewer, pic_str[4]); + else + REQ( ifkp_clear_avatar ); + image_counter = -symlen / 2; + col = row = rgb = 0; + syncfilter->reset(); + pixfilter->reset(); + ampfilter->reset(); + state = IMAGE_START; +} + +void ifkp::process_symbol(int sym) +{ + int nibble = 0; + int curr_ch = -1 ; + + symbol = sym; + + nibble = symbol - prev_symbol; + if (nibble < -99 || nibble > 99) { + prev_symbol = symbol; + return; + } + nibble = nibbles[nibble + 99]; + + if (nibble >= 0) { // process nibble + curr_nibble = nibble; + +// single-nibble characters + if ((prev_nibble < 29) & (curr_nibble < 29)) { + curr_ch = ifkp_varidecode[prev_nibble]; + +// double-nibble characters + } else if ( (prev_nibble < 29) && + (curr_nibble > 28) && + (curr_nibble < 32)) { + curr_ch = ifkp_varidecode[prev_nibble * 32 + curr_nibble]; + } + if (curr_ch > 0) { +// if (ch_sqlch_open || metric >= progStatus.sldrSquelchValue) { + if (metric >= progStatus.sldrSquelchValue) { + put_rx_char(curr_ch, FTextBase::RECV); + if (progdefaults.ifkp_enable_audit_log) { + audit_log << ifkp_ascii[curr_ch]; + if (curr_ch == '\n') audit_log << '\n'; + } + parse_pic(curr_ch); + station_calling = valid_callsign(curr_ch); + if (!station_calling.empty()) { + snprintf(szestimate, sizeof(szestimate), "%.0f db", s2n ); + REQ(add_to_heard_list, station_calling.c_str(), szestimate); + if (progdefaults.ifkp_enable_heard_log) { + std::string sheard = zdate(); + sheard.append(":").append(ztime()); + sheard.append(",").append(station_calling); + sheard.append(",").append(szestimate).append("\n"); + heard_log << sheard; + heard_log.flush(); + } + } + } + } + prev_nibble = curr_nibble; + } + + prev_symbol = symbol; +} + +void ifkp::process_tones() +{ + noise = 0; + max = 0; + peak = 0; + int firstbin = basetone - 21; +// time domain moving average filter for each tone bin + for (int i = 0; i < IFKP_NUMBINS; ++i) { + val = norm(fft_data[i + firstbin]); + tones[i] = binfilt[i]->run(val); + if (tones[i] > max) { + max = tones[i]; + peak = i; + } + } + + noise += (tones[0] + tones[IFKP_NUMBINS - 1]) / 2.0; + noise *= IFKP_FFTSIZE; + + if (noise < 1e-8) noise = 1e-8; + + s2n = 10 * log10(snfilt->run(tones[peak]*.734/noise)); + + snprintf(szestimate, sizeof(szestimate), "%.0f db", s2n ); + + metric = 2 * (s2n + 20); + metric = CLAMP(metric, 0, 100.0); // -20 to +30 db range + display_metric(metric); + + if (peak == prev_peak) { + peak_counter++; + } else { + peak_counter = 0; + } + + if ((peak_counter >= peak_hits) && + (peak != last_peak) && + (metric >= progStatus.sldrSquelchValue || + progStatus.sqlonoff == false)) { + process_symbol(peak); + peak_counter = 0; + last_peak = peak; + } + + prev_peak = peak; +} + +void ifkp::recvpic(double smpl) +{ + phase -= phidiff; + if (phase < 0) phase += 2.0 * M_PI; + + cmplx z = smpl * cmplx( cos(phase), sin(phase ) ); + picfilter->run( z, currz); + pixel = (samplerate / TWOPI) * pixfilter->run(arg(conj(prevz) * currz)); + sync = (samplerate / TWOPI) * syncfilter->run(arg(conj(prevz) * currz)); + prevz = currz; + amplitude = ampfilter->run(norm(currz)); + + image_counter++; + if (image_counter < 0) return; + + if (state == IMAGE_START) { + if (sync < -0.59 * bandwidth) { + state = IMAGE_SYNC; + } + return; + } + if (state == IMAGE_SYNC) { + if (sync > -0.51 * bandwidth) { + state = IMAGE; + } + return; + } + + if ((image_counter % IMAGEspp) == 0) { + + byte = pixel * 256.0 / bandwidth + 128; + byte = (int)CLAMP( byte, 0.0, 255.0); + + if (image_mode == 1) { // bw transmission + pixelnbr = 3 * (col + row * picW); + if (b_ava) { + REQ(ifkp_update_avatar, byte, pixelnbr); + REQ(ifkp_update_avatar, byte, pixelnbr + 1); + REQ(ifkp_update_avatar, byte, pixelnbr + 2); + } else { + REQ(ifkp_updateRxPic, byte, pixelnbr); + REQ(ifkp_updateRxPic, byte, pixelnbr + 1); + REQ(ifkp_updateRxPic, byte, pixelnbr + 2); + } + if (++ col == picW) { + col = 0; + row++; + if (row >= picH) { + state = TEXT; + REQ(ifkp_enableshift); + } + } + } else { // color transmission + pixelnbr = rgb + 3 * (col + row * picW); + if (b_ava) + REQ(ifkp_update_avatar, byte, pixelnbr); + else + REQ(ifkp_updateRxPic, byte, pixelnbr); + if (++col == picW) { + col = 0; + if (++rgb == 3) { + rgb = 0; + ++row; + } + } + if (row > picH) { + state = TEXT; + REQ(ifkp_enableshift); + } + } + + amplitude *= (samplerate/2)*(.734); // sqrt(3000 / (11025/2)) + s2n = 10 * log10(snfilt->run( amplitude * amplitude / noise)); + + metric = 2 * (s2n + 20); + metric = CLAMP(metric, 0, 100.0); // -20 to +30 db range + display_metric(metric); + amplitude = 0; + + } +} + +int ifkp::rx_process(const double *buf, int len) +{ + double val; + cmplx zin, z; + + if (bkptr < 0) bkptr = 0; + if (bkptr >= IFKP_SHIFT_SIZE) bkptr = 0; + + if (progStatus.ifkp_rx_abort) { + state = TEXT; + progStatus.ifkp_rx_abort = false; + REQ(ifkp_clear_rximage); + } + + while (len) { + if (state != TEXT) { + recvpic(*buf); + len--; + buf++; + } else { + rxfilter->Irun(*buf, val); + rx_stream[IFKP_BLOCK_SIZE + bkptr] = val; + len--; + buf++; + bkptr++; + + if (bkptr == IFKP_SHIFT_SIZE) { + bkptr = 0; + memcpy( rx_stream, // to + &rx_stream[IFKP_SHIFT_SIZE], // from + IFKP_BLOCK_SIZE*sizeof(*rx_stream)); // # bytes + memset(fft_data, 0, sizeof(fft_data)); + for (int i = 0; i < IFKP_BLOCK_SIZE; i++) + fft_data[i].real() = fft_data[i].imag() = + rx_stream[i] * a_blackman[i]; + fft->ComplexFFT(fft_data); + process_tones(); + } + } + } + return 0; +} + +//===================================================================== +// transmit processing +//===================================================================== + +void ifkp::transmit(double *buf, int len) +{ +// if (xmtfilt && progdefaults.ifkp_xmtfilter) +// for (int i = 0; i < len; i++) xmtfilt->Irun(buf[i], buf[i]); + ModulateXmtr(buf, len); +} + +void ifkp::send_tone(int tone) +{ + double phaseincr; + double frequency; + double freq_error = ctrl_freq_offset->value(); + + frequency = (basetone + tone * IFKP_SPACING) * samplerate / symlen; + if (grpNoise->visible() && btnOffsetOn->value()==true) + frequency += freq_error; + phaseincr = 2.0 * M_PI * frequency / samplerate; + prevtone = tone; + + int send_symlen = symlen * ( + progdefaults.ifkp_baud == 2 ? 0.5 : + progdefaults.ifkp_baud == 0 ? 2.0 : 1.0); + + for (int i = 0; i < send_symlen; i++) { + outbuf[i] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + transmit(outbuf, send_symlen); +} + +void ifkp::send_symbol(int sym) +{ + tone = (prevtone + sym + IFKP_OFFSET) % 33; + send_tone(tone); +} + +void ifkp::send_idle() +{ + send_symbol(0); +} + +void ifkp::send_char(int ch) +{ + if (ch <= 0) return send_idle(); + + int sym1 = ifkp_varicode[ch][0]; + int sym2 = ifkp_varicode[ch][1]; + + send_symbol(sym1); + if (sym2 > 28) + send_symbol(sym2); + put_echo_char(ch); +} + +void ifkp::send_avatar() +{ + int W = 59, H = 74; // grey scale transfer (FAX) + float freq, phaseincr; + float radians = 2.0 * M_PI / samplerate; + + freq = frequency - 0.6 * bandwidth; + #define PHASE_CORR (3 * symlen / 2) + phaseincr = radians * freq; + for (int n = 0; n < PHASE_CORR; n++) { + outbuf[n] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + transmit(outbuf, PHASE_CORR); + + for (int row = 0; row < H; row++) { + for (int color = 0; color < 3; color++) { + memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); + for (int col = 0; col < W; col++) { + if (stopflag) return; + tx_pixelnbr = col + row * W; + tx_pixel = ifkp_get_avatar_pixel(tx_pixelnbr, color); + freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; + phaseincr = radians * freq; + for (int n = 0; n < IMAGEspp; n++) { + outbuf[n] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + transmit(outbuf, IMAGEspp); + } + Fl::awake(); + } + } +} + +void ifkp::send_image() +{ + int W = 640, H = 480; // grey scale transfer (FAX) + bool color = true; + float freq, phaseincr; + float radians = 2.0 * M_PI / samplerate; + + if (!ifkppicTxWin || !ifkppicTxWin->visible()) { + return; + } + + switch (selifkppicSize->value()) { + case 0 : W = 59; H = 74; break; + case 1 : W = 160; H = 120; break; + case 2 : W = 320; H = 240; break; + case 3 : W = 640; H = 480; color = false; break; + case 4 : W = 640; H = 480; break; + case 5 : W = 240; H = 300; break; + case 6 : W = 240; H = 300; color = false; break; + case 7 : W = 120; H = 150; break; + case 8 : W = 120; H = 150; color = false; break; + } + + REQ(ifkp_clear_tximage); + + freq = frequency - 0.6 * bandwidth; + #define PHASE_CORR (3 * symlen / 2) + phaseincr = radians * freq; + for (int n = 0; n < PHASE_CORR; n++) { + outbuf[n] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + transmit(outbuf, PHASE_CORR); + + if (color == false) { // grey scale image + for (int row = 0; row < H; row++) { + memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); + for (int col = 0; col < W; col++) { + if (stopflag) return; + tx_pixelnbr = col + row * W; + tx_pixel = 0.3 * ifkppic_TxGetPixel(tx_pixelnbr, 0) + // red + 0.6 * ifkppic_TxGetPixel(tx_pixelnbr, 1) + // green + 0.1 * ifkppic_TxGetPixel(tx_pixelnbr, 2); // blue + REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + 0); + REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + 1); + REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + 2); + freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; + phaseincr = radians * freq; + for (int n = 0; n < IMAGEspp; n++) { + outbuf[n] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + transmit(outbuf, IMAGEspp); + Fl::awake(); + } + } + } else { + for (int row = 0; row < H; row++) { + for (int color = 0; color < 3; color++) { + memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); + for (int col = 0; col < W; col++) { + if (stopflag) return; + tx_pixelnbr = col + row * W; + tx_pixel = ifkppic_TxGetPixel(tx_pixelnbr, color); + REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + color); + freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; + phaseincr = radians * freq; + for (int n = 0; n < IMAGEspp; n++) { + outbuf[n] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + transmit(outbuf, IMAGEspp); + } + Fl::awake(); + } + } + } +} + +void ifkp::ifkp_send_image() { + TX_IMAGE = true; + start_tx(); +} + +void ifkp::ifkp_send_avatar() { + TX_AVATAR = true; + start_tx(); +} + +int ifkp::tx_process() +{ + if (send_bot) { + send_bot = false; + send_char(0); + send_char(0); + } + int c = get_tx_char(); + if (c == GET_TX_CHAR_ETX) { + if (TX_IMAGE) send_image(); + if (TX_AVATAR) send_avatar(); + send_char(0); + stopflag = false; + TX_IMAGE = false; + TX_AVATAR = false; + return -1; + } + if ( stopflag ) { // aborts transmission + TX_IMAGE = false; + TX_AVATAR = false; + stopflag = false; + return -1; + } + send_char(c); + return 0; +} + diff --git a/src/ifkp/ifkp_bitmaps.cxx b/src/ifkp/ifkp_bitmaps.cxx new file mode 100644 index 00000000..2a7fc632 --- /dev/null +++ b/src/ifkp/ifkp_bitmaps.cxx @@ -0,0 +1,52 @@ +// ---------------------------------------------------------------------------- +// Copyright (C) 2014 +// David Freese, W1HKJ +// +// This file is part of flrig. +// +// flrig is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// flrig is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// ---------------------------------------------------------------------------- + +#include + +static unsigned char s2n_data[] = { + 0x02, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x80, 0x00, 0x40, 0x00, 0x80, 0x00, 0x40, 0x02, 0x80, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x40, + 0x00, 0x80, 0x00, 0x40, 0x02, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x40, 0x00, 0x80, 0x00, 0x40, + 0x02, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x80, 0x00, 0x40, 0x00, 0x80, 0x00, 0x40, 0x02, 0x80, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x40, + 0x00, 0x80, 0x00, 0x40, 0x02, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x40, 0x00, 0x80, 0x00, 0x40, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x20, + 0x12, 0x00, 0x00, 0x92, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x12, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x90, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x40, + 0x02, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x23, 0x12, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x20, + 0x12, 0x00, 0x00, 0x84, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x12, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x82, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x0c, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x70, 0x0c, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +Fl_Bitmap image_s2n(s2n_data, 160, 16); diff --git a/src/ifkp/ifkp_varicode.cxx b/src/ifkp/ifkp_varicode.cxx new file mode 100644 index 00000000..53daf163 --- /dev/null +++ b/src/ifkp/ifkp_varicode.cxx @@ -0,0 +1,110 @@ +int ifkp_varicode[][2] = { + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, + {27,31}, { 0, 0}, {28,30}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, + {28, 0}, {11,30}, {12,30}, {13,30}, {14,30}, {15,30}, {16,30}, {17,30},//' '!-' + {18,30}, {19,30}, {20,30}, {21,30}, {27,29}, {22,30}, {27, 0}, {23,30}, + {10,30}, { 1,30}, { 2,30}, { 3,30}, { 4,30}, { 5,30}, { 6,30}, { 7,30},// 0 - 7 + { 8,30}, { 9,30}, {24,30}, {25,30}, {26,30}, { 0,31}, {27,30}, {28,29},// 8, 9 + { 0,29}, { 1,29}, { 2,29}, { 3,29}, { 4,29}, { 5,29}, { 6,29}, { 7,29}, + { 8,29}, { 9,29}, {10,29}, {11,29}, {12,29}, {13,29}, {14,29}, {15,29}, + {16,29}, {17,29}, {18,29}, {19,29}, {20,29}, {21,29}, {22,29}, {23,29}, // ... : + {24,29}, {25,29}, {26,29}, { 1,31}, { 2,31}, { 3,31}, { 4,31}, { 5,31}, + { 9,31}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 0}, { 5, 0}, { 6, 0}, { 7, 0},// @ - g + { 8, 0}, { 9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0},// h - o + {16, 0}, {17, 0}, {18, 0}, {19, 0}, {20, 0}, {21, 0}, {22, 0}, {23, 0},// p - w + {24, 0}, {25, 0}, {26, 0}, { 6,31}, { 7,31}, { 8,31}, { 0,30}, {28,31},// x - 127 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//135 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//143 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//151 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//159 + { 0, 0}, { 0, 0}, { 0, 0}, {14,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//167 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//175 + {12,31}, {10,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//183 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//191 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//199 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//207 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {13,31},//215 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//223 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//231 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//239 + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {11,31},//247 + {12,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0} //255 +}; + +/* + * The same in a format more suitable for decoding. + * The index is the varicode symbol, being 1-2 nibbles. The value is the + * ASCII character. + * NB. Do NOT use CR as a line feed, as you will get an extra space and the + * new line will be indented. Use LF = ascii 10 instead. + */ +// decode [ prev * 32 + curr] ; 0 < prev < 29; curr == 29, 30, 31 +int ifkp_varidecode[] = { +// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 + 00, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122, 46, 32, 64,126, 61, // 0 - 31 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, 49, 91, // 32 - 63 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, 50, 92, // 2 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 51, 93, // 3 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, 52, 94, // 4 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, 53, 95, // 5 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 54,123, // 6 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, 55,124, // 7 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 72, 56,125, // 8 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 73, 57, 96, // 9 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, 48,177, // 10 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, 33,247, // 11 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, 34,176, // 12 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, 35,215, // 13 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 78, 36,163, // 14 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 79, 37, -1, // 15 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, 38, -1, // 16 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 39, -1, // 17 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, 40, -1, // 18 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 83, 41, -1, // 19 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 42, -1, // 20 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, 43, -1, // 21 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, 45, -1, // 22 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 47, -1, // 23 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, 58, -1, // 24 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 89, 59, -1, // 25 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 90, 60, -1, // 26 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 62, 8, // 27 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, 10,127, // 28 +}; + +const char *ifkp_ascii[256] = { + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + " ", "!", "\"", "#", "$", "%", "&", "\'", + "(", ")", "*", "+", ",", "-", ".", "/", + "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", ":", ";", "<", "=", ">", "?", + "@", "A", "B", "C", "D", "E", "F", "G", + "H", "I", "J", "K", "L", "M", "N", "O", + "P", "Q", "R", "S", "T", "U", "V", "W", + "X", "Y", "Z", "[", "\\", "]", "^", "_", + "`", "a", "b", "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", "m", "n", "o", + "p", "q", "r", "s", "t", "u", "v", "w", + "x", "y", "z", "{", "|", "}", "~", "", + "<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>", + "<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>", + "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", + "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", + "<160>", "<161>", "<162>", "£", "<164>", "<165>", "<166>", "<167>", + "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", + "°", "±", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", + "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", + "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", + "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", + "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "×", + "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", + "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", + "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", + "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "÷", + "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>" +}; diff --git a/src/ifkp/notes/ifkp_notes.txt b/src/ifkp/notes/ifkp_notes.txt new file mode 100644 index 00000000..06d1ac0f --- /dev/null +++ b/src/ifkp/notes/ifkp_notes.txt @@ -0,0 +1,214 @@ +Varicode IFKP.V1 + +Incremental Frequency Keying Plus +====================== + + +Copyright D.Freese, W1HKJ @2015 + +Notes: + +A. IFKP borrows heavily from Murray Greenman's (ZL1BPU) FSQ varicode implementation. + +1. IFKP is an MFSK mode with an offset of +1. It is designed for very high + coding efficiency. This version uses 33 tones (32 differences), a mildly + Varicoded Alphabet, with a rotating difference frequency. Modem statistics: + + Samplerate...... 16000 + Bandwidth....... 386 + center ......... 1500 + Symbol length... 4096 + Lower case cps.. 3.654234 + +2. Tone differences are expressed as decimal numbers 0 - 31. This alphabet is + called IFKP.V1. + +3. The design uses single-symbol and two-symbol character codes. The character + set does not include much extended ASCII, and has only 116 different codes. + It is a strongly 'unsquare' design (29 x 3), which restricts the number + of codes, but we don't need the maximum anyway. This 'unsquare' code maximizes + the single-symbol set to 29, so will fit all lower case in one symbol. + +4. 'Ham speak' doesn't follow standard text for letter frequency, having a higher + incidence of letters such as Q, X and Z (in Q codes and callsigns). Lower case + letters are more common than upper case. Numbers are considered equal in frequency + of occurance as upper case characters. + + This character set has been designed for one set of 29 single-symbol characters, + and three two-symbol sets of upper case letters, number and punctuation. There + is some spare space, and a few popular extended ASCII characters have been + included (± ÷ ° £ ×). + +5. Unlike 'conventional' DominoEX, the design does not use a single-bit as the + continuation flag. Using 29 initials means using a comparison process to + discover where the initial symbols are. + +6. There are 29 single-symbol characters, 87 two-symbol codes, and a total + alphabet of 116 codes. This allows coding all upper case, lower case and + punctuation. There is no Secondary Text or Lexicon in this version. The + symbol set differs principally from WSQ / FSQ in that the most common symbol + is the NULL, a non printing character and is assigned a single symbol entry + in the table. + +7. The nomenclature used for the character symbol numbers in the tables is + [1st_symbol],([2nd_symbol]), expressed in decimal, where the [1st_symbol] + always has values < 29, while [2nd_symbol] will have a value + 29 < [2nd_symbol] < 32. + +8. The IFKP.V1 alphabet is defined by two Varicode Tables (Table 1 and Table 2). + +Table 1. Characters in ASCII order + ++-----------------------+-----------------------+-----------------------+ +| CHAR ASCII VAR | CHAR ASCII VAR | CHAR ASCII VAR | ++-----------------------+-----------------------+-----------------------+ +| IDLE 0 0 | @ 64 0,29 | ` 96 9,31 | +| ! 33 11,30 | A 65 1,29 | a 97 1 | +| " 34 12,30 | B 66 2,29 | b 98 2 | +| # 35 13,30 | C 67 3,29 | c 99 3 | +| $ 36 14,30 | D 68 4,29 | d 100 4 | +| % 37 15,30 | E 69 5,29 | e 101 5 | +| & 38 16,30 | F 70 6,29 | f 102 6 | +| ' 39 17,30 | G 71 7,29 | g 103 7 | +| ( 40 18,30 | H 72 8,29 | h 104 8 | +| ) 41 19,30 | I 73 9,29 | i 105 9 | +| * 42 20,30 | J 74 10,29 | j 106 10 | +| + 43 21,30 | K 75 11,29 | k 107 11 | +| , 44 27,29 | L 76 12,29 | l 108 12 | +| - 45 22,30 | M 77 13,29 | m 109 13 | +| . 46 27 | N 78 14,29 | n 110 14 | +| / 47 23,30 | O 79 15,29 | o 111 15 | +| | | | +| 0 48 10,30 | P 80 16,29 | p 112 16 | +| 1 49 1,30 | Q 81 17,29 | q 113 17 | +| 2 50 2,30 | R 82 18,29 | r 114 18 | +| 3 51 3,30 | S 83 19,29 | s 115 19 | +| 4 52 4,30 | T 84 20,29 | t 116 20 | +| 5 53 5,30 | U 85 21,29 | u 117 21 | +| 6 54 6,30 | V 86 22,29 | v 118 22 | +| 7 55 7,30 | W 87 23,29 | w 119 23 | +| 8 56 8,30 | X 88 24,29 | x 120 24 | +| 9 57 9,30 | Y 89 25,29 | y 121 25 | +| : 58 24,30 | Z 90 26,29 | z 122 26 | +| ; 59 25,30 | [ 91 1,31 | { 123 6,31 | +| < 60 26,30 | \ 92 2,31 | | 124 7,31 | +| = 61 0,31 | ] 93 3,31 | } 125 8,31 | +| > 62 27,30 | ^ 94 4,31 | ~ 126 0,30 | +| ? 63 28,29 | _ 95 5,31 | DEL 127 28,31 | ++-----------------------+-----------------------+-----------------------+ +| CRLF 13/10 28,30 | +| SPACE 32 28 | +| ± 241 10,31 | +| ÷ 246 11,31 | +| ° 248 12,31 | +| × 158 13,31 | +| £ 156 14,31 | +| BS 8 27,31 | ++-----------------------+ + +Table 2. Characters in Symbol Varicode order + ++---------------+---------------+---------------+---------------+ +| SYMS CHAR | SYMS CHAR | SYMS CHAR | SYMS CHAR | ++---------------+---------------+---------------+---------------+ +| 0 NULL | 0,29 @ | 0,30 ~ | 0,31 = | +| 1 a | 1,29 A | 1,30 1 | 1,31 [ | +| 2 b | 2,29 B | 2,30 2 | 2,31 \ | +| 3 c | 3,29 C | 3,30 3 | 3,31 ] | +| 4 d | 4,29 D | 4,30 4 | 4,31 ^ | +| 5 e | 5,29 E | 5,30 5 | 5,31 _ | +| 6 f | 6,29 F | 6,30 6 | 6,31 { | +| 7 g | 7,29 G | 7,30 7 | 7,31 | | +| 8 h | 8,29 H | 8,30 8 | 8,31 } | +| 9 i | 9,29 I | 9,30 9 | 9,31 ` | +| 10 j | 10,29 J | 10,30 0 | 10,31 ± | +| 11 k | 11,29 K | 11,30 ! | 11,31 ÷ | +| 12 l | 12,29 L | 12,30 " | 12,31 ° | +| 13 m | 13,29 M | 13,30 # | 13,31 × | +| 14 n | 14,29 N | 14,30 $ | 14,31 £ | +| 15 o | 15,29 O | 15,30 % | 15,31 | +| | | | | +| 16 p | 16,29 P | 16,30 & | 16,31 | +| 17 q | 17,29 Q | 17,30 ' | 17,31 | +| 18 r | 18,29 R | 18,30 ( | 18,31 | +| 19 s | 19,29 S | 19,30 ) | 19,31 | +| 20 t | 20,29 T | 20,30 * | 20,31 | +| 21 u | 21,29 U | 21,30 + | 21,31 | +| 22 v | 22,29 V | 22,30 - | 22,31 | +| 23 w | 23,29 W | 23,30 / | 23,31 | +| 24 x | 24,29 X | 24,30 : | 24,31 | +| 25 y | 25,29 Y | 25,30 ; | 25,31 | +| 26 z | 26,29 Z | 26,30 < | 26,31 | +| 27 . | 27,29 , | 27,30 > | 27,31 BS | +| 28 SPACE | 28,29 ? | 28,30 CRLF | 28,31 DEL | +| 29 (cont) | | | | +| 30 (cont) | | | | +| 31 (cont) | | | | ++---------------+---------------+---------------+---------------+ + + +9. Here is a simple analysis of projected text efficiency compared with +'conventional' DominoEX: + +Message: The Quick Brown Fox jumps over the lazy dog 1234567890. +DominoEX 2211221221211211212122222112111121121221212122222222222 = 88 symbols +IFKP.V1 2111211111211111211111111111111111111111111122222222221 = 69 symbols + +Message: vk2abc de zl1xyz ge om ur rst529 name fred. hw? kkk +DominoEX 222121111122222212111211111112221112112111212221222 = 75 symbols +IFKP.V1 112111111111211111111111111112221111111111111121111 = 57 symbols + +It is about 27% more efficient than DominoEX. Note especially the score sending +typical 'ham speak' - some 30% more efficient than DominoEX. The typing speed at +7 cps is about 70 WPM. Q codes and callsigns should be sent in lower case when +possible. + +Character rate statistics for various character sets when sent using IFKP-1.0, +the base rate: + +text: . abcdefghijklmn opqrstuvwxyz +chars/sec: 7.812500 + +text: ABCDEFGHIJKLMNOPQRSTUVWXYZ +chars/sec: 3.906250 + +text: 0123456789 +chars/sec: 3.906250 + +text: !@#$%&*()_+-=[]{}\|;:'",<>/? +chars/sec: 3.906250 + +text: kh6ty de w1hkj ge om ur rst 529 name dave hw? kkk +chars/sec: 6.96 + +IFKP-0.5, IFKP-1.5 and IFKP-2.0 use a transmit symbol length with a factor of +2.0, 0.6665, and 0.5 respectively. + +================================================================================ + +10. + +static unsigned char ifkp_varicode[][2] = { + /* Primary alphabet */ + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, + {27,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 28,0}, { 0, 0}, { 0, 0}, + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, + { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, + { 0, 0}, {11,30}, {12,30}, {13,30}, {14,30}, {15,30}, {16,30}, {17,30}, + {18,30}, {19,30}, {20,30}, {21,30}, {27,29}, {22,30}, {27, 0}, {23,30}, + {10,30}, { 1,30}, { 2,30}, { 3,30}, { 4,30}, { 5,30}, { 6,30}, { 7,30}, + { 8,30}, { 9,30}, {24,30}, {25,30}, {26,30}, { 0,31}, {27,30}, {28,30}, + { 0,29}, { 1,29}, { 2,29}, { 3,29}, { 4,29}, { 5,29}, { 6,29}, { 7,29}, + { 8,29}, { 9,29}, {10,29}, {11,29}, {12,29}, {13,29}, {14,29}, {15,29}, + {16,29}, {17,29}, {18,29}, {19,29}, {20,29}, {21,29}, {22,29}, {23,29}, + {24,29}, {25,29}, {26,29}, { 1,31}, { 2,31}, { 3,31}, { 4,31}, { 5,31}, + { 9,31}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 0}, { 5, 0}, { 6, 0}, { 7, 0}, + { 8, 0}, { 9, 0}, {10, 0}, {10, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0}, + {16, 0}, {17, 0}, {18, 0}, {19, 0}, {20, 0}, {21, 0}, {22, 0}, {23, 0}, + {24, 0}, {25, 0}, {26, 0}, { 6,31}, { 7,31}, { 8,31}, { 0,31}, {28,31}, + +11. IFKP transmits and receives in image mode. The image mode is nearly identical +to the FSQ image mode with the exception of the RGB transmission sequence. FSQ +transmits in Blue-Green-Red order, whereas IFKP transmits in Red-Green-Blue order. +The IFKP image bandwidth is less than 400 Hz. + diff --git a/src/ifkp/tux.cxx b/src/ifkp/tux.cxx new file mode 100644 index 00000000..4c852306 --- /dev/null +++ b/src/ifkp/tux.cxx @@ -0,0 +1,823 @@ +// tux avatar +unsigned char tux_img[] = { + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 36, 36, 36, 74, 74, 76, 44, 44, 44, 2, 2, + 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 36, 36, 36, 124, 124, 124, 86, 86, 84, 28, + 28, 27, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 44, 44, 44, 92, 92, 92, 60, 60, 60, + 36, 36, 36, 10, 6, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 10, 6, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 12, 12, 12, + 10, 6, 4, 44, 44, 44, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 52, 52, + 52, 20, 20, 19, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 20, 20, + 19, 131, 131, 132, 2, 2, 4, 52, 52, 52, 2, 2, 4, 2, 2, 4, + 12, 12, 12, 2, 2, 4, 86, 86, 84, 141, 141, 140, 156, 156, 156, 68, + 68, 68, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 148, + 148, 148, 204, 204, 204, 156, 156, 156, 20, 20, 19, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 100, 100, 100, 172, 172, 172, 196, 196, 196, 204, 204, 204, + 181, 180, 179, 28, 28, 27, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 10, 6, 4, + 244, 244, 244, 254, 254, 252, 254, 254, 252, 228, 228, 228, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 221, 221, 220, 254, 254, 252, 228, 228, 228, 212, 212, + 212, 244, 244, 244, 164, 164, 164, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 60, 60, + 60, 124, 124, 124, 60, 60, 60, 148, 148, 148, 254, 254, 252, 12, 12, 12, + 12, 12, 12, 2, 2, 4, 244, 244, 244, 244, 244, 244, 2, 2, 4, 148, + 148, 148, 212, 212, 212, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 86, + 86, 84, 2, 2, 4, 2, 2, 4, 44, 44, 44, 254, 254, 252, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 236, 236, 236, 36, 36, 36, 2, 2, 4, + 12, 12, 12, 12, 12, 12, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, + 52, 52, 52, 12, 12, 12, 2, 2, 4, 2, 2, 4, 164, 164, 164, 182, + 140, 8, 172, 140, 4, 142, 106, 7, 156, 156, 156, 60, 60, 60, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 254, 254, 252, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, + 4, 2, 2, 4, 254, 254, 252, 2, 2, 4, 173, 120, 10, 173, 120, 10, + 235, 188, 11, 225, 180, 10, 142, 106, 7, 225, 180, 10, 225, 180, 10, 2, + 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, + 2, 4, 2, 2, 4, 228, 228, 228, 173, 120, 10, 218, 163, 9, 236, 180, + 11, 235, 188, 11, 235, 196, 12, 235, 205, 40, 244, 213, 67, 241, 212, 42, + 243, 196, 11, 215, 172, 9, 196, 196, 196, 156, 156, 156, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 2, 2, 4, 2, 2, 4, 165, 114, 10, 201, 142, 7, 229, 172, 9, 236, + 180, 11, 235, 196, 12, 237, 204, 14, 242, 218, 44, 246, 218, 74, 246, 218, + 20, 246, 213, 13, 246, 218, 20, 243, 205, 12, 235, 179, 22, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 2, 2, 4, 73, 48, 6, 192, 133, 7, 216, 156, 8, 236, 180, 11, + 235, 188, 11, 235, 196, 12, 235, 205, 40, 246, 218, 74, 246, 218, 20, 246, + 218, 20, 246, 213, 13, 246, 213, 13, 150, 114, 11, 229, 172, 9, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 2, 2, 4, 106, 75, 6, 201, 142, 7, 223, 165, 9, 242, 182, + 12, 235, 188, 11, 237, 204, 14, 244, 213, 67, 246, 218, 20, 246, 213, 13, + 246, 213, 13, 208, 164, 13, 206, 142, 8, 218, 163, 9, 216, 156, 8, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 2, 2, 4, 2, 2, 4, 116, 73, 4, 215, 172, 9, 245, + 189, 12, 235, 196, 12, 235, 205, 40, 241, 211, 17, 246, 213, 13, 237, 204, + 14, 106, 75, 6, 207, 148, 7, 216, 156, 8, 216, 156, 8, 199, 138, 8, + 2, 2, 4, 2, 2, 4, 124, 124, 124, 28, 28, 27, 2, 2, 4, 2, + 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 164, 164, 164, 136, 95, 7, + 142, 106, 7, 189, 157, 4, 189, 157, 4, 154, 119, 11, 164, 109, 5, 192, + 133, 7, 206, 142, 8, 207, 148, 7, 192, 133, 7, 190, 189, 188, 190, 189, + 188, 2, 2, 4, 2, 2, 4, 36, 36, 36, 131, 131, 132, 52, 52, 52, + 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 190, 189, 188, 190, 189, + 188, 155, 102, 5, 193, 139, 10, 223, 165, 9, 215, 150, 13, 206, 142, 8, + 192, 133, 7, 192, 133, 7, 184, 173, 150, 190, 189, 188, 196, 196, 196, 196, + 196, 196, 28, 28, 27, 2, 2, 4, 2, 2, 4, 124, 124, 124, 74, 74, + 76, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 190, 189, 188, 190, + 189, 188, 190, 189, 188, 144, 96, 7, 164, 109, 5, 164, 109, 5, 155, 102, + 5, 171, 114, 5, 190, 189, 188, 181, 180, 179, 196, 196, 196, 244, 244, 244, + 244, 244, 244, 212, 212, 212, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 236, 236, 236, + 204, 204, 204, 190, 189, 188, 190, 189, 188, 181, 180, 179, 184, 173, 150, 190, + 189, 188, 190, 189, 188, 190, 189, 188, 204, 204, 204, 244, 244, 244, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 28, 28, 27, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 12, 12, 12, 2, 2, 4, 108, 108, 107, 254, 254, + 252, 236, 236, 236, 190, 189, 188, 190, 189, 188, 190, 189, 188, 190, 189, 188, + 190, 189, 188, 190, 189, 188, 212, 212, 212, 244, 244, 244, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 2, 2, 4, 12, 12, 12, 20, 20, 19, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 204, 204, 204, 190, 189, 188, 190, 189, 188, 190, 189, + 188, 212, 212, 212, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 10, 6, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 228, 228, 228, 244, + 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, + 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, + 244, 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 164, 164, 164, 244, 244, 244, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 236, + 236, 236, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 221, 221, 220, + 228, 228, 228, 52, 52, 52, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 156, 156, 156, 196, 196, + 196, 228, 228, 228, 244, 244, 244, 244, 244, 244, 244, 244, 244, 228, 228, 228, + 228, 228, 228, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, + 244, 244, 212, 212, 212, 204, 204, 204, 196, 196, 196, 196, 196, 196, 190, 189, + 188, 196, 196, 196, 244, 244, 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 172, 172, 172, 228, + 228, 228, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, + 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 236, 236, 236, 221, 221, 220, 204, 204, 204, 196, + 196, 196, 190, 189, 188, 204, 204, 204, 100, 100, 100, 2, 2, 4, 60, 60, + 60, 36, 36, 36, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, + 4, 2, 2, 4, 12, 12, 12, 2, 2, 4, 164, 164, 164, 228, 228, 228, + 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, + 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 244, 244, 244, 212, 212, 212, 190, 189, 188, 244, 244, 244, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 52, 52, 52, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, + 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 196, 196, 196, 254, 254, 252, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 68, 68, 68, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, + 2, 2, 4, 12, 12, 12, 2, 2, 4, 181, 180, 179, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 212, 212, + 212, 2, 2, 4, 12, 12, 12, 44, 44, 44, 12, 12, 12, 10, 6, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, + 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 44, 44, 44, 20, 20, 19, 80, 80, 80, 28, 28, 27, 80, 80, + 80, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, + 2, 4, 10, 6, 4, 2, 2, 4, 204, 204, 204, 254, 254, 252, 244, 244, + 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, + 254, 254, 252, 244, 244, 244, 20, 20, 19, 28, 28, 27, 12, 12, 12, 12, + 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, + 12, 12, 12, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 244, + 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 36, 36, 36, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, + 4, 100, 100, 100, 2, 2, 4, 28, 28, 27, 254, 254, 252, 254, 254, 252, + 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, + 244, 244, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, + 2, 4, 10, 6, 4, 2, 2, 4, 228, 228, 228, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 221, 221, 220, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, + 254, 254, 252, 244, 244, 244, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, + 10, 6, 4, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 221, 221, 220, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 10, 6, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 44, 44, 44, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, + 4, 20, 20, 19, 2, 2, 4, 20, 20, 19, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 221, 221, 220, 244, 244, 244, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 36, 36, 36, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, + 2, 4, 28, 28, 27, 2, 2, 4, 28, 28, 27, 244, 244, 244, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, + 254, 254, 252, 254, 254, 252, 221, 221, 220, 254, 254, 252, 244, 244, 244, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 60, 60, 60, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 60, 60, 60, 2, 2, 4, 60, 60, 60, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 244, 244, 244, 254, 254, 252, 228, 228, 228, 244, 244, 244, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 68, 68, 68, + 2, 2, 4, 2, 2, 4, 68, 68, 68, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 20, 20, 19, 36, 36, 36, 100, 100, 100, 254, 254, 252, + 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, + 244, 244, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, + 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 60, 60, + 60, 2, 2, 4, 2, 2, 4, 20, 20, 19, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 92, 92, 92, 244, 244, + 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, + 252, 254, 254, 252, 244, 244, 244, 244, 244, 244, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 244, 244, 244, 2, + 2, 4, 12, 12, 12, 60, 60, 60, 10, 6, 4, 36, 36, 36, 44, 44, + 44, 12, 12, 12, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 207, 148, 7, 245, 189, 12, 223, 165, 9, 2, 2, 4, 80, 80, 80, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, + 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 124, 124, 124, 2, 2, 4, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 193, 139, + 10, 242, 182, 12, 245, 189, 12, 245, 189, 12, 229, 172, 9, 2, 2, 4, + 68, 68, 68, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 223, 172, 66, 236, 180, 11, 235, 179, + 22, 126, 98, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 60, 60, 60, 28, 28, 27, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 215, + 150, 13, 235, 179, 22, 245, 189, 12, 245, 189, 12, 245, 189, 12, 165, 114, + 10, 2, 2, 4, 108, 108, 107, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, + 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 229, 172, 9, 243, 196, 11, 246, + 213, 13, 148, 108, 9, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 20, 20, 19, 20, 20, 19, 164, 119, 10, 226, 188, 12, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 199, 138, 8, + 223, 165, 9, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 145, 102, 10, 2, 2, 4, 20, 20, 19, 244, 244, 244, 254, 254, + 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 223, 165, 9, 245, 189, 12, + 226, 188, 12, 92, 67, 9, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 235, 196, 12, 243, 205, + 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 182, + 126, 10, 216, 156, 8, 218, 163, 9, 209, 155, 9, 207, 148, 7, 229, 172, + 9, 236, 180, 11, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 237, 204, 14, 2, 2, 4, 2, 2, 4, 10, 6, 4, 228, + 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, + 244, 244, 254, 254, 252, 244, 244, 244, 221, 221, 220, 223, 165, 9, 242, 182, + 12, 229, 172, 9, 173, 120, 10, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 223, 165, 9, 235, 188, 11, 245, + 189, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 215, 150, 13, 235, 179, 22, 236, 180, 11, 229, 172, 9, 236, 180, 11, 242, + 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 243, 196, 11, 170, 126, 10, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, + 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 204, 204, 204, 196, 196, 196, 216, 156, 8, 236, + 180, 11, 223, 165, 9, 185, 131, 9, 73, 48, 6, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 41, 28, 4, 185, 131, 9, 229, 172, 9, 235, 188, 11, + 245, 189, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 181, 126, + 47, 218, 163, 9, 236, 180, 11, 242, 182, 12, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 226, 188, 12, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 12, 12, 12, 181, 180, 179, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 196, 196, 196, 196, 196, 196, 215, 150, 13, + 229, 172, 9, 229, 172, 9, 207, 148, 7, 185, 131, 9, 179, 121, 7, 173, + 120, 10, 179, 121, 7, 192, 133, 7, 216, 156, 8, 242, 182, 12, 245, 189, + 12, 245, 189, 12, 215, 172, 9, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 218, 163, 9, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 243, 196, 11, 194, 147, 11, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, + 244, 244, 254, 254, 252, 254, 254, 252, 204, 204, 204, 196, 196, 196, 201, 142, + 7, 229, 172, 9, 236, 180, 11, 218, 163, 9, 207, 148, 7, 207, 148, 7, + 207, 148, 7, 207, 148, 7, 223, 165, 9, 236, 180, 11, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 242, 182, 12, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 216, 156, 8, 235, 179, 22, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 243, 205, 12, + 20, 20, 19, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 196, 196, 196, 185, + 131, 9, 223, 165, 9, 242, 182, 12, 236, 180, 11, 223, 165, 9, 223, 165, + 9, 223, 165, 9, 229, 172, 9, 236, 180, 11, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 207, 148, 24, 236, 180, 11, 242, 182, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 216, 156, 8, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 228, 228, 228, 190, 189, 188, + 185, 131, 9, 223, 165, 9, 242, 182, 12, 245, 189, 12, 236, 180, 11, 236, + 180, 11, 236, 180, 11, 242, 182, 12, 245, 189, 12, 242, 182, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 235, 188, 11, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 206, 142, 8, 235, 179, 22, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 243, 205, 12, 164, 119, 10, 2, 2, 4, 2, 2, 4, 244, 244, + 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 190, 189, 188, 2, 2, + 4, 185, 131, 9, 223, 165, 9, 235, 188, 11, 242, 182, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 242, 182, 12, 229, 172, 9, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 206, 142, 8, 229, 172, 9, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 235, 188, 11, 235, 196, 12, 236, 236, 236, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 2, 2, 4, 10, + 6, 4, 185, 131, 9, 223, 165, 9, 242, 182, 12, 242, 182, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 242, 182, 12, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 206, 142, 8, 235, 179, 22, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 235, 196, 12, 207, 148, 24, 254, 254, 252, + 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, + 244, 254, 254, 252, 254, 254, 252, 12, 12, 12, 2, 2, 4, 2, 2, 4, + 31, 22, 4, 182, 126, 10, 223, 165, 9, 242, 182, 12, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 229, 172, 9, 223, 165, 9, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 179, 121, 7, 207, 148, 7, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 242, 182, 12, 242, 182, 12, 225, 180, 10, 218, 163, 9, 106, 75, + 6, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, + 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, + 254, 252, 212, 212, 212, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 49, 35, 5, 182, 126, 10, 229, 172, 9, 242, 182, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 235, 179, 22, 215, 150, 13, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 199, 138, 8, 223, 165, 9, 242, 182, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 236, 180, 11, 223, 165, 9, 164, + 109, 5, 12, 12, 12, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, + 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, + 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 64, 44, 7, 182, 126, 10, 223, 165, 9, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 242, 182, 12, 223, + 165, 9, 206, 142, 8, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 199, 138, 8, 223, 165, 9, 242, 182, 12, + 242, 182, 12, 242, 182, 12, 245, 189, 12, 242, 182, 12, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 218, 163, 9, + 179, 121, 7, 41, 28, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 52, + 52, 52, 20, 20, 19, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 85, 59, 6, 185, 131, 9, 223, 165, 9, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, + 12, 245, 189, 12, 242, 182, 12, 242, 182, 12, 223, 165, 9, 199, 138, 8, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 192, 133, 7, 192, 133, 7, 215, 150, + 13, 216, 156, 8, 223, 165, 9, 229, 172, 9, 229, 172, 9, 235, 179, 22, + 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, + 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 236, 180, 11, 209, 155, + 9, 164, 109, 5, 91, 58, 5, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 91, 58, 5, 182, 126, 10, 216, 156, 8, 242, 182, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 235, + 179, 22, 223, 165, 9, 216, 156, 8, 192, 133, 7, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 144, 96, 7, 164, + 109, 5, 179, 121, 7, 182, 126, 10, 192, 133, 7, 201, 142, 7, 206, 142, + 8, 216, 156, 8, 223, 165, 9, 229, 172, 9, 235, 179, 22, 242, 182, 12, + 245, 189, 12, 245, 189, 12, 245, 189, 12, 235, 179, 22, 223, 165, 9, 182, + 126, 10, 151, 97, 5, 91, 58, 5, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 83, 54, 6, 171, 114, 5, 199, 138, 8, 223, 165, + 9, 242, 182, 12, 242, 182, 12, 242, 182, 12, 242, 182, 12, 229, 172, 9, + 216, 156, 8, 199, 138, 8, 171, 114, 5, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 135, 88, 5, 151, 97, 5, 157, 106, 7, 164, + 109, 5, 179, 121, 7, 179, 121, 7, 192, 133, 7, 207, 148, 7, 216, 156, + 8, 223, 165, 9, 236, 180, 11, 236, 180, 11, 223, 165, 9, 201, 142, 7, + 164, 109, 5, 131, 82, 4, 73, 48, 6, 2, 2, 4, 2, 2, 4, 2, + 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, + 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, + 2, 2, 4, 2, 2, 4, 73, 48, 6, 155, 102, 5, 182, 126, 10, 215, + 150, 13, 229, 172, 9, 236, 180, 11, 229, 172, 9, 216, 156, 8, 207, 148, + 7, 179, 121, 7, 144, 96, 7, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 108, 69, 5, 125, 83, 5, 144, 96, 7, 155, 102, 5, 179, + 121, 7, 182, 126, 10, 193, 139, 10, 199, 138, 8, 182, 126, 10, 155, 102, + 5, 131, 82, 4, 96, 62, 5, 20, 13, 4, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 64, 44, 7, 143, 90, 4, 171, 114, 5, + 182, 126, 10, 192, 133, 7, 201, 142, 7, 199, 138, 8, 179, 121, 7, 171, + 114, 5, 116, 73, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 101, 67, 7, 125, 83, 5, 131, 82, 4, 131, 82, 4, 131, 82, 4, 116, + 73, 4, 91, 58, 5, 57, 38, 32, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 83, 54, 6, 131, 82, + 4, 157, 106, 7, 164, 109, 5, 164, 109, 5, 164, 109, 5, 135, 88, 5, + 83, 54, 6, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 73, 48, 6, 96, 62, 5, 91, 58, 5, + 73, 48, 6, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 64, + 44, 7, 96, 62, 5, 108, 69, 5, 101, 67, 7, 96, 62, 5, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156 +}; + diff --git a/src/include/FTextRXTX.h b/src/include/FTextRXTX.h index 05718227..7c2747d6 100644 --- a/src/include/FTextRXTX.h +++ b/src/include/FTextRXTX.h @@ -116,9 +116,10 @@ public: void setFont(Fl_Font f, int attr = NATTR); protected: - enum { TX_MENU_TX, TX_MENU_RX, TX_MENU_ABORT, TX_MENU_MFSK16_IMG, - TX_MENU_CUT, TX_MENU_COPY, TX_MENU_PASTE, TX_MENU_CLEAR, TX_MENU_READ, - TX_MENU_WRAP + enum { TX_MENU_TX, TX_MENU_RX, TX_MENU_ABORT, + TX_MENU_MFSK16_IMG, + TX_MENU_CUT, TX_MENU_COPY, TX_MENU_PASTE, TX_MENU_CLEAR, + TX_MENU_READ, TX_MENU_WRAP }; int handle_key_shortcuts(int key); int handle_key(int key); diff --git a/src/include/confdialog.h b/src/include/confdialog.h index f0225cd0..fdcaf720 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -331,6 +331,18 @@ extern Fl_Button *btn_fsq_xmt_color; extern Fl_Button *btn_fsq_directed_color; extern Fl_Button *btn_fsq_undirected_color; extern Fl_Button *btn_fsq_color_defaults; +extern Fl_Group *tabIFKP; +extern Fl_Round_Button *btn_ifkpbaud[3]; +extern Fl_Check_Button *btn_ifkp_lowercase; +extern Fl_Check_Button *btn_ifkp_lowercase_call; +#include "trx.h" +extern Fl_Check_Button *btn_ifkp_freqlock; +extern Fl_Output *txt_ifkp_audit_log; +extern Fl_Light_Button *btn_enable_ifkp_audit_log; +extern Fl_Button *btn_ifkp_select_auditlog; +extern Fl_Output *txt_ifkp_heard_log; +extern Fl_Light_Button *btn_enable_ifkp_heard_log; +extern Fl_Button *btn_select_ifkp_heard_log; extern Fl_Group *tabMT63; extern Fl_Check_Button *btnMT63_8bit; extern Fl_Check_Button *btnMT63_rx_integration; diff --git a/src/include/configuration.h b/src/include/configuration.h index b42caf59..af3c156a 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -687,7 +687,35 @@ ELEM_(Fl_Color, fsq_undirected_color, "FSQUNDIRECTEDCOLOR", \ "Color for FSQ undirected text", \ FL_DARK_GREEN) \ - /* Waterfall & UI */ \ + /* IFKP */ \ + ELEM_(int, ifkp_baud, "IFKPBAUD", \ + "1, 2, 3", \ + 1) \ + ELEM_(bool, ifkp_enable_heard_log, "IFKP_ENABLE_HEARD_LOG", \ + "IFKP enable heard log file", \ + 1) \ + ELEM_(std::string, ifkp_heard_log, "IFKP_HEARD_LOG", \ + "IFKP heard log pathname", \ + "ifkp_heard_log.txt") \ + ELEM_(bool, ifkp_enable_audit_log, "IFKP_ENABLE_AUDIT_LOG", \ + "IFKP enable audit log file", \ + 1) \ + ELEM_(std::string, ifkp_audit_log, "IFKP_AUDIT_LOG", \ + "IFKP audit log pathname", \ + "ifkp_audit_log.txt") \ + ELEM_(bool, ifkp_lowercase, "IFKPLOWERCASE", \ + "0 - NO, 1 - YES\n" \ + "convert operator MYCALL to lower case for all IFKP macros", \ + 1) \ + ELEM_(bool, ifkp_lowercase_call, "IFKPCALLLOWERCASE", \ + "0 - NO, 1 - YES\n" \ + "convert other CALLSIGN to lower case for all IFKP macros", \ + 1) \ + ELEM_(bool, ifkp_freqlock, "IFKPFREQLOCK", \ + "0 - NO, 1 - YES\n" \ + "Always t/r at 1500 Hz", \ + 1) \ + /* Waterfall & UI */ \ ELEM_(uchar, red, "", "", 0) \ ELEM_(uchar, green, "", "", 255) \ ELEM_(uchar, blue, "", "", 255) \ diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index 9e9db411..73522bae 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -201,6 +201,24 @@ extern void fsq_repeat_last_command(); extern void display_fsq_rx_text(std::string text, int style = FTextBase::SKIP); extern void display_fsq_mon_text(std::string text, int style = FTextBase::SKIP); +extern Fl_Group *ifkp_group; +extern Fl_Group *ifkp_upper; +extern Fl_Group *ifkp_upper_left; +extern FTextRX *ifkp_rx_text; +extern Fl_Group *ifkp_upper_right; +extern Fl_Browser *ifkp_heard; +extern Progress *ifkp_s2n_progress; +extern Fl_Group *ifkp_lower; +extern FTextTX *ifkp_tx_text; +extern picture *ifkp_avatar; +int ifkp_load_avatar(std::string image_fname = "", int W=59, int H=74); +extern void ifkp_clear_avatar(); +extern void ifkp_update_avatar(unsigned char data, int pos); +extern int ifkp_get_avatar_pixel(int pos, int color); +extern void cb_ifkp_send_avatar( Fl_Widget *w, void *); + +extern void cb_ifkp_heard(Fl_Browser*, void*); + extern void enableSELCAL(); extern void cbFSQQTC(Fl_Widget *w, void *d); @@ -209,6 +227,10 @@ extern void cbMONITOR(Fl_Widget *w, void *d); extern void cbSELCAL(Fl_Widget *w, void *d); extern void cbFSQCALL(Fl_Widget *w, void *d); +extern void ifkp_showTxViewer(char C = 'T'); +extern Fl_Double_Window *ifkppicRxWin; +extern Fl_Double_Window *ifkppicTxWin; + #include extern Fl_Bitmap image_s2n; diff --git a/src/include/globals.h b/src/include/globals.h index ae929263..d830c4f2 100644 --- a/src/include/globals.h +++ b/src/include/globals.h @@ -221,13 +221,14 @@ enum { MODE_PSKR_FIRST = MODE_PSK125R, MODE_PSKR_LAST = MODE_2X_PSK1000R, + MODE_FSQ, + MODE_IFKP, + MODE_SSB, MODE_WWV, MODE_ANALYSIS, MODE_FFTSCAN, - MODE_FSQ, - NUM_MODES, NUM_RXTX_MODES = NUM_MODES - 2 }; diff --git a/src/include/ifkp.h b/src/include/ifkp.h new file mode 100644 index 00000000..1b49dd1d --- /dev/null +++ b/src/include/ifkp.h @@ -0,0 +1,178 @@ +// ---------------------------------------------------------------------------- +// ifkp.h -- BASIS FOR ALL MODEMS +// +// Copyright (C) 2006 +// Dave Freese, W1HKJ +// +// This file is part of fldigi. +// +// Fldigi is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Fldigi is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with fldigi. If not, see . +// ---------------------------------------------------------------------------- + +#ifndef _IFKP_H +#define _IFKP_H + +#include + +#include "trx.h" +#include "modem.h" +#include "complex.h" +#include "filters.h" +#include "picture.h" +#include + +class ifkp : public modem { + +#define IFKP_FFTSIZE 4096 +#define IFKP_SYMLEN 4096 + +#define IFKP_BLOCK_SIZE IFKP_FFTSIZE +#define IFKP_SHIFT_SIZE (IFKP_SYMLEN / 16) + +//#define IFKP_SR 8000 //16000 + +#define IFKP_SPACING 3 +#define IFKP_OFFSET 1 +#define IFKP_NUMBINS 151 // 3 bin spacing +#define IMAGESPP 8 //16 , 12, 8 + +enum IFKP_STATE {TEXT, IMAGE_START, IMAGE_SYNC, IMAGE}; + +public: + int symlen; + +protected: +// Rx + double rx_stream[IFKP_BLOCK_SIZE + IFKP_SHIFT_SIZE]; + cmplx fft_data[2*IFKP_FFTSIZE]; + double a_blackman[IFKP_BLOCK_SIZE]; + C_FIR_filter *rxfilter; + double tones[IFKP_NUMBINS]; + Cmovavg *binfilt[IFKP_NUMBINS]; + int movavg_size; + int bkptr; + g_fft *fft; + Cmovavg *snfilt; + double val; + double max; + double noise; + int peak; + int prev_peak; + int last_peak; + int peak_counter; + int peak_hits; + int symbol; + int prev_symbol; + int curr_nibble; + int prev_nibble; + + void process_symbol(int); + void parse_pic(int); + double s2n; + char szestimate[40]; + std::string station_calling; + std::string rx_text; + std::string toprint; + std::string pic_str; + + IFKP_STATE state; + +// Tx +// C_FIR_filter *xmtfilt; + double baud; + int tone; + int prevtone; + double txphase; + bool send_bot; + void transmit(double *buf, int len); + void send_char (int); + void send_idle (); + void send_symbol(int sym); + void send_tone(int tone); + std::string xmt_string; + double xmtdelay(); + +// RxTx + int basetone; + double metric; + bool ch_sqlch_open; + std::string mycall; + + void show_mode(); + void process_tones(); + + bool valid_char(int); + + std::string heard_log_fname; + std::string audit_log_fname; + std::ofstream heard_log; + std::ofstream audit_log; + +public: +//---- +// virtual in base class + ifkp (trx_mode md); + ~ifkp (); + void init (); + void rx_init (); + void restart (); + void tx_init (SoundBase *sc); + int rx_process (const double *buf, int len); + int tx_process (); + + void set_freq(double); +//---- + +// support for ifkp image transfers +private: + double amplitude; + double pixel; + double sync; + bool TX_IMAGE; + bool TX_AVATAR; + unsigned char tx_pixel; + int tx_pixelnbr; + int image_mode; + bool b_ava; +public: + int byte; + double picf; + double picpeak; + C_FIR_filter *picfilter; + Cmovavg *pixfilter; + Cmovavg *ampfilter; + Cmovavg *syncfilter; + double phidiff; + double phase; + cmplx prevz; + cmplx currz; + double image_freq[10]; + int image_counter; + int picW; + int picH; + int row; + int col; + int rgb; + int pixelnbr; +static int IMAGEspp; + int TXspp; + void recvpic(double smpl); + void send_image(); + void send_avatar(); + void ifkp_send_avatar(); + void ifkp_send_image(); + +}; + +#endif diff --git a/src/include/main.h b/src/include/main.h index 927aa7e4..9e8d749c 100644 --- a/src/include/main.h +++ b/src/include/main.h @@ -41,6 +41,7 @@ extern std::string ScriptsDir; extern std::string PalettesDir; extern std::string LogsDir; extern std::string PicsDir; +extern std::string AvatarDir; extern std::string HelpDir; extern std::string MacrosDir; extern std::string WrapDir; diff --git a/src/include/modem.h b/src/include/modem.h index 1e993110..1d6a58f8 100644 --- a/src/include/modem.h +++ b/src/include/modem.h @@ -150,6 +150,9 @@ public: virtual void send_color_image(std::string) {} virtual void send_Grey_image(std::string) {} + virtual void ifkp_send_image(){} + virtual void ifkp_send_avatar(){} + void set_stopflag(bool b) { stopflag = b;}; bool get_stopflag() const { return stopflag; }; @@ -412,4 +415,6 @@ extern modem *ssb_modem; extern modem *fsq_modem; +extern modem *ifkp_modem; + #endif diff --git a/src/include/picture.h b/src/include/picture.h index ec7f8a4d..4afda225 100644 --- a/src/include/picture.h +++ b/src/include/picture.h @@ -50,6 +50,9 @@ private: static void draw_cb(void *data, int x, int y, int w, uchar *buf); void resize_zoom(int, int, int, int); + + void (*cbFunc)(Fl_Widget *, void *); + public: picture(int, int, int, int, int bg_col = 0); ~picture(); @@ -91,6 +94,11 @@ public: void remove_noise( int row, int half_len, int noise_margin ); static const int depth = 3; + void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} + void do_callback() { + if (cbFunc) cbFunc(this, (void*)0); + } + private: bool restore( int row, int margin ); bool slantcorr; diff --git a/src/include/status.h b/src/include/status.h index 507a49e7..14ca7496 100644 --- a/src/include/status.h +++ b/src/include/status.h @@ -72,6 +72,7 @@ struct status { int tile_y; int tile_h; double fsq_ratio; + double ifkp_ratio; bool LOGenabled; double sldrSquelchValue; double sldrPwrSquelchValue; @@ -169,6 +170,7 @@ struct status { bool meters; bool fsq_rx_abort; + bool ifkp_rx_abort; bool bLastStateRead; diff --git a/src/main.cxx b/src/main.cxx index d72f63f8..4367b8ae 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -129,6 +129,7 @@ string ScriptsDir = ""; string PalettesDir = ""; string LogsDir = ""; string PicsDir = ""; +string AvatarDir = ""; string HelpDir = ""; string MacrosDir = ""; string WrapDir = ""; @@ -1574,6 +1575,7 @@ static void checkdirectories(void) { PalettesDir, "palettes", create_new_palettes }, { LogsDir, "logs", 0 }, { PicsDir, "images", 0 }, + { AvatarDir, "avatars", 0}, { HelpDir, "help", 0 }, { MacrosDir, "macros", create_new_macros }, { WrapDir, "wrap", 0 }, diff --git a/src/misc/macros.cxx b/src/misc/macros.cxx index 618dd6d6..f29ac9a3 100644 --- a/src/misc/macros.cxx +++ b/src/misc/macros.cxx @@ -127,7 +127,10 @@ void rx_que_continue(void *); static void postQueue(std::string s) { - ReceiveText->addstr(s, FTextBase::CTRL); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->addstr(s, FTextBase::CTRL); + else + ReceiveText->addstr(s, FTextBase::CTRL); } static const char cutnumbers[] = "T12345678N"; @@ -228,7 +231,10 @@ chars/sec: %f", num_cps_chars / (xmttime - overhead)); LOG_INFO("%s", results); strcat(results, "\n"); - ReceiveText->add(results, FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add(results, FTextBase::ALTR); + else + ReceiveText->add(results, FTextBase::ALTR); PERFORM_CPS_TEST = false; } @@ -239,7 +245,10 @@ static void pCPS_TEST(std::string &s, size_t &i, size_t endbracket) id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { - ReceiveText->add("Mode not supported\n", FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->add("Mode not supported\n", FTextBase::ALTR); + else + ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } @@ -288,7 +297,10 @@ static void pCPS_TEST(std::string &s, size_t &i, size_t endbracket) } if (!line_out.empty()) { LOG_INFO("%s", line_out.c_str()); - ReceiveText->add(line_out.c_str(), FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add(line_out.c_str(), FTextBase::ALTR); + else + ReceiveText->add(line_out.c_str(), FTextBase::ALTR); } return; } @@ -300,7 +312,10 @@ static void pCPS_FILE(std::string &s, size_t &i, size_t endbracket) id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { - ReceiveText->add("Mode not supported\n", FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); + else + ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } @@ -317,7 +332,10 @@ static void pCPS_FILE(std::string &s, size_t &i, size_t endbracket) } s.clear(); fclose(toadd); - TransmitText->clear(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->clear(); + else + TransmitText->clear(); testfilename = fname; stopMacroTimer(); @@ -334,7 +352,10 @@ static void pCPS_FILE(std::string &s, size_t &i, size_t endbracket) } else { string resp = "Could not locate "; resp.append(fname).append("\n"); - ReceiveText->add(resp.c_str(), FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); + else + ReceiveText->add(resp.c_str(), FTextBase::ALTR); LOG_WARN("%s not found", fname.c_str()); s.replace(i, endbracket - i + 1, ""); PERFORM_CPS_TEST = false; @@ -352,7 +373,10 @@ static void pCPS_STRING(std::string &s, size_t &i, size_t endbracket) id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { - ReceiveText->add("Mode not supported\n", FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); + else + ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } @@ -366,7 +390,10 @@ static void pCPS_STRING(std::string &s, size_t &i, size_t endbracket) p = buffer.find("\\n"); } if (buffer.length()) { - TransmitText->clear(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->clear(); + else + TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); @@ -383,7 +410,10 @@ static void pCPS_STRING(std::string &s, size_t &i, size_t endbracket) string resp = "Text not specified"; LOG_WARN("%s", resp.c_str()); resp.append("\n"); - ReceiveText->add(resp.c_str(), FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); + else + ReceiveText->add(resp.c_str(), FTextBase::ALTR); PERFORM_CPS_TEST = false; } } @@ -395,7 +425,10 @@ static void pCPS_N(std::string &s, size_t &i, size_t endbracket) id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { - ReceiveText->add("Mode not supported\n", FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); + else + ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } @@ -421,7 +454,10 @@ static void pCPS_N(std::string &s, size_t &i, size_t endbracket) else buffer += ' '; } - TransmitText->clear(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->clear(); + else + TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); @@ -445,7 +481,10 @@ static void pWAV_TEST(std::string &s, size_t &i, size_t endbracket) id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { - ReceiveText->add("Mode not supported\n", FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); + else + ReceiveText->add("Mode not supported\n", FTextBase::ALTR); return; } testfilename = "internal string"; @@ -466,7 +505,10 @@ static void pWAV_N(std::string &s, size_t &i, size_t endbracket) id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { - ReceiveText->add("Mode not supported\n", FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); + else + ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } @@ -492,7 +534,10 @@ static void pWAV_N(std::string &s, size_t &i, size_t endbracket) else buffer += ' '; } - TransmitText->clear(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->clear(); + else + TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); @@ -511,7 +556,10 @@ static void pWAV_FILE(std::string &s, size_t &i, size_t endbracket) id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { - ReceiveText->add("Mode not supported\n", FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); + else + ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } @@ -528,7 +576,10 @@ static void pWAV_FILE(std::string &s, size_t &i, size_t endbracket) } s.clear(); fclose(toadd); - TransmitText->clear(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->clear(); + else + TransmitText->clear(); testfilename = fname; stopMacroTimer(); @@ -542,7 +593,10 @@ static void pWAV_FILE(std::string &s, size_t &i, size_t endbracket) } else { string resp = "Could not locate "; resp.append(fname).append("\n"); - ReceiveText->add(resp.c_str(), FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); + else + ReceiveText->add(resp.c_str(), FTextBase::ALTR); LOG_WARN("%s not found", fname.c_str()); s.replace(i, endbracket - i + 1, ""); PERFORM_CPS_TEST = false; @@ -560,7 +614,10 @@ static void pWAV_STRING(std::string &s, size_t &i, size_t endbracket) id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { - ReceiveText->add("Mode not supported\n", FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); + else + ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } @@ -574,7 +631,10 @@ static void pWAV_STRING(std::string &s, size_t &i, size_t endbracket) p = buffer.find("\\n"); } if (buffer.length()) { - TransmitText->clear(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->clear(); + else + TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); @@ -588,7 +648,10 @@ static void pWAV_STRING(std::string &s, size_t &i, size_t endbracket) string resp = "Text not specified"; LOG_WARN("%s", resp.c_str()); resp.append("\n"); - ReceiveText->add(resp.c_str(), FTextBase::ALTR); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); + else + ReceiveText->add(resp.c_str(), FTextBase::ALTR); PERFORM_CPS_TEST = false; } } @@ -1132,7 +1195,10 @@ static void pCLRRX(std::string &s, size_t &i, size_t endbracket) return; } s.replace( i, 7, "" ); - ReceiveText->clear(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->clear(); + else + ReceiveText->clear(); } static void pCLRTX(std::string &s, size_t &i, size_t endbracket) @@ -1143,7 +1209,10 @@ static void pCLRTX(std::string &s, size_t &i, size_t endbracket) } s.replace( i, 7, "" ); queue_reset(); - TransmitText->clear(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->clear(); + else + TransmitText->clear(); } static void pFOCUS(std::string &s, size_t &i, size_t endbracket) @@ -1151,7 +1220,10 @@ static void pFOCUS(std::string &s, size_t &i, size_t endbracket) if (!within_exec) { if (qsoFreqDisp->is_reversed_colors()) { qsoFreqDisp->restore_colors(); - TransmitText->take_focus(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->take_focus(); + else + TransmitText->take_focus(); } else { qsoFreqDisp->take_focus(); qsoFreqDisp->reverse_colors(); @@ -1185,7 +1257,10 @@ static void pQSYPLUS(std::string &s, size_t &i, size_t endbracket) static void pCALL(std::string &s, size_t &i, size_t endbracket) { - s.replace( i, 6, inpCall->value() ); + string call = inpCall->value(); + if (active_modem->get_mode() == MODE_IFKP && progdefaults.ifkp_lowercase_call) + for (size_t n = 0; n < call.length(); n++) call[n] = tolower(call[n]); + s.replace( i, 6, call ); } static void pGET(std::string &s, size_t &i, size_t endbracket) @@ -1237,7 +1312,10 @@ static void pRST(std::string &s, size_t &i, size_t endbracket) static void pMYCALL(std::string &s, size_t &i, size_t endbracket) { - s.replace( i, 8, inpMyCallsign->value() ); + string call = inpMyCallsign->value(); + if (active_modem->get_mode() == MODE_IFKP && progdefaults.ifkp_lowercase) + for (size_t n = 0; n < call.length(); n++) call[n] = tolower(call[n]); + s.replace( i, 8, call ); } static void pMYLOC(std::string &s, size_t &i, size_t endbracket) @@ -3274,7 +3352,10 @@ void MACROTEXT::loadDefault() LOG_INFO("%s", Macroset.c_str()); Macroset.insert(0, "\n"); Macroset.append("\n"); - ReceiveText->addstr(Macroset); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->addstr(Macroset); + else + ReceiveText->addstr(Macroset); } } @@ -3300,7 +3381,10 @@ void MACROTEXT::openMacroFile() if (progdefaults.DisplayMacroFilename) { string Macroset; Macroset.assign("\nLoaded macros: ").append(progStatus.LastMacroFile).append("\n"); - ReceiveText->addstr(Macroset); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_rx_text->addstr(Macroset); + else + ReceiveText->addstr(Macroset); } } } @@ -3501,10 +3585,16 @@ static void set_button(Fl_Button* button, bool value) void MACROTEXT::timed_execute() { queue_reset(); - TransmitText->clear(); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->clear(); + else + TransmitText->clear(); if (!rx_only) { text2send = expandMacro(exec_string); - TransmitText->add_text(text2send); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_tx_text->add_text(text2send); + else + TransmitText->add_text(text2send); exec_string.clear(); active_modem->set_stopflag(false); start_tx(); @@ -3523,10 +3613,15 @@ void MACROTEXT::execute(int n) startTimedExecute(name[n]); return; } - + + trx_mode mode = active_modem->get_mode(); + if (!rx_only) { if (progStatus.repeatMacro == -1) - TransmitText->add_text( text2send ); + if (mode == MODE_IFKP) + ifkp_tx_text->add_text( text2send ); + else + TransmitText->add_text( text2send ); else { size_t p = std::string::npos; text2send = text[n]; @@ -3534,7 +3629,10 @@ void MACROTEXT::execute(int n) text2send[p] = '['; while ((p = text2send.find('>')) != std::string::npos) text2send[p] = ']'; - TransmitText->add_text( text2send ); + if (mode == MODE_IFKP) + ifkp_tx_text->add_text( text2send ); + else + TransmitText->add_text( text2send ); } } text2send.clear(); diff --git a/src/misc/status.cxx b/src/misc/status.cxx index 32e838a8..25b7d202 100644 --- a/src/misc/status.cxx +++ b/src/misc/status.cxx @@ -111,6 +111,7 @@ status progStatus = { 90, // int tile_y; 150, // int tile_h; 0.5, // double fsq_ratio; + 0.5, // double ifkp_ratio; false, // bool LOGenabled 5.0, // double sldrSquelchValue 5.0, // double sldrPwrSquelchValue @@ -204,6 +205,7 @@ status progStatus = { false, // meters false, // fsq_rx_abort + false, // ifkp_rx_abort false // bool bLastStateRead; }; @@ -252,6 +254,7 @@ void status::saveLastState() if (text_panel->w() != ReceiveText->w()) tile_x = mvgroup->w(); fsq_ratio = 1.0 * fsq_rx_text->h() / fsq_group->h(); + ifkp_ratio = 1.0 * ifkp_rx_text->h() / ifkp_group->h(); } VIEWERvisible = dlgViewer->visible(); @@ -385,6 +388,7 @@ if (!bWF_only) { spref.set("tile_w", tile_w); spref.set("tile_h", tile_h); spref.set("fsq_ratio", fsq_ratio); + spref.set("ifkp_ratio", ifkp_ratio); spref.set("scope_visible", scopeVisible); spref.set("scope_x", scopeX); @@ -586,6 +590,7 @@ void status::loadLastState() spref.get("tile_w", tile_w, tile_w); spref.get("tile_h", tile_h, tile_h); spref.get("fsq_ratio", fsq_ratio, fsq_ratio); + spref.get("ifkp_ratio", ifkp_ratio, ifkp_ratio); spref.get("scope_visible", i, scopeVisible); scopeVisible = i; spref.get("scope_x", scopeX, scopeX); diff --git a/src/rsid/rsid_defs.cxx b/src/rsid/rsid_defs.cxx index d58cbdf0..f4eaa324 100644 --- a/src/rsid/rsid_defs.cxx +++ b/src/rsid/rsid_defs.cxx @@ -288,6 +288,8 @@ const int cRsId::rsid_ids_size1 = sizeof(rsid_ids_1)/sizeof(*rsid_ids_1) - 1; ELEM2_(1078, PSK8P1000F, MODE_8PSK1000F) \ ELEM2_(1058, PSK8P1200F, MODE_8PSK1200F) \ \ + ELEM2_(1171, IFKP, MODE_IFKP) \ + \ ELEM2_(0, NONE2, NUM_MODES) #define ELEM2_(code_, tag_, mode_) RSID_ ## tag_ = code_, diff --git a/src/trx/modem.cxx b/src/trx/modem.cxx index 240d7653..e3f9a318 100644 --- a/src/trx/modem.cxx +++ b/src/trx/modem.cxx @@ -175,6 +175,8 @@ modem *thor100_modem = 0; modem *fsq_modem = 0; +modem *ifkp_modem = 0; + modem *dominoex4_modem = 0; modem *dominoex5_modem = 0; modem *dominoex8_modem = 0; diff --git a/src/waterfall/waterfall.cxx b/src/waterfall/waterfall.cxx index 44056fef..0d97c920 100644 --- a/src/waterfall/waterfall.cxx +++ b/src/waterfall/waterfall.cxx @@ -254,7 +254,7 @@ inline void WFdisp::makeMarker_(int width, const RGB* color, int freq, const RGB if (marker_mode >= MODE_MT63_500S && marker_mode <= MODE_MT63_2000L) bw_upper = (int)(width * 31 / 32); - if (marker_mode == MODE_FSQ) + if (marker_mode == MODE_FSQ || marker_mode == MODE_IFKP) bw_upper = (int)(width * 32 / 33); if (bw_lower + static_cast(freq+0.5) < 0) @@ -334,7 +334,7 @@ void WFdisp::makeMarker() int bw_hi = marker_width; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; - if (mode == MODE_FSQ) bw_hi = bw_hi * 32 / 33; + if (mode == MODE_FSQ || mode == MODE_IFKP) bw_hi = bw_hi * 32 / 33; for (int y = 0; y < WFMARKER - 2; y++) { int incr = y * scale_width; @@ -885,7 +885,7 @@ case Step: for (int row = 0; row < image_height; row++) { \ trx_mode mode = active_modem->get_mode(); if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; - if (mode == MODE_FSQ) { + if (mode == MODE_FSQ || mode == MODE_IFKP) { bw_hi = bw_lo = 69 * bandwidth / 100; } RGBI *pos1 = fft_img + (carrierfreq - offset - bw_lo) / step; @@ -954,7 +954,7 @@ void WFdisp::drawcolorWF() { int bw_hi = bandwidth / 2; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; - if (mode == MODE_FSQ) bw_hi = bw_hi * 32 / 33; + if (mode == MODE_FSQ || mode == MODE_IFKP) bw_hi = bw_hi * 32 / 33; RGBI *pos0 = (fft_img + cursorpos); RGBI *pos1 = (fft_img + cursorpos - bw_lo/step); RGBI *pos2 = (fft_img + cursorpos + bw_hi/step); @@ -1035,7 +1035,7 @@ void WFdisp::drawspectrum() { int bw_hi = bandwidth / 2; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; - if (mode == MODE_FSQ) bw_hi = bw_hi * 32 / 33; + if (mode == MODE_FSQ || mode == MODE_IFKP) bw_hi = bw_hi * 32 / 33; uchar *pos0 = pixmap + cursorpos; uchar *pos1 = (pixmap + cursorpos - bw_lo/step); uchar *pos2 = (pixmap + cursorpos + bw_hi/step); diff --git a/src/widgets/FTextRXTX.cxx b/src/widgets/FTextRXTX.cxx index 710c8f8a..a3275b3c 100644 --- a/src/widgets/FTextRXTX.cxx +++ b/src/widgets/FTextRXTX.cxx @@ -1279,7 +1279,10 @@ void FTextTX::menu_cb(size_t item) abort_tx(); break; case TX_MENU_MFSK16_IMG: - showTxViewer(0, 0); + if (active_modem->get_mode() == MODE_IFKP) + ifkp_showTxViewer(); + else + showTxViewer(0, 0); break; case TX_MENU_CLEAR: clear(); diff --git a/src/widgets/picture.cxx b/src/widgets/picture.cxx index 277d5864..3d0685fb 100644 --- a/src/widgets/picture.cxx +++ b/src/widgets/picture.cxx @@ -24,6 +24,7 @@ // along with this program. If not, see . // ---------------------------------------------------------------------------- +#include #include #ifdef __MINGW32__ @@ -45,7 +46,7 @@ #include #include -#include +//#include #include #include "fl_digi.h" @@ -72,6 +73,7 @@ picture::picture (int X, int Y, int W, int H, int bg_col) : binary = false ; binary_threshold = 128 ; slantcorr = true; + cbFunc = NULL; } picture::~picture() @@ -110,16 +112,19 @@ void picture::resize_zoom(int x, int y, int w, int h) } else { Fl_Widget::resize(x,y,w,h); } + redraw(); } void picture::resize(int x, int y, int w, int h) { - width = w; - height = h; - delete [] vidbuf; - bufsize = depth * w * h; - vidbuf = new unsigned char[bufsize]; - memset( vidbuf, background, bufsize ); + if (w != width || h != height) { + width = w; + height = h; + delete [] vidbuf; + bufsize = depth * w * h; + vidbuf = new unsigned char[bufsize]; + memset( vidbuf, background, bufsize ); + } resize_zoom(x,y,w,h); } @@ -382,7 +387,6 @@ void picture::draw() fl_draw_image( vidbuf, x(), y(), w(), h() ); } else { fl_draw_image( draw_cb, this, x(), y(), w(), h() ); - // redraw(); } } @@ -477,9 +481,12 @@ void picture::slant(int dir) int picture::handle(int event) { - if (!slantcorr) return 0; if (Fl::event_inside( this )) { if (event == FL_RELEASE) { + if (!slantcorr) { + do_callback(); + return 1; + } int xpos = Fl::event_x() - x(); int ypos = Fl::event_y() - y(); int evb = Fl::event_button(); @@ -487,7 +494,6 @@ int picture::handle(int event) slant_corr(xpos, ypos); else if (evb == 3) slant_undo(); -LOG_WARN("xpos, ypos %d, %d", xpos, ypos); LOG_DEBUG("#2 %d, %d", xpos, ypos); return 1; } @@ -527,9 +533,29 @@ static FILE* open_file(const char* name, const char* suffix) fp = NULL; delete [] newfn; } - else - fp = fopen(name, "wb"); + else { + fp = fopen(name, "rb"); + if (fp) { + fclose(fp); + const int n = 5; // rename existing image files to keep up to 5 old versions + ostringstream oldfn, newfn; + ostringstream::streampos p; + oldfn << name << '.'; + newfn << name << '.'; + p = oldfn.tellp(); + + for (int i = n - 1; i > 0; i--) { + oldfn.seekp(p); + newfn.seekp(p); + oldfn << i; + newfn << i + 1; + rename(oldfn.str().c_str(), newfn.str().c_str()); + } + rename(name, oldfn.str().c_str()); + } + fp = fopen(name, "wb"); + } return fp; } @@ -668,6 +694,10 @@ int picture::save_png(const char* filename, bool monochrome, const char *extra_c free(text.key); free(text.text); png_destroy_write_struct(&png, &info); + + fflush(fp); + fsync(fileno(fp)); + fclose(fp); return 0; From 37175e2ca2810bd23bc6aea85da7933e4f52e5b0 Mon Sep 17 00:00:00 2001 From: David Freese Date: Fri, 11 Sep 2015 21:57:47 -0500 Subject: [PATCH 011/138] macro bug * fix timer seg fault when Tx contains trash text --- src/dialogs/fl_digi.cxx | 6 +++++ src/misc/macros.cxx | 58 +++++++++++++++++++++++++---------------- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index fc17e87f..fe4d784f 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -1769,6 +1769,7 @@ void macro_cb(Fl_Widget *w, void *v) int mouse = Fl::event_button(); if (mouse == FL_LEFT_MOUSE && !macros.text[b].empty()) { + if (progStatus.timer) return; stopMacroTimer(); macros.execute(b); } @@ -3039,6 +3040,11 @@ void macro_timer(void*) if (progStatus.timer-- == 0) { stopMacroTimer(); + if (active_modem->get_mode() == MODE_IFKP) { + ifkp_tx_text->clear(); + } else { + TransmitText->clear(); + } macros.execute(progStatus.timerMacro); } else diff --git a/src/misc/macros.cxx b/src/misc/macros.cxx index f29ac9a3..b8c4709c 100644 --- a/src/misc/macros.cxx +++ b/src/misc/macros.cxx @@ -241,7 +241,7 @@ chars/sec: %f", static void pCPS_TEST(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); - if ( id == MODE_SSB || id == MODE_WWV || + if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { @@ -262,7 +262,7 @@ static void pCPS_TEST(std::string &s, size_t &i, size_t endbracket) if (n <= 0) n = 10; if (n > 100) n = 100; -// sample count with 'n' characters +// sample count with 'n' characters int s1[256]; for (int i = 0; i < 256; i++) s1[i] = 0; // converstion from sample count to milliseconds @@ -308,7 +308,7 @@ static void pCPS_TEST(std::string &s, size_t &i, size_t endbracket) static void pCPS_FILE(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); - if ( id == MODE_SSB || id == MODE_WWV || + if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { @@ -369,7 +369,7 @@ static void pCPS_FILE(std::string &s, size_t &i, size_t endbracket) static void pCPS_STRING(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); - if ( id == MODE_SSB || id == MODE_WWV || + if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { @@ -421,7 +421,7 @@ static void pCPS_STRING(std::string &s, size_t &i, size_t endbracket) static void pCPS_N(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); - if ( id == MODE_SSB || id == MODE_WWV || + if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { @@ -477,7 +477,7 @@ static void pWAV_TEST(std::string &s, size_t &i, size_t endbracket) { s.clear(); trx_mode id = active_modem->get_mode(); - if ( id == MODE_SSB || id == MODE_WWV || + if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { @@ -501,7 +501,7 @@ static void pWAV_TEST(std::string &s, size_t &i, size_t endbracket) static void pWAV_N(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); - if ( id == MODE_SSB || id == MODE_WWV || + if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { @@ -552,7 +552,7 @@ static void pWAV_N(std::string &s, size_t &i, size_t endbracket) static void pWAV_FILE(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); - if ( id == MODE_SSB || id == MODE_WWV || + if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { @@ -610,7 +610,7 @@ static void pWAV_FILE(std::string &s, size_t &i, size_t endbracket) static void pWAV_STRING(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); - if ( id == MODE_SSB || id == MODE_WWV || + if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_FFTSCAN || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { @@ -1275,7 +1275,7 @@ static void pFREQ(std::string &s, size_t &i, size_t endbracket) } static void pBAND(std::string &s, size_t &i, size_t endbracket) -{ +{ s.replace( i, 6, band_name( band( wf->rfcarrier() ) ) ); } @@ -1339,8 +1339,8 @@ static void pMYRST(std::string &s, size_t &i, size_t endbracket) } static void pANTENNA(std::string &s, size_t &i, size_t endbracket) -{ - s.replace( i, 9, progdefaults.myAntenna.c_str() ); +{ + s.replace( i, 9, progdefaults.myAntenna.c_str() ); } static void pLDT(std::string &s, size_t &i, size_t endbracket) @@ -3601,42 +3601,50 @@ void MACROTEXT::timed_execute() } } +bool wait_execute = false; + void MACROTEXT::execute(int n) { + while (wait_execute) { MilliSleep(10); } + wait_execute = true; + mNbr = n; text2send = expandMacro(text[n]); - + if (timed_exec) { progStatus.repeatMacro = -1; exec_string = text[n]; timed_exec = false; startTimedExecute(name[n]); + wait_execute = false; return; } trx_mode mode = active_modem->get_mode(); if (!rx_only) { - if (progStatus.repeatMacro == -1) - if (mode == MODE_IFKP) + if (progStatus.repeatMacro == -1) { + if (mode == MODE_IFKP) { ifkp_tx_text->add_text( text2send ); - else + } else { TransmitText->add_text( text2send ); - else { + } + } else { size_t p = std::string::npos; text2send = text[n]; while ((p = text2send.find('<')) != std::string::npos) text2send[p] = '['; while ((p = text2send.find('>')) != std::string::npos) text2send[p] = ']'; - if (mode == MODE_IFKP) + if (mode == MODE_IFKP) { ifkp_tx_text->add_text( text2send ); - else + } else { TransmitText->add_text( text2send ); + } } } text2send.clear(); - + if (ToggleTXRX) { text2send.clear(); if (!wf->xmtrcv->value()) { @@ -3645,27 +3653,31 @@ void MACROTEXT::execute(int n) Fl::add_timeout(idleTime, idleTimer); } else REQ(set_button, wf->xmtrcv, false); + wait_execute = false; return; } if (useWait && waitTime > 0) { Fl::add_timeout(waitTime, finishWait); useWait = false; + wait_execute = false; return; } if (useTune && tuneTime > 0) { trx_tune(); Fl::add_timeout(tuneTime, finishTune); useTune = false; + wait_execute = false; return; } if ( TransmitON ) { if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); - + active_modem->set_stopflag(false); start_tx(); TransmitON = false; } + wait_execute = false; } void MACROTEXT::repeat(int n) @@ -3699,7 +3711,7 @@ static std::string mtext = "; void MACROTEXT::saveMacros(const std::string& fname) { - + std::string work; std::string output; char temp[200]; @@ -3718,7 +3730,7 @@ void MACROTEXT::saveMacros(const std::string& fname) { output.append(work).append("\n"); } UTF8_writefile(fname.c_str(), output); - + changed = false; } From cbff7c3f18eeed0e39516155c9ec5993c2c5923b Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 13 Sep 2015 16:17:16 -0500 Subject: [PATCH 012/138] Olivia/Contestia start stop tones * add ability to disable start/stop tones in Olivia and Contestia --- fldigi_doxygen/images/config-contestia.png | Bin 46318 -> 25714 bytes fldigi_doxygen/images/config-olivia.png | Bin 49198 -> 33250 bytes fldigi_doxygen/user_src_docs/configOlivia.txt | 6 +++ src/contestia/contestia.cxx | 2 + src/dialogs/confdialog.cxx | 37 ++++++++++++++++-- src/dialogs/confdialog.fl | 29 +++++++++++--- src/include/confdialog.h | 2 + src/include/configuration.h | 6 +++ src/olivia/olivia.cxx | 2 + 9 files changed, 74 insertions(+), 10 deletions(-) diff --git a/fldigi_doxygen/images/config-contestia.png b/fldigi_doxygen/images/config-contestia.png index bd802d6493a644e83a965973f5483d69113b23ca..25edc5214a34eea95d61589b0bde955c28970e2d 100644 GIT binary patch literal 25714 zcmc$`WpEr#*0w3xmTa*tW?8bBnbneo7Be$5Gh33y%*@Qp&=xZ@Gjof1+s`xey|eGk z#QxZg*y!l)=&H)9tgOsD=UnH`4wjJ;L4d`Eg@AxS5d9%22LbU;83F>5?-Mk5OEiQk zC-@6mPh3P0;_c5XtGzH5yamSQhpIgU1RTnrHzY(#8YXz-M+Z?!p^xh@2xxGSS_`c7 z5D;G>L;I7%UN zMRC)5A&TPJOig$555?t97SRJ8gY9>BBEDa1P%zf-jvckjxyD?_m^#Mqxc66Zgn9;T zy8VaWHr0nCiw;`b%)FiqzW^Ld-=nJGq4ol_^4zRe%etxTSM2x4dh5fc?Met(c z^rw=RCAJo>P7AksbH?r?XJ+D*JNQF#5c4wfz1z*65*Qvp^~pU9#YoZHJCushKfcWP z%+y|2DqF5Il4^Ib# zR3WhfsI{5AZy@@`<8VDD_{(7Ao3|ASfxdw%6s(XTY5E+%4Y14GQC`89ZDTC6K$S$a zTPPLUQH6^$@B5oBGWNME{zcIwlZ-fkX{ZumJ!4AjH%iVxES12!eI?J)C!d?k>x-^h zx3AVn>OGt8kNckoA{Z-VLvs)eE}t-ErZXoaB~OYqQr0uD@dTQSKh_y1FV?ZH&I{=e z+#t%`TT5|yw3O}L`cX;(2IKm)TmUy3nr;=5Lv936aw5TkBdNo{8=(IAr6={_+3Wqy zHot-99xIRrFzPpDK2Bq(YhZd3ACkx%$}>Dtpk=B*+zlsj*EK<;_=4(k*DzZdUyTKbA$Ltbd3QUI>{qN zFSy&T>2FaK{js41p0HF(nCjk?MfX~tmnniQ4Orx*QzIQ_RpREi8{O!~ZhJqbnOb-*E77vuHt+N}59pEN#Vi zxAKm|@lv#qL3P8+|LjQeB~Xlnfo>|T4|n{IQ&;5{u0IwchT~zGD8|=ab`|vfJA4mb zx;WCgUJ)AXjFgtc+v}%lXb2vLkA+ibj&P`yRAOuoY30rik*9Z?k4U&Z~cVyZidoC_!?uMidafC|U<8!?86@8-yKE(v@06XRY_3 z>MmxE2zu&phhh^B$vR1%-R$(t_F&6Gzw6f0f(@eZ8S8G|-KV1?xA()$mR$8U@ z8TB&&{)n6$&=ZoqE6kBIxf1*`UfAUV?qSz}j&xVwqwNku868*L5s50NN`Zly!Mb+f zugZBXkwnZfav(Z<24_SD-ddjHw$TS9wV}gbB6vdXmQ>UHzD2v6{)Nh)J&p0cib+4# zIKTnY0U1$QU*D-oex+s&S(ShMtWb!afv1fYjp0d(4I-<_Y1AbB9l_U2&NG{J>2E|9a3 z#lUt@37>zqCtl?piONg%VBcp}`?|S-aSi90em+j7KS5^ec?ZwgWDfFJfsKca7xOb5 zOsRvT6d1~{U6I@k9+raEi=@rduH|%5y3BVSV0&h-ddMBNafQFfP6W;y<#<*T-~0HuO4T ztHy^vlijQ-TEgs}X}x#XY1%L0#hEd`#E|dtRDd~Gxe45A~lzGt}#j|b86 zx$4H#tO6%z>%|;h>Y}~Q`}Ib9VJz=o#hwMW6_?BnBDi`_C&Fo&E0M)-J%u#AfM!p) zZSxQQjzZ63BK8*(G;*R_z|%zXFEWX4EU37y_bXU4869m#DII;WshmTSI2LK015n=d z)d3`mePsso6`6+*Eqho`RKJ*Lra=x~^FB9Mh;}a%k!AH~W6Rb_JRTgc1JY#@R>M1l z2owdAGG(1Q9afoLLr|M5fR?EG7M+ggBGLv*1dLEv+k*fKHyJ;^y2!&n~t~323PBVJ%c09riSZ10)P(&eunYlElBTaYx>b~d)R5PYH zTMTx$9bD%+N{ivyoPtnN;AY|u&Su%mG2@(KsoZlgm1IB@eZg(2w8p&u30DJntd^<* zchMgn-?@NPl`1+U^Q91qCn=-!-e~pBr4rq?5Searn^%tOetLf4QpL^DAKf#KBWtx) z!!%c|e3)K2#ScVWC9YiGW~7-8Q7Tye#FPAC&{(DUyHMzcU6K(xUF4|#7OAtaHQ+~2 zu%CrCV;m{TOq4^KYP)cC?Fbn)uSZg@t~cXhIa`$i`uDN{s}u9eYOh$97p1eki;nY8 zZQQYtNP5oEw`9W_{dYYQ$IGmL^|pe$j{d!13i!0>2UgIx{;Oh_hgd4l6-#6ZJX>aW zJ6l!%@LIH%q*mes$aoqrp49CMNM;gKbh*f1qsQ!t@SBS@LB88rQB0m<1J%kW)O!0e=4|!G*U~l-8tFi3AQN-pr&b4 zyutSzPmX-9NxGIzM2oamS(T&U8W?yNn!f_*FK;b9P^%^;5l_f77?hjA@`M#KV}{}6 zvkWcOd~8L-9+8x+qB2cIO+QAHg3tsYIzL`i#j0Lg2b-FRZwZqMkzXx`1wN&EC zO)4qgN=$s8iF(=i$>J-bE`c!3pzZf?R&f5Jtk7>B5T7={Y?^?XZezGsNkib}N$t;0X?- zDeR%dF7$;O^tDYzUtU*>bSwD{)zi=3AAiZjZw+nX-ECMW=FRP3s%*5- zQ~5H2!jU3P((Gnx;EGW&Rf35=s2n85_*1A4F?;)Uls&EiQH2~b9&L;@k~P164oDr8S^V%d8K*F}%E9^f${Jp2Q>kF#yTi)Wb|(VO=Ie~jd+c6K zZT-dMhnYqXJ3~WdS~8B0M;_1L)OlaOoR<5I94^H<2e9sKD%Z4)*fu6dhA-iEi6XT?vcW<)>nB?D8MqMiK)fzw|c@?|DtgZsNqpaS804@t2u&zY-zrEtgB zNe|B3Xmj<7-RU4Wbx&`vR3rY0zW&X@NaCc^86!LGO&uP8I`wEWx@XySQ%~u-n&_$8 zIM%=aCE5c~gKVS}W42-uT#q16A=@(s9%!r|-}l)YVgB z)78at55-FJXTRpq({8jt4?{jPbqyMnW;dSgMQd1R+7*G*gSZ3@bcidESDZ9pXm2#N zS*rzdcZAPWJ9$ZoY_ZK1Wxu?wc(-Iw9&fh+Awx}h(8?Q1Qqea8&bi8PztVx?!R1It z^+j_jrOc@3nrB5)a`$ZQFifSmKr#qJYIZF@UKfptZH@0Eai;1>9ZfaT@@Q8n(z!~d z&TovjZT>cVhs%|qg`Sj`MtjdnfvIF()rKo>1`25AhF;rhHlcF4J-S7u6uB}Zq>h8* zo`k_r_N$&FpP@Od&?n`lyRSG5#I|INtmAj4n0l|ehYc!qZ(;dD;hgs_EP2C7$`jgJ z-9xp5Su*-1GqE}D6Uo=ag1p%KlXmWW8>`{$N^e?&-s*Qih9Q%N^y2efdienKEpv8~k(C zyG?z-W-5Ylb7C3E*$|``K6jjALORw`9}CR{=GG$96&vFEbap7>{=D^_-fSJzu0&^< z9GRNBmF`rUrXVRcU*=HXT(%Z-cNUz^nQ=28i0+=d z8dKr#oysJ>uXg2E75~ayX5rr_=$0_RExxVG(iDPS3W}mybzj=$Z7%fX zF}q!o4WVfsooo?X_IHr9Zjhwn@BJiCX>kO^p# ze(Ietb3R^^jp>Bwa}X>cVu^Q;)I3oV!dtN?jjJ{EX8*#w-EA*c?INbpNsTM8q|=^@ zv=XcD+;fS9+udht#{zXj^m(&>1|~D;JVDbykL#I8ilai=6_^Oe`_v{!J(5hXUvEzf z%5b=Sz8|yzm|JMu0J}I#xx&mTiYBQbN#64=%&8yXHtensa(C+I8~)p#C8AGV3v_|dvnpUmb3)gKU6 zxV?W~bv|9e{8r2^b;eSpJRCiYG^DTSM>yRIS`2D5;TVSb*bnP6>$oLs^i(^dmxeyV zi6#=j+G$SylOkfbWbz_?@mGg@B=SQ>HEL3;Vs3*vD~$7rDZfaB{{8OLfdYEd>{-`+ z^ejD_{G|1(ikygKPWn7w%xps&K6}#QEalE=N2x|nh{bkgFqID^!-&b%~RMj^&oRi>Pe%oN@92`X51yy??IuB8TAWUHv$IjTc9-!Z^dd;$`cJ3`%v1z zN7yT0hziAGRJ==|gY!J0OWiL<4AUW?ljCW$n%j)$IBT}w-%{%euLqqrKO@F6dW9?aH3!IV>@E+;yx2`Ra8_6D;I#> z(}@;Gb5mTxU$!L5vXjm#txh!QoEWE`%EO8NfZOw&wYN|efId}hbwhUbT{*@fCSyXk z$~l30t5dmbT|GlxGQ*vxK4of8g)dFv0CBV1#Lr;SV4;>PbG8b=33~;tl~BhUMzu$u z5~;qWfd08U-4ufXbzn8kj)U#K?xq;AsaQ&;Paeu}hhs{Gbyq297oU;>(tx{ayL%%_7+)AND6=#<@jO=K z2v9E12+OAKTd~e7H&_7@4Jsblp9vNVYpVAB%Z(`SVrtd9F$UCN+5@8-Vr<`PVzf;# z{xovbj@X~3{sSEOGyy0~$>%yd@H zK80lf1I_!QT)7niblf~C=wmyIUk#^F>fc158%zaRkm$In=E=UgK-40wiM&;{qp&v~ znXe(0W!^3x`Lyv^dL~3T)}+)MmVZD3$=0>!@*Na!s1re zU%w73wG#a8>$-CfIn*^${Cc zv;8o0Byhl@=@Xy*)Z*S8Iqg5GH2YY!x0eg>@RpZ0Ye*aSCu(iv@_)1A0-`N?MESAP zX0%%5lqG}$Jx5aI&rz7&C`(h7dPKkUCTmhXINr#nINWxbZ6ZqbH|8g?99a3I6gc*7 z9#!;bEEDVsFH^FTgA@c&O1#@6GS!!&kljPy5G%F=VO|bgTyV2%)#Uka+Da#WnZ?dk zeVusSyeyWG2&<8JETRc}bRi5rmp1lnG-EGV+0g}Tw3wU0=tiMV4$oyh#z3R7pCUUD&Sp3N?}J}|A?qJ zfRSO5w)lCO8+CN*6yJPaYb*V=QvY3^#@g?aRFW!LY#Dau{lafF)1;}tyfGK`*dHm( z?@JP(AYj7>Q9RZ9M}fkh8A*bzwBN=WGa86Bc)Do{ucb<=a`;=nj~r+sV{oBtjazP% zBK6Y`J`@U4z^%QE#bkeDyhrF6WKv7z(snc)X}7Y0_nY+53qrJUYy7mVXt{)vsr@W z18tRuR^_|fi2BKEM@Yi+)d36MNep&yl?bY0>dK0c@sOy+{a9?ZS$01auEiYJXd}tH z?yX*d%vh>uq5H@JEKPHRr_WA}Kla{x&dh0CtLny4DF+;QdTFEnt1*+;2J}`PqTnk^rVqiN3~Dzr@u=w%iH>pzfC9((OlbrWB@ifzXaU+cljF zX&tdHypta;ad09H9>>^iJgEW<4_wOfW)chxEUx!5`H_^T_2m+9FgXc<7#UjMuhSiW z78Od-!1sW8+1sAuMVUsV5urW14c*&5L2^9BO&`NpzQRuV7>jK^bLY%h{17DG;fA3f z=)3zk_xBsybw=_kZbTzemDYJegCm2bHSMl>^GbP{(9h!~wI4+Vc9zBuS)a*ofDg$G z(h_>6FP$GsiW!adBXD9|`}h5m*vyV~5rn>v6D{V?Zhz`A*N7DR1^`L?hyE zi_-8-yd?)m9-4sDnsn+;ENv|y2hsj6bLY7i?^oJe8d9QgPItf_oPaCPfC8}Q7G6|D zRW>ZIcXQ%p|6(?$PgLm17)UaZ!<($DdwbGhbhegY>$jr9d&JeHr_aHyPkp@l#8lxq zsF5HL?FT5|U+ZkXhAHwZ6tPsheoAKw4hX!YJa$?3l`f1VBPI{}sf6-Ld|&8(|8&Q7*k10@El)y|ApHCA-Y&~b~X1Fht-~_-OmrEY&|He ze@P2f#V-DOowX~LYO+Ju$aoeObq?*43U9Pipz#Mu@LPj+jv$}r(X5Qk&ZfPwjQb-f z#T2q)xNT3`zR?|*(;;@|{+q-pQ@DM2VKvXz=VfEIt>+yti5D`!3*!t6t94`HdP)0p zt?p+;^T6r$Hz)4C%H0cI;FT5VT;l$P2&!W#%_HP|onRC{@=F;9a$h#f3q^w)W-jZB zs|S5Ap3#wree=92xb31N-E0PjsoIi7M!9M*^#vh73HsCR+*W(4=0)TW!2M6Wb&TR91WJuzDw=Yh^`~6 zlEZa5@rSJZ(xl%(SV~qhlSECpu7?$m?q5#YO{IgkV@7`@UXrjtHMHMD3pm4u@vBhM1sh`t>5LCc{&yMfXe!3`Rz@f> znjF&bf_0j>F%PNTG8x*s*Tn4Db>;*jnGu4pSg879@A3}L3Hw>+ezy68`wOPop6%k`^$o4Zmb*_gFRqmMN`{VBHcIUL z$;QFuD)p&(@6jg8qL;L0)=SIReYV&d&3m(-@2LRkLMk&PO7L$1!{1Rbx6D(It1~rm z$qw0T-NN;ZlciO>?&(FkUk#?zt#yh=O3tPlqdfdHjY}Dg7R6Yf+kbA9+9zFPoeFi5 zC_gqW6DM(QncRjQ(};<*d87xe*!n&VMxXFnNtKt3#oc(OySGkfa;5Qcys^PLnJQa` z*Vg;~YK7@ZSLkxK^W)a^#M=PB2tsTnfd*PHHl?pd4?)w1D=9|9I zR0HY;57lsw`ij|6otOcv@aK^M>=4%DDK4&ac}{^3&xQVZvDsz8CF4;Y9ZgA;4EEOi z>sl4K2t2}lywT|{ZV1aauh-{lSXB8bdL2B6>feCLCVPf*3v>IShVq|Sc}Jwb@qa2& z#sM~xR-c8irrs*)Zd>@%J|ex2TJhdv7QvNqdmBAnX;9%=4I-#{&SydCJ(i$nC-nVUU!ARhZ@?9^W7Buu8 zy~=4@3|-Pn`siFg*^``A`mWhvS&PA0)J0f9p_PTOX-72STul6SJK}W^UlO7dKc@ey z#y_R zWsW?B`)PuwJ7dq9A`lfDr^G!(q2EW_gC`C=akMGNukm=V?^`yv^S+;MNVXP4XmELi z8+>JGbt!G=1}ckdF)8MitL?cO)$})dJDFe8t+JmTQWLr@O2+>{RY2JN@lk$A z!)IzH8kU7puW+R0Z0a!yMRE-xD-TBJD8ky)ooISlYvN{|HW>vXLg z%8F;HUW>=a!fz-XQ5&5QY$zj^I2&#hr_Jq+VjIe{4La}T%&6J)5meaK`2MiaHd{tl z2cbK~P{CTS>aCYFGm=MQ!W@xm{C*AQH&Klv^F zb76>uH216=*t^wOyNTP6;3;g$*Mdkym8rW`-~MK-U!^Fi$z_)kp3|d@v`A%iUQ>7p zBtZM`;Z3aZ_ZoFyuox!NDTmhz7MPaR`(ILR$t`fJ$b-}?G86%pYMCXhN8)DB3^7q& zO4N@PaJ%^8_{<8g9t^c93;KGxf#LqJLV!TN!Gcay^?N3`^Njv#0qGTH4EvZR8+}u@ zlnAcm+wqWY)w^<*f~2V|ZD+IAB*>djhw{OOwa#`z>hWw-%Y2r*d<;|{L+Y`97kQ>W zxJ&{)k_BtAVZB2xa+AP@m3$a9;~byO}iF(Z}su-dC*4ewEfWWPm8Q? z(c$K_bLH>I=n$}FmJ_=`YgksK0){9*4Xn~4x~5iraPvRH(qn?w_cLa#Yp_xB2ShWe zIaBn|DD?IHD&%ZoPtkGWS;iV7iK2p=p;yZl;C})>Ud}BR=p;-t8**NV{?-GeIzj+{ zh6&Im1d+%mKQ7ab3Fc=h90j*l=BdVX@I5)M?KK+rYVm3M{;U9ayj&`+VJ^p)B)Fam zsP@|i9{kukZL=9XNvbX3f{5q1O^6h(Qp@E}j0@4gq~3_9s@(HDSYIwx<9bCprtT^~T(8sp^Z(FMV+l)5dZ2eO7m_ry ze3LyPw0+_;DLKdaLBZ`6w^e~m=rC--vpk$v!OduyL)3}L_!WE!7}Yg_9X zVQ9I8fJ=A0!s7u(O|?;(dpFg^U{Z@x?7p$^q&eP#*FK2%R((20QWa!(T;5g95!+GJ zxrU@Rd0xn)(Ui#7)gF5C=80nc)fb|@`Y3{qk#LMI{=a?d` z-Fqg`x=?EmSQRUQYt!Dh^m2Eym=-zTPK601pRa*VG?p?Pw)FJrnId~CTdE*dV!&uh z9(24ZJC;IKwac$69VUCBv^9|6B@MtQ1bHEg-c{P3c&{_K9JpB>e%FwFX=dKq2{NwyXUwi@b#AhYj2w#&NIt$ z^5yZD97oQaZVV><+K@gxO1)cLs=5CNqp#QWV}GgovobSV=wF_-9zdS{!KfJ8&`q0o*)pyM zmhFk@zMe!(1siG8=)78^m~5s+vM7a$Iha~@cP@&5YRwgLfBFiypWam+O>jn<6$#)! z0Hxys?Gl?7meZE#14WPJil-Zh_FQ2~RqN&{hsWS8V;$Wo(s3rTpIyCDxKsTQX<#T5 z=P3r_U|;61#(fJkUJLN7*;Vuo8BZ$*q^0++asl<$G zkRKa`!{RyL(dcU$h!I{Nze`)cmOV*h53t1VzIU2JC7t0Nx@W*?DyF&zm@EB9o?KhW zCHvEpt<`XHel2;FF_0jM^$tZXJVdy#I=3#7SCjWB%nw-xy-;{{>%g03<5ZKHCn;5S ztP-~+{v*Y?_LtJ24f_=Gk12VID5UYwxy5zH!2 zumHxGp{{@=ByV4()+qkor1Jx+e&OU~A+Ig8Jnrzrgwucuwh?Zd5(_3{J5^@5OK3uE znvG4_Pi0LqE7U&KLjP}jiTjKV#~2#nEI)@L=5abk*)kiyoi4AC#+_c`g<2Xj>@MG# z+>3fF@jK71jXbrp0p^6B9$ZmMBNSSuT7+SF}hrH}Gh?aHm{$vsAWJ>n#pPGr#{s6H4Fp>_j7 z4MS6haX+c#DD8&IV?6?432E+0*9z2nEtYZwUoPlNPwu2 z&-|Fmc8d9Wjxn*jl^hyQc!&oLT*o$7}j$zR0=|+n1`l*oLw~9feY8{@NUThk!_eIkvqlB3A!c^%zO<+vNjMq!N6@oc&2wU+)1|=K ze`@CchkGLa|Ef%oa+F%hMsK6uVTtmdiuG!q$TcoN{f5oCwqaj~v1<8e8aeb6Ih_}*6!eo~^JCE;@B=H@C#7?AL}lT4=z zCUYF+y&fLe`XcZ`?W>VB+P$zEk@G><+CL+#opi=d2#7z!1;Yq4R>;fAgW5I0*NdTw zrmK|mh0-xKeOLgZ#3Hl1Zz@#09V_La8q=l4AQBUkVlFmGNr*)Wqk{X!Wm_6I&UZ8X zal5N4RYJkdXj=*`1CZtS%dRW(b5S!hvkZJBz|%8{t%U~MJ0Q1|T?GKWGx3!s88bSq z(USE42x&!-g%dRL_nrvBeJJN=&((M$UXlD7q(8sUsrqt|`xf4#yZb|nCR7<3ENVmi zA@{eirvP8~_9CG)c)GN4vvJ1SVvG#@Nc;}V0MKx?%5~q=3bt~}-CNXN1&7KnDbArL zVVaESpkQSVQk|gPh3C6su^9#N;LaXImqLBzTfz8a(K{H5V_0%IFfHzI~7Tmmp7d)L+~pF2hRHHs1Kem9Jtkm zfy#uW#-s{wZg{+nbpn|-@tW&iJy|}ya`rD@DU-3k+n3^Anqm;IYVGilMh(sOYMOF0 z`#=KmjD%=DZjBRso7#PlMsmel9><>k8(Kys@R2-s51@BXN~?A&*Hcev%_nguVv=eB zYV2;Nsq3IR^2i9~}dqcb_;rAKPMb|V{P)9A|=lqWj zY>SVI((g*#w^fUw0SGNjJVc@`1;ol*hS}{-Nz+S=%r2{2x*IgwKvYq(2%B#tZp%D=!K>;_^o{K&4 z6U96ta)w+mbR|!;tzX0;Y2Ow7B3YRV#xp#U)a3q?*CK>b|^dWegWNS9E6o?Ped( z!yZ|~{?3bL(+@{}wmZ~Ji{`;5Iv^smAvX?MhEpb25+Xh{HCI6m~*3+^Pr z2j5zoZ&C<$Y4GVxot8aF|2LQrrz>=U((8Ij?IF!Ho~#fX;l`JKe$X~?$>J>+IU!s7 zF_g4yo30#OsC3!b@Wqe6ty;OXx^go8`>5Q5doM*y4c7F36CS$MQw;t3A(h#}?+}7a zbw{aS8?z$@&J0e;Broer5mgT&jfpuD_YwOvx#_%sDW<{I{2B zw^xc_oup@+8*?Nt>xhLZ)7-?+w-g=y5gi5hr zDE4hW{IKkHaG%Lt+se0w-%=o1xbr?GU1z)ci8%8id9$`++T)SZiD0QWBmL@7iP6|N z_kZ+B{OI;n86ul=ut?s{71kQ#E!%VVZs>&?+n|-jstm{e(aYjpkit~l3o9hlk2zvS zIgHAHLO*PO(501LnH^)rl?TZ5*!ST@e8u&CnD}ognD{Lj#ea#ZD-P_&W+!ye1jWaJ5V}d;6@z zuqabK_wZo6;L_m)bFB`jxGurM|oMX*GVYgkShJ`K}gA??;Zfj+Rq&2&$rx zx0RX7Wgo}MckUd&sWlG`9&ta9y=*bZA9F_AUXJ&aBWlgLNtDhMhEb58 zmTsx@BkkhIPBJ1bGgC+|Yjp@lSc$P9X}dk!3dB$c!~8^Z1gZ_sz*51`>INh)t6P+_ zguZ#I;tXS$K$Y^TxH0VnLdGpIe+E(l?r&CopEgwC%T1F#J(x;+MBqp_+>NmDJlihI zrjjE3Fi`Nz1qj?zCZaWq&krRP&!tAf5R9HT%#y_SJxnQxqylg>G*_COwvWVJe~Kr( zbtUO)+ulA8-`#C9zDCa}A6mmj;Bh5HXf81r-y$Ks+1P8nF9+LgFs*5JJZ7bO{S?o8 zK?(NM2Aet@_k}weDYn)2_V9wFnBqVC--Q1NPySz&p@Xeg z=)9^1M-g%`;3y(QVqS_T4;d^`c?ie4jaTpm2M$EwM?q2iL9`;T77pBS5B1=K?HILt zb~32`5e*6Yh=y#4za>b7{qVAlBxFdF^|HLbjZ-?30LyOd$r7Q$gKw#s)Y}Iml?k|Y zebiSYJUFWfUTOVj6#nvBKl_(DKov8A&j$5fsUj=_W)`@{e-He)2sEVhxkG2L7?H|B z@UP>F{{}eqE!r${b1YHG3|UJ$q6Y4M0oQskejtTEpFe*}N419Z)ORS#?vUD9ep+i< zYk8Z_S6SV4j&xUTv!NGvnCUb%suB#)(@r|qI_OXMPoMbPN3IWVzli~UW&{V2d< z=d3#!;M1L(y2;BJ_RHe-1#?xh!D}}5=h2#rQi+eW-Y&~8^-#0=cx#lmg3Fbj#! zwJtJpH`ea_zdMhH@v3+P2hGklw4U#dHV$P|(Xn__J5K*K?MWYHV+QqYnXMot5M%bp zX|p!JFqnsZxFu_76bs-Fc)@WdEl*T$t^Nlvh-Bo-kRQvn*-Ou`;dP1=T&21OmXwWEF4n z^&E~0W$nXC_lqex+5&c>x42TfpM=BR5+(n7m>*Fk8z%ee_sSKLNS}eW7VHn z`{eXUrWbkH@5BO`PN@s|@0l;K6S#C+%L(`oPTR%ewdMK0r01|B=H1(81%%$js0`=3%VP8&o3I|N};c(R7v?5zk^B7 zp=G8%&^z`wcJM?8Rz|}U8`^q66rEfUOdt@DA((x%USe_FQF}C=Zm z)7yBmlkH(>J!7V5cqJUsSY_BKDQ~<#AdVf?x(68pO|&f?gVspenxS-@UIVtBGm>w<{Zu1@>SohsPToehTq7+g|$UvKleMXE!Ze~%KA7rN#| z*WTlbe!*fw{fps;ff>I3aK_7Aor(%N3SZ_dYX)U2g5vsX8kDuSl-LZA8gDA_i@bTw zr8xoav2($r@_OxN5Xn;{I|_FWb4r?nLTk)8cSo8mcLQHujbrEYE6JG&fd!pE7lt0a zbM@$M)`Y$LwhJ_^v+e=GxqL5wv}Zb50IwoGc$%Y|M5R^K8DWkyTTg_Z98PZK!j2V7 zH?eH?7qxf#l57IuN#s0sqW?7Mo}_TZN0plH!Q=i>ITrpP_S}y2gn819et64XdQBkD z!HO>swEtiVvOwglBQDZdnv$|=$Zl_nM|cxNPBa5&uztpd!%*fULuFOnWQ(7+J~KLz z_KVdQCcBTxVbxMc(9w-hHFRp%regu|3DpX}ae6Q?v6h;wWD^-RFGztF*Y9_(wm(Qb z#WYwQ!S9Z`dV=v7Sp0`-_m zSg`(FJ;TEi?4-4(aCP{*D&IJ0{=Jc^$5}BRdSPcOTC?rOyD`i66#1@6G&?RhEeq4X zB2L6SrL9Zcob`+>=(j&AcjNNuhR>@b$fQN)@F(`g4IEZt88~{l>K=|p5kSkBP4hjM z+;7Y~!=3#_nhj~uZjH;%)g%;d5Ftx!6!nuz2xOPF64to~@~+ z$@a8wHW36t@GME9|Agb!2VR94?*~ZmDN$<*fr(o< zC<(l(gqVVwg`VSH{0W} zaBjRzVioYo!F7I!Ns5cwAICQLRg~%f10GS)nzLU>V!%SwnOu+L5NV#f90F~l{%c0u z%)e3UBnd%rBoFtHyV2uwsFw!>{w_}@X9dQ~eTd*crKNUSY`=r8Ij466uS~)>Z0azS z=$l-5N)$`P=d~-pmRp~^kom=hKF>Tz76=oIwZnn|txKBEy|?#Hd&(Gi!89sq#mviw zuo;`#KeYfDQaG}0%!1|ncwmW8=H)>LEp~V5l*T_HnrrJfK5uuN+E>cH*7PBrcTo;; zw&7~1BL=DF|7&GB?HvcE>zk{GdcNsh1{@A>wTq@*p&UF!+90@j+Cq#(2Fa3^s_9Zo zM>i!rV5{Gx@>h=T4nZ#*a$!4|Xox<~4m%LKB8Z(8aETQE0ce5u4PEkTn|UQ(%}*( z$BsSQBgm{8@hl?X9v0O@DPZU5Uu7;;=TZq}NHe3-J{h0|$*O@6NxWzhq3F{$^C9*+ z5cY2g+LrTFtCBIg<}8oK7Z`%oG<5AuvDWMOzn5F5azw9nc7B+%7L)<5bHv`8w2S}S za%;-kWS&3%UpZ#`296s`iGQKU`!!r(_<%T0^2B1M8NL>?i#uze-c)1xe;{xz@Vk!= zk1qVazMo83e5yXYuNJ|Ws#L`Ti@2t^cW}IL7t+9gOi)-a(l^Y>!CuiH8&CfFur4G9 ztf31#t+%S@+@(mY?X=yCTY=+ zMbzuU6B>S~B{am$73U|+&NV13mYl_K*4dWO2}LP>FO4(#@Wl==GIActo@YnOJau<< znbhycv2u6Qyw`I6#53<{9AIq}PJE#2?Sa#nW%!gm5fc1E5?R5FvC`36GtH`fblruWh2@D}>-j{D?ahD9ZU zTV(Dbzdcc>=I~%O-g4avxBr-}BxQ2&U2%xypc)`6LRPp_k?egs{MCerO^(l+axFS`QY6ZvVrwvU;zbZ9)m2naos4c&YkMl?v ziEft+G{jpzFUW~Apoi1WSRY6{uQ3^zT2sO*=ctyJo|sKrueH{NAN9WDpxxgI@ax1qz{dIggh}8d;elQ_>M8MOjlEmi!=h^_i|^D{_0p5o?@z> zIbyV&Nv10@`p_3b*=esjcdEfcw{&oLZli6A4tTlVq-h2Jl zI%f`nF(Mz7o6n0(w*C?_BsC@=Nij2>y*`rMKC1T0Rzz0IbT;X$1mid2N+`z^jjO{K ziDah7$s7TPM)sUQ^^O&q$(~X!{86xq_mk2(OtUno0`r=g0i8}LQ{D7UteG|d>h|v2 zBxcsH3<=TISL87%ds1S|Ski%(eAYwvh!`fv@RqtHt~+zqrSc}L>h{15xx-=1l%&?M z=4BrqvE-i)nX>&nOUjij3iSm6YyfAG&}}(g_ojvi%?z}Ro+EBvy{uk3Boh@cZOGCo zL!{xeea4LGR;zNXB)Vv=t~T1>>fGBs5EB5`UGa{MVxTa9=T^kgP%nY2Z-1fqtKMyO zXA=}F>Rqqyy{Hc^A`ACOnA`#E3DuLgKL{L}2RSAgFBQ3B`VMKBe z&QW__U4Y1vfxx2nNNim?Rgp8FVNZ7#Y^6Bk;ibi0;+{${I}7g5A-PQwhUSFvt)83> z2#B{rM_i@`XeC-WXJX%$+h1-HmtWvJ;MCS99$1#QMC1qU!85KpN18N1BE<9vXS*hy z5_Cj+D!EuDE6*<(D&tqub>*tE3*lJ~DZp&!uk9Rw5#={YT?c8dXN$U;P~P$Htp;?f z9%me8DeH(R688g-D+=0AFV0j0nLt705`opcfd})lE=3~-Z(5~C`pXUU<7ex$qao33 z)jpm>NLIo6_=;G=D@}QRQXAv+RU-&Ek9tDv>kAzggV@0B6v3j!38r4^xn%7JI8}uV zKV_~Hroff>+Vbi_g_gfdT;g_eA zFPR3=v6JC0M7bC(^oOM|8UVaZo-SG57~8nzZbJ2%%BL z1R#mvL%?G^kC8DB)UemS0-^_%Ez{ahGV%Abo76}6)Ohzmb&#Nx+uO&9mKm6H}s z6ypy|S5#nN-tf-DJbR(>O#9$u3la(I&2D>dtD!|bIQT%W#4B>FSWh+_-G6kOVCJ<@UZPKH0-*E64X?JKN0nh=4iHl z?RkdhyFco}F7ZB3jBwVe_HwWb=CTv@neT_W9$oLWnN2n&Hv5BWgT!4nDiobGc~v?c zk5@lm>J+!OwCko6i#M$2`chM&GQ?n7MXcd`R-Cf#;-*8%p@-)=cp!dlC)8@3UBp6F z(e!#~9EdfuKTWT2Ec+v!$dnB4DH7{Bko|dwN6V}NGb^K`tF@s;>$TSkbzxAvGMZ{`OftnxJOK8C}3^SUEuL_ zL1%0eK_kRp#8C`|C>Qt*7P@;`fwnBigwt&vQO?NKNA-E+a8YzP56e%ylToNh#1sG$ zhC_-oy$WxS2A})JvuO}TtzL+Vv-+H6>zeOAZYom4(@eTfs4~BEA|S39n8C5Z4dHc? zTsv}PTZ^7in)lS|JtW}dh!?VZu67eUq2Wh1vp%1W2%|`iMzrsgjTPe|pb`>rz z&PVD@B$)C=r4vsssDc-Mp~ycxAF@|^TK@GNE%e*ZJXf20J08~-s}er0EcEY*Y{DP= zR11jJq`#C%qq(t3F_FB+>rEJZk{OLqleJ;np*9Kz4M}%@=9=7_iZJic7vD>b-ePlEgTAcd zw$Q7fjh)#~eX-$wiPew#46-x6vc|QE%>;?1g!MuDs(0iy?VDhnxB0u7?@{QOi^lxbb`)YA!5lwA5&UmbcF-$#$eRf3}>be3xp^ zNTLIQRBT?hmag4ot`VP8(`-?|YuETOwh8r4H`|+4m+PyrKP>1Hs$+ajce8bIIXk&k z;3%5a&Y3~l>0x9aNy>`XW`0Xjp!z?x<&(H{<=B}F*iQUOO+%g1%rc1 z&lnhF>mu#tPgo2vp0~u#LPL9xfnGLm2{l*LQi6gy=Th-8KFrR-?^H?%nydb5aIbG@ zvCJX(egBqN)vEodOBie*#S_0Ctyf6Yv^LOyy;(D{#rDyZ-Ft7;FQHf~wk#=u+N~Zi zcjFbGXOw)@3Q&A$K7?1Y2hpYAdA~6j=!`7co4r&S7P%h-j`kK8jtrV4*tz@mNkLjk zmpF>kW}AR~njNWO_10?EVb#f^b?~HXQqBo3(YZxai}re*QFJmhk+F4Vwys_4o6^_l zw^NpkhMuFd`}c1Xa_f8RU+vwEHC&w>SW_m!>+;0nKxK{Cs2y@jxJbD_Wa^(ZjNL%+35Vt)mVJ{^R;ds z4<-kxKgZDm7gH*jTz&#+gh4&s)vjuGH31w~H3yHw`6%0AYJ}&zf+JUbPV76YUFGgO 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%0DvI;iXo@OGs#^0NJTRzH92 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 z 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 diff --git a/fldigi_doxygen/user_src_docs/configOlivia.txt b/fldigi_doxygen/user_src_docs/configOlivia.txt index dae6bb6b..5ddff48f 100644 --- a/fldigi_doxygen/user_src_docs/configOlivia.txt +++ b/fldigi_doxygen/user_src_docs/configOlivia.txt @@ -23,6 +23,12 @@ rate, and excessive latency which is the apparent typing delay caused by the integration period.
    +Each Olivia transmission can start and end with two distinctive tones. These tones +are exactly at the lowest and uppermost tones for the selection of tones and bandwidth. +They can assist the receiving station in tuning the Olivia signal on the waterfall. + +The start/stop tones can be disabled. + See \ref olivia_page "Operating Olivia" for additional information.
    diff --git a/src/contestia/contestia.cxx b/src/contestia/contestia.cxx index 0a48dc27..857aef1b 100644 --- a/src/contestia/contestia.cxx +++ b/src/contestia/contestia.cxx @@ -91,6 +91,8 @@ void contestia::rx_flush() void contestia::send_tones() { + if (!progdefaults.contestia_start_tones) return; + double freqa, freqb; tone_bw = bandwidth; tone_midfreq = txbasefreq; diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index 8bdab147..3a75d87b 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -3200,6 +3200,13 @@ static void cb_btnOlivia_8bit(Fl_Check_Button* o, void*) { progdefaults.changed = true; } +Fl_Check_Button *btnOlivia_start_stop_tones=(Fl_Check_Button *)0; + +static void cb_btnOlivia_start_stop_tones(Fl_Check_Button* o, void*) { + progdefaults.olivia_start_tones = o->value(); +progdefaults.changed = true; +} + Fl_Group *tabContestia=(Fl_Group *)0; Fl_ListBox *i_listbox_contestia_bandwidth=(Fl_ListBox *)0; @@ -3243,6 +3250,13 @@ static void cb_btnContestia_8bit(Fl_Check_Button* o, void*) { progdefaults.changed = true; } +Fl_Check_Button *btnContestia_start_stop_tones=(Fl_Check_Button *)0; + +static void cb_btnContestia_start_stop_tones(Fl_Check_Button* o, void*) { + progdefaults.contestia_start_tones = o->value(); +progdefaults.changed = true; +} + Fl_Group *tabPSK=(Fl_Group *)0; Fl_Tabs *tabsPSK=(Fl_Tabs *)0; @@ -8488,7 +8502,7 @@ i on a\ntouch screen device such as a tablet.")); i_listbox_olivia_bandwidth->when(FL_WHEN_RELEASE); o->add(szOliviaBandwidth); o->index(progdefaults.oliviabw); - o->labelsize(FL_NORMAL_SIZE); + o->labelsize(FL_NORMAL_SIZE); i_listbox_olivia_bandwidth->end(); } // Fl_ListBox* i_listbox_olivia_bandwidth { Fl_ListBox* o = i_listbox_olivia_tones = new Fl_ListBox(371, 96, 70, 22, _("Tones")); @@ -8505,7 +8519,7 @@ i on a\ntouch screen device such as a tablet.")); i_listbox_olivia_tones->when(FL_WHEN_RELEASE); o->add(szOliviaTones); o->index(progdefaults.oliviatones); - o->labelsize(FL_NORMAL_SIZE); + o->labelsize(FL_NORMAL_SIZE); i_listbox_olivia_tones->end(); } // Fl_ListBox* i_listbox_olivia_tones { Fl_Group* o = new Fl_Group(110, 135, 379, 133, _("Receive synchronizer")); @@ -8529,6 +8543,7 @@ i on a\ntouch screen device such as a tablet.")); cntOlivia_smargin->align(Fl_Align(FL_ALIGN_RIGHT)); cntOlivia_smargin->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); + o->value(progdefaults.oliviasmargin); } // Fl_Counter2* cntOlivia_smargin { Fl_Counter2* o = cntOlivia_sinteg = new Fl_Counter2(125, 198, 70, 22, _("Integration period (FEC blocks)")); cntOlivia_sinteg->tooltip(_("Change ONLY to experiment")); @@ -8548,6 +8563,7 @@ i on a\ntouch screen device such as a tablet.")); cntOlivia_sinteg->align(Fl_Align(FL_ALIGN_RIGHT)); cntOlivia_sinteg->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); + o->value(progdefaults.oliviasinteg); } // Fl_Counter2* cntOlivia_sinteg { Fl_Check_Button* o = btn_olivia_reset_fec = new Fl_Check_Button(126, 230, 349, 20, _("Reset FEC blocks when changing BW or Tones")); btn_olivia_reset_fec->tooltip(_("Enable this for UTF-8 character transmission")); @@ -8557,18 +8573,25 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Check_Button* btn_olivia_reset_fec o->end(); } // Fl_Group* o - { btnOlivia_8bit = new Fl_Check_Button(131, 291, 265, 20, _("8-bit extended characters (UTF-8)")); + { Fl_Check_Button* o = btnOlivia_8bit = new Fl_Check_Button(131, 291, 265, 20, _("8-bit extended characters (UTF-8)")); btnOlivia_8bit->tooltip(_("Enable this for UTF-8 character transmission")); btnOlivia_8bit->down_box(FL_DOWN_BOX); btnOlivia_8bit->callback((Fl_Callback*)cb_btnOlivia_8bit); + o->value(progdefaults.olivia8bit); } // Fl_Check_Button* btnOlivia_8bit + { Fl_Check_Button* o = btnOlivia_start_stop_tones = new Fl_Check_Button(131, 315, 265, 20, _("xmt start/stop tones")); + btnOlivia_start_stop_tones->tooltip(_("Enable this to send start/stop tones")); + btnOlivia_start_stop_tones->down_box(FL_DOWN_BOX); + btnOlivia_start_stop_tones->callback((Fl_Callback*)cb_btnOlivia_start_stop_tones); + o->value(progdefaults.olivia_start_tones); + } // Fl_Check_Button* btnOlivia_start_stop_tones o->end(); } // Fl_Group* o tabOlivia->end(); } // Fl_Group* tabOlivia { tabContestia = new Fl_Group(0, 50, 600, 330, _("Cont")); tabContestia->hide(); - { Fl_Group* o = new Fl_Group(55, 80, 490, 200); + { Fl_Group* o = new Fl_Group(55, 80, 490, 235); o->box(FL_ENGRAVED_FRAME); { Fl_ListBox* o = i_listbox_contestia_bandwidth = new Fl_ListBox(110, 100, 85, 22, _("Bandwidth")); i_listbox_contestia_bandwidth->tooltip(_("Select bandwidth")); @@ -8653,6 +8676,12 @@ i on a\ntouch screen device such as a tablet.")); btnContestia_8bit->callback((Fl_Callback*)cb_btnContestia_8bit); btnContestia_8bit->hide(); } // Fl_Check_Button* btnContestia_8bit + { Fl_Check_Button* o = btnContestia_start_stop_tones = new Fl_Check_Button(141, 280, 265, 20, _("xmt start/stop tones")); + btnContestia_start_stop_tones->tooltip(_("Enable this to send start/stop tones")); + btnContestia_start_stop_tones->down_box(FL_DOWN_BOX); + btnContestia_start_stop_tones->callback((Fl_Callback*)cb_btnContestia_start_stop_tones); + o->value(progdefaults.contestia_start_tones); + } // Fl_Check_Button* btnContestia_start_stop_tones o->end(); } // Fl_Group* o tabContestia->end(); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 079a428f..81e2efa5 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -3880,7 +3880,7 @@ progdefaults.changed = true;} label Oliv open xywh {0 50 600 330} hide } { - Fl_Group {} { + Fl_Group {} {open xywh {55 76 490 280} box ENGRAVED_FRAME } { Fl_Group i_listbox_olivia_bandwidth { @@ -3891,8 +3891,8 @@ resetOLIVIA(); progdefaults.changed = true;} open tooltip {Select bandwidth} xywh {110 96 85 22} box DOWN_BOX color 7 align 8 code0 {o->add(szOliviaBandwidth);} - code1 {o->index(progdefaults.oliviabw); - o->labelsize(FL_NORMAL_SIZE);} + code1 {o->index(progdefaults.oliviabw);} + code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group i_listbox_olivia_tones { @@ -3903,8 +3903,8 @@ resetOLIVIA(); progdefaults.changed = true;} open tooltip {Select number of tones} xywh {371 96 70 22} box DOWN_BOX color 7 align 8 code0 {o->add(szOliviaTones);} - code1 {o->index(progdefaults.oliviatones); - o->labelsize(FL_NORMAL_SIZE);} + code1 {o->index(progdefaults.oliviatones);} + code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {} { @@ -3918,6 +3918,7 @@ resetOLIVIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {125 166 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 8 code0 {o->labelsize(FL_NORMAL_SIZE);} + code1 {o->value(progdefaults.oliviasmargin);} class Fl_Counter2 } Fl_Counter cntOlivia_sinteg { @@ -3927,6 +3928,7 @@ resetOLIVIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {125 198 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 4 code0 {o->labelsize(FL_NORMAL_SIZE);} + code1 {o->value(progdefaults.oliviasinteg);} class Fl_Counter2 } Fl_Check_Button btn_olivia_reset_fec { @@ -3942,6 +3944,14 @@ progdefaults.changed = true;} callback {progdefaults.olivia8bit = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 character transmission} xywh {131 291 265 20} down_box DOWN_BOX + code0 {o->value(progdefaults.olivia8bit);} + } + Fl_Check_Button btnOlivia_start_stop_tones { + label {xmt start/stop tones} + callback {progdefaults.olivia_start_tones = o->value(); +progdefaults.changed = true;} + tooltip {Enable this to send start/stop tones} xywh {131 315 265 20} down_box DOWN_BOX + code0 {o->value(progdefaults.olivia_start_tones);} } } } @@ -3950,7 +3960,7 @@ progdefaults.changed = true;} xywh {0 50 600 330} hide } { Fl_Group {} {open - xywh {55 80 490 200} box ENGRAVED_FRAME + xywh {55 80 490 235} box ENGRAVED_FRAME } { Fl_Group i_listbox_contestia_bandwidth { label Bandwidth @@ -4005,6 +4015,13 @@ progdefaults.changed = true;} progdefaults.changed = true;} tooltip {Enable this for Latin-1 accented characters} xywh {79 249 200 20} down_box DOWN_BOX hide } + Fl_Check_Button btnContestia_start_stop_tones { + label {xmt start/stop tones} + callback {progdefaults.contestia_start_tones = o->value(); +progdefaults.changed = true;} + tooltip {Enable this to send start/stop tones} xywh {141 280 265 20} down_box DOWN_BOX + code0 {o->value(progdefaults.contestia_start_tones);} + } } } Fl_Group tabPSK { diff --git a/src/include/confdialog.h b/src/include/confdialog.h index fdcaf720..6553cdf8 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -357,12 +357,14 @@ extern Fl_Counter2 *cntOlivia_smargin; extern Fl_Counter2 *cntOlivia_sinteg; extern Fl_Check_Button *btn_olivia_reset_fec; extern Fl_Check_Button *btnOlivia_8bit; +extern Fl_Check_Button *btnOlivia_start_stop_tones; extern Fl_Group *tabContestia; extern Fl_ListBox *i_listbox_contestia_bandwidth; extern Fl_ListBox *i_listbox_contestia_tones; extern Fl_Counter2 *cntContestia_smargin; extern Fl_Counter2 *cntContestia_sinteg; extern Fl_Check_Button *btnContestia_8bit; +extern Fl_Check_Button *btnContestia_start_stop_tones; extern Fl_Group *tabPSK; extern Fl_Tabs *tabsPSK; extern Fl_Group *grpPSK; diff --git a/src/include/configuration.h b/src/include/configuration.h index af3c156a..630c2ee1 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -517,6 +517,9 @@ ELEM_(bool, olivia8bit, "OLIVIA8BIT", \ "8-bit extended characters", \ true) \ + ELEM_(bool, olivia_start_tones, "OLIVIASTARTTONES", \ + "Send start/stop tones", \ + true) \ /* CONTESTIA */ \ ELEM_(int, contestiatones, "CONTESTIATONES", \ "Number of tones. Values are as follows:\n" \ @@ -538,6 +541,9 @@ ELEM_(bool, contestia_reset_fec, "CONTESTIARESETFEC", \ "Force Integration (FEC) depth to be reset when new BW/Tones selected", \ false) \ + ELEM_(bool, contestia_start_tones, "CONTESTIASTARTTONES", \ + "Send start/stop tones", \ + true) \ /* THOR */ \ ELEM_(double, THOR_BW, "THORBW", \ "Filter bandwidth factor (bandwidth relative to signal width)", \ diff --git a/src/olivia/olivia.cxx b/src/olivia/olivia.cxx index 79671275..e83ccdb0 100644 --- a/src/olivia/olivia.cxx +++ b/src/olivia/olivia.cxx @@ -105,6 +105,8 @@ void olivia::rx_flush() void olivia::send_tones() { + if (!progdefaults.olivia_start_tones) return; + double freqa, freqb; tone_bw = bandwidth; tone_midfreq = txbasefreq; From f78aa389ac6e0ca6e9ada385e75998e1e711e756 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 13 Sep 2015 09:43:28 -0500 Subject: [PATCH 013/138] Clear Tx Panel * clear entire Tx panel when executing a ^r or ^R sequence. --- src/dialogs/fl_digi.cxx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index fe4d784f..d40caf88 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -8013,23 +8013,27 @@ int get_tx_char(void) break; case 'r': if (active_modem->get_mode() == MODE_IFKP) - REQ_SYNC(&FTextTX::clear_sent, ifkp_tx_text); +// REQ_SYNC(&FTextTX::clear_sent, ifkp_tx_text); + REQ_SYNC(&FTextTX::clear, ifkp_tx_text); else - REQ_SYNC(&FTextTX::clear_sent, TransmitText); +// REQ_SYNC(&FTextTX::clear_sent, TransmitText); + REQ_SYNC(&FTextTX::clear, TransmitText); REQ(Rx_queue_execute); return(GET_TX_CHAR_ETX); break; case 'R': if (active_modem->get_mode() == MODE_IFKP) { if (ifkp_tx_text->eot()) { - REQ_SYNC(&FTextTX::clear_sent, ifkp_tx_text); +// REQ_SYNC(&FTextTX::clear_sent, ifkp_tx_text); + REQ_SYNC(&FTextTX::clear, ifkp_tx_text); REQ(Rx_queue_execute); return(GET_TX_CHAR_ETX); } else return(GET_TX_CHAR_NODATA); } else { if (TransmitText->eot()) { - REQ_SYNC(&FTextTX::clear_sent, TransmitText); +// REQ_SYNC(&FTextTX::clear_sent, TransmitText); + REQ_SYNC(&FTextTX::clear, TransmitText); REQ(Rx_queue_execute); return(GET_TX_CHAR_ETX); } else From 9632b3ae120df791c9dc564ea135808bee74673c Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 13 Sep 2015 16:15:00 -0500 Subject: [PATCH 014/138] Version 3.23.00 * Major revison release - new modem types - change to MXE cross compiler version --- ChangeLog | 21 +++++++++++++++++++-- configure.ac | 4 ++-- fldigi_doxygen/user_src_docs/Doxyfile | 2 +- fldigi_doxygen/user_src_docs/index.txt | 2 +- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index dd9d8f63..bd787cea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,26 @@ +=Version 3.23.00= + +2015-09-13 David Freese + + f78aa38: Clear Tx Panel + cbff7c3: Olivia/Contestia start stop tones + 37175e2: macro bug + 3d6e0b9: FSQ updates + ed3b09d: ifkp modem + c82de8e: MXE update + 7b42e01: Macros + 0606d1a: Doxygen help + d4b6308: QSO rec + 2df24b8: MS Read logbook + 30ad2a9: WEFAX hang on INFO + 6704797: Nu opBW combos + db69617: LSB modes + + =Version 3.22.13= -2015-07-18 David Freese - 7bdf051: FSQ bug fix 9319676: XMLRPC commands diff --git a/configure.ac b/configure.ac index bb658d00..9eb693c7 100644 --- a/configure.ac +++ b/configure.ac @@ -8,8 +8,8 @@ AC_PREREQ(2.61) dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) -m4_define(FLDIGI_MINOR, [22]) -m4_define(FLDIGI_PATCH, [.13]) +m4_define(FLDIGI_MINOR, [23]) +m4_define(FLDIGI_PATCH, [.00]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.5]) diff --git a/fldigi_doxygen/user_src_docs/Doxyfile b/fldigi_doxygen/user_src_docs/Doxyfile index dd689040..756bbcc3 100644 --- a/fldigi_doxygen/user_src_docs/Doxyfile +++ b/fldigi_doxygen/user_src_docs/Doxyfile @@ -13,7 +13,7 @@ # input used in their production; they are not affected by this license. PROJECT_NAME = "FLDIGI Users Manual" -PROJECT_NUMBER = 3.22 +PROJECT_NUMBER = 3.23 PROJECT_BRIEF = ALLEXTERNALS = NO CASE_SENSE_NAMES = NO diff --git a/fldigi_doxygen/user_src_docs/index.txt b/fldigi_doxygen/user_src_docs/index.txt index 514b6151..3a932286 100644 --- a/fldigi_doxygen/user_src_docs/index.txt +++ b/fldigi_doxygen/user_src_docs/index.txt @@ -18,7 +18,7 @@ /*! -\mainpage FLDIGI Users Manual - Version 3.22 +\mainpage FLDIGI Users Manual - Version 3.23 \anchor main_page
    From f472a1764611a26c88ead12cf794de366e753e60 Mon Sep 17 00:00:00 2001 From: David Freese Date: Fri, 18 Sep 2015 08:46:28 -0500 Subject: [PATCH 015/138] Logbook read * Change read log routine - file read a line at a time vice entire image into RAM --- src/include/adif_io.h | 2 +- src/logbook/adif_io.cxx | 146 +++++++++++++++++++--------------------- src/logbook/qso_db.cxx | 4 +- 3 files changed, 74 insertions(+), 78 deletions(-) diff --git a/src/include/adif_io.h b/src/include/adif_io.h index ceaf3b72..e168368f 100644 --- a/src/include/adif_io.h +++ b/src/include/adif_io.h @@ -33,7 +33,7 @@ private: bool write_all; cQsoRec *adifqso; FILE *adiFile; - void fillfield(int, char *); + char *fillfield(int, char *); static int instances; public: cAdifIO (); diff --git a/src/logbook/adif_io.cxx b/src/logbook/adif_io.cxx index 5570d669..cff225f2 100644 --- a/src/logbook/adif_io.cxx +++ b/src/logbook/adif_io.cxx @@ -181,12 +181,12 @@ cAdifIO::~cAdifIO() } } -void cAdifIO::fillfield (int fieldnum, char *buff) +char * cAdifIO::fillfield (int fieldnum, char *buff) { char *p1 = strchr(buff, ':'); char *p2 = strchr(buff, '>'); if (!p1 || !p2 || p2 < p1) { - return; // bad ADIF specifier ---> no ':' after field name + return 0; // bad ADIF specifier ---> no ':' after field name } p1++; @@ -205,6 +205,7 @@ void cAdifIO::fillfield (int fieldnum, char *buff) } else { adifqso->putField (fieldnum, p2+1, fldsize); } + return p2 + fldsize + 1; } static void write_rxtext(const char *s) @@ -214,54 +215,14 @@ static void write_rxtext(const char *s) void cAdifIO::do_readfile(const char *fname, cQsoDb *db) { - long filesize = 0; int found; static char szmsg[200]; // open the adif file FILE *adiFile = fopen (fname, "rb"); - if (adiFile == NULL) - return; -// determine its size for buffer creation - fseek (adiFile, 0, SEEK_END); - filesize = ftell (adiFile); - - if (filesize == 0) { - snprintf(szmsg, sizeof(szmsg), _("Empty ADIF logbook file %s"), fname); - REQ(write_rxtext, "\n"); - REQ(write_rxtext, szmsg); - REQ(write_rxtext, "\n"); - LOG_ERROR("%s", szmsg); - return; - } - - char buff[filesize + 1]; - -// read the entire file into the buffer - - fseek (adiFile, 0, SEEK_SET); - int retval = fread (buff, 1, filesize, adiFile); - - fclose (adiFile); - - if (retval != filesize) { - snprintf(szmsg, sizeof(szmsg), _("Error reading %s"), fname); - REQ(write_rxtext, "\n"); - REQ(write_rxtext, szmsg); - REQ(write_rxtext, "\n"); - LOG_ERROR("%s", szmsg); - return; - } - -// relaxed file integrity test to all importing from non conforming log programs - if (strcasestr(buff, "clearDatabase(); + if (adiFile == NULL) { + LOG_ERROR("Could not open %s", fname); return; } @@ -272,36 +233,64 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) clock_gettime(CLOCK_REALTIME, &t0); #endif - char *p1 = buff, *p2; - if (*p1 != '<') { // yes, skip over header to start of records - p1 = strchr(buff, '<'); - while (strncasecmp (p1+1,"EOH>", 4) != 0) { - p1 = strchr(p1+1, '<'); // find next <> field - } - if (!p1) { - snprintf(szmsg, sizeof(szmsg), "Corrupt logbook file: %s", fname); - REQ(write_rxtext, "\n"); - REQ(write_rxtext, szmsg); - REQ(write_rxtext, "\n"); - LOG_ERROR("%s", szmsg); - return; // must not be an ADIF compliant file - } - p1 += 1; + char buff[8192]; + string sbuff; + memset(buff, 0, 8192); + int retnbr = fread(buff, 1, 8192, adiFile); + if (retnbr) sbuff.assign(buff, retnbr); + size_t p = sbuff.find(""); + + if (p == std::string::npos) p = sbuff.find(""); + if (p == std::string::npos) { + return; } - p2 = strchr(p1,'<'); // find first ADIF specifier + sbuff.erase(0, p + 5); +// skip over cr/lf pairs + while (sbuff.length() && (sbuff[0] == '\r' || sbuff[0] == '\n')) + sbuff.erase(0,1); + retnbr = fread(buff, 1, 8192, adiFile); + if (retnbr) sbuff.append(buff, retnbr); - adifqso = 0; - while (p2) { - found = findfield(p2+1); - if (found > -1) { - if (!adifqso) adifqso = db->newrec(); // need new record in db - fillfield (found, p2+1); - } else if (found == -1) { // reached; - adifqso = 0; + p = sbuff.find(""); + if (p == std::string::npos) p = sbuff.find(""); + + char *ptr = 0, *ptr2 = 0; + int recnbr = 0; + + while (p != std::string::npos) { + + ptr = strchr((char *)sbuff.c_str(),'<'); + + adifqso = 0; + while (ptr) { + found = findfield(ptr+1); + if (found > -1) { + if (!adifqso) adifqso = db->newrec(); // need new record in db + ptr2 = fillfield (found, ptr+1); + } else { // reached; + break; + } + if ((ptr2) > 0 && (unsigned)(ptr2 - ptr) <= p) + ptr = strchr(ptr2,'<'); + else + break; // corrupt record + } + recnbr++; + + sbuff.erase(0, p + 5); + while (sbuff.length() && (sbuff[0] == '\r' || sbuff[0] == '\n')) + sbuff.erase(0,1); + + p = sbuff.find(""); + if (p == std::string::npos) p = sbuff.find(""); + if (p == std::string::npos) { + memset(buff, 0, 8192); + retnbr = fread(buff, 1, 8192, adiFile); + if (retnbr) sbuff.append(buff, retnbr); + p = sbuff.find(""); + if (p == std::string::npos) p = sbuff.find(""); } - p1 = p2 + 1; - p2 = strchr(p1,'<'); } #ifdef _POSIX_MONOTONIC_CLOCK @@ -313,10 +302,15 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) t0 = t1 - t0; float t = (t0.tv_sec + t0.tv_nsec/1e9); - snprintf(szmsg, sizeof(szmsg), "\ -Loaded logbook: %s\n\ - %d records in %4.2f seconds", -fname, db->nbrRecs(), t); + if (!feof(adiFile)) + snprintf(szmsg, sizeof(szmsg), "\ +ERROR reading logbook %s\n\ + read %d records in %4.2f seconds", fname, db->nbrRecs(), t); + else + snprintf(szmsg, sizeof(szmsg), "\ +Loaded logbook %s\n\ + read %d records in %4.2f seconds", fname, db->nbrRecs(), t); + REQ(write_rxtext, "\n"); REQ(write_rxtext, szmsg); REQ(write_rxtext, "\n"); @@ -324,6 +318,8 @@ fname, db->nbrRecs(), t); if (db == &qsodb) REQ(adif_read_OK); + + fclose(adiFile); } static const char *adifmt = "<%s:%d>"; @@ -410,7 +406,7 @@ static cQsoDb *adif_db; static cAdifIO *adifIO = 0; -void cAdifIO::readFile (const char *fname, cQsoDb *db) +void cAdifIO::readFile (const char *fname, cQsoDb *db) { ENSURE_THREAD(FLMAIN_TID); diff --git a/src/logbook/qso_db.cxx b/src/logbook/qso_db.cxx index c9cd066d..5641799a 100644 --- a/src/logbook/qso_db.cxx +++ b/src/logbook/qso_db.cxx @@ -300,8 +300,8 @@ istream &operator>> (istream &input, cQsoRec &rec ) { //====================================================================== // class cQsoDb -#define MAXRECS 32768 -#define INCRRECS 8192 +#define MAXRECS 100000 +#define INCRRECS 10000 cQsoDb::cQsoDb() { nbrrecs = 0; From ea189427d4f030239fa5c3efbad2033b9a95e4ae Mon Sep 17 00:00:00 2001 From: David Freese Date: Tue, 15 Sep 2015 09:48:57 -0500 Subject: [PATCH 016/138] IFKP image slant * correct bug in slant correction code --- src/ifkp/ifkp-pic.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifkp/ifkp-pic.cxx b/src/ifkp/ifkp-pic.cxx index d1f332ca..9805b75a 100644 --- a/src/ifkp/ifkp-pic.cxx +++ b/src/ifkp/ifkp-pic.cxx @@ -81,7 +81,7 @@ void ifkp_correct_video() for (int col = 0; col < W; col++) { colptr = ifkp::IMAGEspp*col; for (int rgb = 0; rgb < 3; rgb++) { - index = ratio*(rowptr + colptr + 10*W*rgb); + index = ratio*(rowptr + colptr + ifkp::IMAGEspp*W*rgb); index += RAWSTART - ifkp::IMAGEspp*ifkp_pixelptr; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; From 7cb4c666515003b7e984e3c3b930267e8e655af6 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 16 Sep 2015 08:06:28 -0500 Subject: [PATCH 017/138] ifkp avatar depth * Added code to support variable image depth in png source file --- src/ifkp/ifkp-pic.cxx | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/ifkp/ifkp-pic.cxx b/src/ifkp/ifkp-pic.cxx index 9805b75a..6d29a30b 100644 --- a/src/ifkp/ifkp-pic.cxx +++ b/src/ifkp/ifkp-pic.cxx @@ -594,12 +594,10 @@ int ifkp_print_time_left(float time_sec, char *str, size_t len, #include "tux.cxx" static Fl_Shared_Image *shared_avatar_img = (Fl_Shared_Image *)0; - static unsigned char *avatar_img = (unsigned char *)0; - static Fl_Shared_Image *my_avatar_img = (Fl_Shared_Image *)0; - static int avatar_phase_correction = 0; +static unsigned char avatar[59 * 74 * 3]; void ifkp_clear_avatar() { @@ -742,7 +740,9 @@ void ifkp_update_avatar(unsigned char data, int pos) int ifkp_get_avatar_pixel(int pos, int color) { - return (int)my_avatar_img->data()[0][3*pos + color]; // color = {RED, GREEN, BLUE} +// color = {RED, GREEN, BLUE} + return (int)avatar[3*pos + color]; + } // ADD CALLBACK HANDLING OF PHASE CORRECTIONS @@ -769,8 +769,29 @@ void cb_ifkp_send_avatar( Fl_Widget *w, void *) fname.append(mycall).append(".png"); my_avatar_img = Fl_Shared_Image::get(fname.c_str(), 59, 74); - if (!my_avatar_img) return; + unsigned char *img_data = (unsigned char *)my_avatar_img->data()[0]; + memset(avatar, 0, sizeof(avatar)); + int D = my_avatar_img->d(); + + if (D == 3) + memcpy(avatar, img_data, 59*74*3); + else if (D == 4) { + int i, j, k; + for (i = 0; i < 59*74; i++) { + j = i*3; k = i*4; + avatar[j] = img_data[k]; + avatar[j+1] = img_data[k+1]; + avatar[j+2] = img_data[k+2]; + } + } else if (D == 1) { + int i, j; + for (i = 0; i < 59*74; i++) { + j = i * 3; + avatar[j] = avatar[j+1] = avatar[j+2] = img_data[i]; + } + } else + return; string picmode = "\npic%A\n^r"; ifkp_tx_text->add(picmode.c_str()); From 838e11237e1085fa38aaa1b9cbc861890ea80327 Mon Sep 17 00:00:00 2001 From: David Freese Date: Fri, 18 Sep 2015 15:23:31 -0500 Subject: [PATCH 018/138] WFALL-ONLY * fixes for wfall-only operation (N1MM) --- src/dialogs/fl_digi.cxx | 50 ++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index d40caf88..27f8d654 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -1140,17 +1140,17 @@ void startup_modem(modem* m, int f) } center_group->redraw(); } - } - if (id == MODE_IFKP && !ifkp_avatar->visible()) { - QsoInfoFrame2->size(QsoInfoFrame2->w() - 60, QsoInfoFrame2->h()); - ifkp_load_avatar(inpCall->value()); - ifkp_avatar->show(); - ifkp_avatar->redraw(); - QsoInfoFrame->redraw(); - } else if (id != MODE_IFKP && ifkp_avatar->visible()) { - QsoInfoFrame2->size(QsoInfoFrame2->w() + 60, QsoInfoFrame2->h()); - ifkp_avatar->hide(); - QsoInfoFrame->redraw(); + if (id == MODE_IFKP && !ifkp_avatar->visible()) { + QsoInfoFrame2->size(QsoInfoFrame2->w() - 60, QsoInfoFrame2->h()); + ifkp_load_avatar(inpCall->value()); + ifkp_avatar->show(); + ifkp_avatar->redraw(); + QsoInfoFrame->redraw(); + } else if (id != MODE_IFKP && ifkp_avatar->visible()) { + QsoInfoFrame2->size(QsoInfoFrame2->w() + 60, QsoInfoFrame2->h()); + ifkp_avatar->hide(); + QsoInfoFrame->redraw(); + } } if (id == MODE_RTTY) { @@ -1360,6 +1360,23 @@ void update_scope() void init_modem(trx_mode mode, int freq) { ENSURE_THREAD(FLMAIN_TID); + + if (bWF_only) + if (mode == MODE_FSQ || + mode == MODE_IFKP || + mode == MODE_FELDHELL || + mode == MODE_SLOWHELL || + mode == MODE_HELLX5 || + mode == MODE_HELLX9 || + mode == MODE_FSKHELL || + mode == MODE_FSKH105 || + mode == MODE_HELL80 || + mode == MODE_WEFAX_576 || + mode == MODE_WEFAX_288 || + mode == MODE_NAVTEX || + mode == MODE_SITORB ) + mode = MODE_PSK31; + stopMacroTimer(); if (data_io_enabled == KISS_IO) { @@ -6875,16 +6892,6 @@ static Fl_Menu_Item alt_menu_[] = { { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, -{"WEFAX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, -{ mode_info[MODE_WEFAX_576].name, 0, cb_init_mode, (void *)MODE_WEFAX_576, 0, FL_NORMAL_LABEL, 0, 14, 0}, -{ mode_info[MODE_WEFAX_288].name, 0, cb_init_mode, (void *)MODE_WEFAX_288, 0, FL_NORMAL_LABEL, 0, 14, 0}, -{0,0,0,0,0,0,0,0,0}, - -{"Navtex/SitorB", 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, -{ mode_info[MODE_NAVTEX].name, 0, cb_init_mode, (void *)MODE_NAVTEX, 0, FL_NORMAL_LABEL, 0, 14, 0}, -{ mode_info[MODE_SITORB].name, 0, cb_init_mode, (void *)MODE_SITORB, 0, FL_NORMAL_LABEL, 0, 14, 0}, -{0,0,0,0,0,0,0,0,0}, - { mode_info[MODE_WWV].name, 0, cb_init_mode, (void *)MODE_WWV, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FFTSCAN].name, 0, cb_init_mode, (void *)MODE_FFTSCAN, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_ANALYSIS].name, 0, cb_init_mode, (void *)MODE_ANALYSIS, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, @@ -6961,6 +6968,7 @@ void noop_controls() // create and then hide all controls not being used qso_opMODE = new Fl_ComboBox(defwidget); qso_opMODE->hide(); qso_opBW = new Fl_ComboBox(defwidget); qso_opBW->hide(); qso_opPICK = new Fl_Button(defwidget); qso_opPICK->hide(); + qso_opGROUP = new Fl_Group(defwidget); qso_opGROUP->hide(); inpFreq = new Fl_Input2(defwidget); inpFreq->hide(); inpTimeOff = new Fl_Input2(defwidget); inpTimeOff->hide(); From 0caa5ea1e19b36ce1a4ebdc35a76db72c33e4cf6 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sat, 19 Sep 2015 06:32:36 -0500 Subject: [PATCH 019/138] PA debug --- src/include/soundconf.h | 2 ++ src/main.cxx | 3 +++ src/misc/debug.cxx | 8 +++++--- src/soundcard/soundconf.cxx | 27 ++++++++++++++++++--------- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/include/soundconf.h b/src/include/soundconf.h index d0459649..fa8d957e 100644 --- a/src/include/soundconf.h +++ b/src/include/soundconf.h @@ -48,7 +48,9 @@ void sound_close(void); void sound_update(unsigned idx); #include + class Fl_Choice; int pa_set_dev(Fl_Choice *choice, std::string dev_name, int dev_index); +extern std::string str_pa_devices; #endif // SOUNDCONF_H diff --git a/src/main.cxx b/src/main.cxx index 4367b8ae..0aead6ac 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -351,6 +351,9 @@ void delayed_startup(void *) if (progdefaults.check_for_updates) cb_mnuCheckUpdate((Fl_Widget *)0, NULL); +#if USE_PORTAUDIO + LOG_INFO("%s", str_pa_devices.c_str()); +#endif } int main(int argc, char ** argv) diff --git a/src/misc/debug.cxx b/src/misc/debug.cxx index 3020b604..d8faed84 100644 --- a/src/misc/debug.cxx +++ b/src/misc/debug.cxx @@ -135,7 +135,7 @@ void debug::start(const char* filename) rotate_log(filename); inst = new debug(filename); - window = new Fl_Double_Window(600, 200, _("Event log")); + window = new Fl_Double_Window(800, 400, _("Event log")); window->xclass(PACKAGE_TARNAME); int pad = 2; @@ -266,6 +266,7 @@ void debug::elog(const char* func, const char* srcf, int line, const char* text) void debug::show(void) { + btext->bottomline(btext->size()); window->show(); } @@ -290,8 +291,9 @@ void debug::sync_text(void* arg) linebuf += '\n'; size_t p1 = 0, p2 = linebuf.find("\n"); while( p2 != string::npos) { - btext->insert(1, linebuf.substr(p1, p2 - p1).c_str()); - dbg_buffer.append(linebuf.substr(p1, p2 - p1)).append("\n"); + btext->add(linebuf.substr(p1, p2 - p1).c_str()); + btext->redraw(); + dbg_buffer.append(linebuf.substr(p1, p2 - p1 + 1));//.append("\n"); p1 = p2 + 1; p2 = linebuf.find("\n", p1); } diff --git a/src/soundcard/soundconf.cxx b/src/soundcard/soundconf.cxx index f43d4948..850aea38 100644 --- a/src/soundcard/soundconf.cxx +++ b/src/soundcard/soundconf.cxx @@ -118,15 +118,18 @@ ret_def: #include +std::string str_pa_devices; + static void init_portaudio(void) { try { SoundPort::initialize(); } catch (const SndException& e) { - if (e.error() == ENODEV) // don't complain if there are no devices - return; - LOG_ERROR("%s", e.what()); +// if (e.error() == ENODEV) // don't complain if there are no devices +// return; + str_pa_devices.assign("\nPortaudio devices init failure:"); + str_pa_devices.assign(e.what()); AudioPort->deactivate(); btnAudioIO[SND_IDX_PORT]->deactivate(); if (progdefaults.btnAudioIOis == SND_IDX_PORT) @@ -150,12 +153,16 @@ static void init_portaudio(void) #endif list devlist; + int devnbr = 0; for (SoundPort::device_iterator idev = SoundPort::devices().begin(); - idev != SoundPort::devices().end(); ++idev) + idev != SoundPort::devices().end(); ++idev) { devlist.push_back( padev(*idev, idev - SoundPort::devices().begin(), Pa_GetHostApiInfo((*idev)->hostApi)->type) ); + devnbr++; + } devlist.sort(); + str_pa_devices.assign("\nPortaudio devices:\n"); PaHostApiTypeId first_api = devlist.begin()->api; for (list::const_iterator ilist = devlist.begin(); ilist != devlist.end(); ilist++) { @@ -166,22 +173,24 @@ static void init_portaudio(void) i = menu_item.length(); } menu_item.append(ilist->dev->name); + + str_pa_devices.append(menu_item).append("\n"); + // backslash-escape any slashes in the device name while ((i = menu_item.find('/', i)) != string::npos) { menu_item.insert(i, 1, '\\'); i += 2; } + // add to menu - if (ilist->dev->maxInputChannels > 0) { + if (ilist->dev->maxInputChannels > 0) menuPortInDev->add(menu_item.c_str(), 0, NULL, reinterpret_cast(ilist->idx), 0); - } - if (ilist->dev->maxOutputChannels > 0) { + if (ilist->dev->maxOutputChannels > 0) menuPortOutDev->add(menu_item.c_str(), 0, NULL, reinterpret_cast(ilist->idx), 0); -LOG_INFO("%s", menu_item.c_str()); - } + } if (progdefaults.PortInDevice.length() == 0) { From 8ad0a8b3f7e4a2ef6a9f92b8685ad0c85f53460f Mon Sep 17 00:00:00 2001 From: David Freese Date: Tue, 22 Sep 2015 08:35:27 -0500 Subject: [PATCH 020/138] WX configure * corrected inchs mercury to Hg vice Mg --- src/dialogs/confdialog.cxx | 2 +- src/dialogs/confdialog.fl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index 3a75d87b..c417fc9b 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -10899,7 +10899,7 @@ earch for station name")); btn_wx_kph->callback((Fl_Callback*)cb_btn_wx_kph); o->value(progdefaults.wx_kph); } // Fl_Check_Button* btn_wx_kph - { Fl_Check_Button* o = btn_wx_inches = new Fl_Check_Button(258, 298, 70, 15, _("Inches Mg.")); + { Fl_Check_Button* o = btn_wx_inches = new Fl_Check_Button(258, 298, 70, 15, _("Inches Hg.")); btn_wx_inches->tooltip(_("report inches mercury")); btn_wx_inches->down_box(FL_DOWN_BOX); btn_wx_inches->callback((Fl_Callback*)cb_btn_wx_inches); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 81e2efa5..15ed1071 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -6174,7 +6174,7 @@ progdefaults.changed = true;} code0 {o->value(progdefaults.wx_kph);} } Fl_Check_Button btn_wx_inches { - label {Inches Mg.} + label {Inches Hg.} callback {progdefaults.wx_inches=o->value(); progdefaults.changed = true;} tooltip {report inches mercury} xywh {258 298 70 15} down_box DOWN_BOX From d5574e28d475f41b9e76b07384c4ee69f8357dd8 Mon Sep 17 00:00:00 2001 From: David Freese Date: Tue, 22 Sep 2015 14:40:44 -0500 Subject: [PATCH 021/138] Version 3.23.01 * Maintenance release --- ChangeLog | 14 ++++++++++++-- configure.ac | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index bd787cea..e56833e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,19 @@ +=Version 3.23.01= + +2015-09-22 David Freese + + 8ad0a8b: WX configure + 0caa5ea: PA debug + 838e112: WFALL-ONLY + f472a17: Logbook read + 7cb4c66: ifkp avatar depth + ea18942: IFKP image slant + + =Version 3.23.00= -2015-09-13 David Freese - f78aa38: Clear Tx Panel cbff7c3: Olivia/Contestia start stop tones 37175e2: macro bug diff --git a/configure.ac b/configure.ac index 9eb693c7..358a14f6 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) m4_define(FLDIGI_MINOR, [23]) -m4_define(FLDIGI_PATCH, [.00]) +m4_define(FLDIGI_PATCH, [.01]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.5]) From f75b92a76c9979d74a9ac841887fcec2944c8d4f Mon Sep 17 00:00:00 2001 From: Kamal Mostafa Date: Wed, 23 Sep 2015 16:41:17 -0500 Subject: [PATCH 022/138] asciidoc timezone * Run asciidoc with TZ=0 to make the footer datestamp independent of the build machine's timezone (for reproducible builds). --- doc/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/Makefile.am b/doc/Makefile.am index 8a6feb3c..18181508 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -36,7 +36,7 @@ endif %.1: $$@.txt $(ASCIIDOC_CONF) if HAVE_ASCIIDOC - $(call silent,ADOC ,$@)$(A2X) $(A2X_ARGS) $< + $(call silent,ADOC ,$@)TZ=0 $(A2X) $(A2X_ARGS) $< else $(call silent,ADOC ,$@)echo '.TH "NOT-BUILT" "1" "" "" ""' > $@ endif @@ -62,7 +62,7 @@ ASCIIDOC_ARGS = --unsafe -a toc -a data-uri -a badges -a icons -a iconsdir=$(ASC echo " *** make ASCIIDOC_ICONS_DIR=/path/to/icons" >&2; \ false; \ fi - $(call silent,ADOC ,$@)$(ASCIIDOC) $(ASCIIDOC_ARGS) --out-file $@ $< + $(call silent,ADOC ,$@)TZ=0 $(ASCIIDOC) $(ASCIIDOC_ARGS) --out-file $@ $< all-local: $(ASCIIDOC_MAN_DIST) $(ASCIIDOC_HTML) From e6ebe70854b45269bd7a012660075bbdc2b870c8 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 23 Sep 2015 16:42:22 -0500 Subject: [PATCH 023/138] OS-X serial * Change discovery code for OS X serial devices --- src/misc/configuration.cxx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/misc/configuration.cxx b/src/misc/configuration.cxx index 0092a9f5..70834ecf 100644 --- a/src/misc/configuration.cxx +++ b/src/misc/configuration.cxx @@ -929,11 +929,19 @@ void configuration::testCommPorts() glob_t gbuf; glob(tty_fmt[i], 0, NULL, &gbuf); for (size_t j = 0; j < gbuf.gl_pathc; j++) { - if ( !(stat(gbuf.gl_pathv[j], &st) == 0 && S_ISCHR(st.st_mode)) || - strstr(gbuf.gl_pathv[j], "modem") ) + int ret1 = !stat(gbuf.gl_pathv[j], &st); + int ret2 = S_ISCHR(st.st_mode); + if (ret1) { + LOG_INFO("Serial port %s", gbuf.gl_pathv[j]); + LOG_INFO(" device mode: %X", st.st_mode); + LOG_INFO(" char device? %s", ret2 ? "Y" : "N"); + } else + LOG_INFO("%s does not return stat query", gbuf.gl_pathv[j]); + + if ( (ret1 && ret2 ) || strstr(gbuf.gl_pathv[j], "modem") ) + inpTTYdev->add(gbuf.gl_pathv[j]); + else continue; - LOG_VERBOSE("Found serial port %s", gbuf.gl_pathv[j]); - inpTTYdev->add(gbuf.gl_pathv[j]); # if USE_HAMLIB inpRIGdev->add(gbuf.gl_pathv[j]); # endif From d47b1e355088e9818549330c7ec1d1ddd41d5beb Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 24 Sep 2015 15:28:59 -0500 Subject: [PATCH 024/138] rigcat delayed startup * Add definable delay to allow serial devices based on Arduino to not lock up in programming mode. --- fldigi_doxygen/user_src_docs/rigxml.txt | 5 +++++ src/include/rigxml.h | 2 ++ src/rigcontrol/rigio.cxx | 11 +++++++++++ src/rigcontrol/rigxml.cxx | 9 +++++++++ 4 files changed, 27 insertions(+) diff --git a/fldigi_doxygen/user_src_docs/rigxml.txt b/fldigi_doxygen/user_src_docs/rigxml.txt index 9c9bd075..d846a32f 100644 --- a/fldigi_doxygen/user_src_docs/rigxml.txt +++ b/fldigi_doxygen/user_src_docs/rigxml.txt @@ -138,6 +138,11 @@ default settings for initial setup BOOL = true, false; use command string for PTT (not supported by all rigs)
    + + \nnn\ + nnnn in milliseconds, used for correct startup of K9MJ CI-V router
    + +
    diff --git a/src/include/rigxml.h b/src/include/rigxml.h index c13c2301..72339f23 100644 --- a/src/include/rigxml.h +++ b/src/include/rigxml.h @@ -99,6 +99,7 @@ struct XMLRIG { bool restore_tio; int write_delay; int init_delay; + int wait_for_device; int post_write_delay; int timeout; int retries; @@ -120,6 +121,7 @@ struct XMLRIG { vsp = false; write_delay = 0; init_delay = 0; + wait_for_device = 0; post_write_delay = 50; timeout = 200; retries = 5; diff --git a/src/rigcontrol/rigio.cxx b/src/rigcontrol/rigio.cxx index 18ecb4e2..42a6500f 100644 --- a/src/rigcontrol/rigio.cxx +++ b/src/rigcontrol/rigio.cxx @@ -1054,6 +1054,7 @@ void rigCAT_defaults() cntRigCatTimeout->value(xmlrig.timeout); cntRigCatWait->value(xmlrig.write_delay); cntRigCatInitDelay->value(xmlrig.init_delay); +// cntRigCatWaitForDevice->value(xmlrig.wait_for_device); btnRigCatEcho->value(xmlrig.echo); btnRigCatCMDptt->value(xmlrig.cmdptt); chkRigCatVSP->value(xmlrig.vsp); @@ -1074,6 +1075,7 @@ void rigCAT_restore_defaults() cntRigCatTimeout->value(progdefaults.RigCatTimeout); cntRigCatWait->value(progdefaults.RigCatWait); cntRigCatInitDelay->value(progdefaults.RigCatInitDelay); +// cntRigCatWaitForDevice->value(progdefaults.RicCatWaitForDevice); btnRigCatEcho->value(progdefaults.RigCatECHO); btnRigCatCMDptt->value(progdefaults.RigCatCMDptt); chkRigCatVSP->value(progdefaults.RigCatVSP); @@ -1162,6 +1164,15 @@ echo : %c\n", sRigMode = ""; sRigWidth = ""; + if (xmlrig.wait_for_device) { + int delay = xmlrig.wait_for_device / 10; + while (delay) { + MilliSleep(10); + if (delay % 10) Fl::awake(); + delay--; + } + } + nonCATrig = false; rigCAT_sendINIT("INIT", progdefaults.RigCatInitDelay); diff --git a/src/rigcontrol/rigxml.cxx b/src/rigcontrol/rigxml.cxx index 944c7f37..3929bb28 100644 --- a/src/rigcontrol/rigxml.cxx +++ b/src/rigcontrol/rigxml.cxx @@ -65,6 +65,7 @@ void parseDISCARD(size_t &); void parseWRITE_DELAY(size_t &); void parseINIT_DELAY(size_t &); +void parseWAIT_FOR_DEVICE(size_t &); void parsePOST_WRITE_DELAY(size_t &); void parseRETRIES(size_t &); void parseTIMEOUT(size_t &); @@ -145,6 +146,7 @@ TAGS rigdeftags[] = { {" Date: Fri, 25 Sep 2015 07:14:46 -0500 Subject: [PATCH 025/138] FSQ directive * Corrected text parser to accept multiple directed calls - w1hkj:efk2lbm w3fqn ka2cbc good morning all will now correctly accept k2lbm, w3fqn and ka2cbc as directed and display correctly in Rx text panel --- src/fsq/fsq.cxx | 135 ++++++++++++++++++++++++++++------------------ src/include/fsq.h | 2 +- 2 files changed, 83 insertions(+), 54 deletions(-) diff --git a/src/fsq/fsq.cxx b/src/fsq/fsq.cxx index 81d296e5..582ce905 100644 --- a/src/fsq/fsq.cxx +++ b/src/fsq/fsq.cxx @@ -344,21 +344,28 @@ static string cqcqcq = "cqcqcq"; static fre_t call("([[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+)", REG_EXTENDED); -bool fsq::valid_callsign(std::string s) -{ - if (s.length() < 3) return false; - if (s.length() > 20) return false; -// if (s.find(' ') != std::string::npos) return false; +// test for valid callsign +// returns: +// 0 - not a callsign +// 1 - mycall +// 2 - allcall +// 4 - cqcqcq +// 8 - any other valid call - if (s == allcall) return true; - if (s == cqcqcq) return true; - if (s == mycall) return true; +int fsq::valid_callsign(std::string s) +{ + if (s.length() < 3) return 0; + if (s.length() > 20) return 0; + + if (s == allcall) return 2; + if (s == cqcqcq) return 4; + if (s == mycall) return 1; static char sz[21]; memset(sz, 0, 21); strcpy(sz, s.c_str()); bool matches = call.match(sz); - return matches; + return (matches ? 8 : 0); } void fsq::parse_rx_text() @@ -431,22 +438,44 @@ void fsq::parse_rx_text() bool all = false; bool directed = false; - p = 0; +// test next word in string + size_t tr_pos = 0; + char tr = rx_text[tr_pos]; + size_t trigger = triggers.find(tr); +// strip any leading spaces before either text or first directed callsign + while (rx_text.length() > 1 && + triggers.find(rx_text[0]) != std::string::npos) + rx_text.erase(0,1); +// find first word + while ( tr_pos < rx_text.length() + && ((trigger = triggers.find(rx_text[tr_pos])) == std::string::npos) ) { + tr_pos++; + } - if (rx_text.find(allcall) == 0) { - all = true; - rx_text.erase(0, 7); - } - else if (rx_text.find(cqcqcq) == 0) { - all = true; - rx_text.erase(0,6); - } -// this next test does not allow for :othercall mycall othercallT where T is trigger -// only :mycallT -// but it does provide for the MONITOR of the transmission in next test - else if (rx_text.find(mycall) == 0) { - directed = true; - rx_text.erase(0, mycall.length()); + while (trigger != std::string::npos && tr_pos < rx_text.length()) { + int word_is = valid_callsign(rx_text.substr(0, tr_pos)); + + if (word_is == 0) break; // not a callsign + if (word_is == 1) directed = true; // mycall + // test for cqcqcq and allcall + else if (word_is != 8) all = true; + + rx_text.erase(0, tr_pos); + while (rx_text.length() > 2 && + triggers.find(rx_text[0]) != std::string::npos && + triggers.find(rx_text[1]) != std::string::npos) + rx_text.erase(0,1); + + if (rx_text[0] != ' ') break; + rx_text.erase(0, 1); + tr_pos = 0; + tr = rx_text[tr_pos]; + trigger = triggers.find(tr); + while ( tr_pos < rx_text.length() && (trigger == std::string::npos) ) { + tr_pos++; + tr = rx_text[tr_pos]; + trigger = triggers.find(tr); + } } if ( (all == false) && (directed == false)) { @@ -454,14 +483,14 @@ void fsq::parse_rx_text() return; } -// remove eot - rx_text.erase(rx_text.length() - 3); +// remove eot if present + if (rx_text.length() > 3) rx_text.erase(rx_text.length() - 3); toprint.assign(station_calling).append(":"); // test for trigger - char tr = rx_text[0]; - size_t trigger = triggers.find(tr); + tr = rx_text[0]; + trigger = triggers.find(tr); if (trigger == NIT) { tr = ' '; // force to be text line @@ -476,38 +505,38 @@ void fsq::parse_rx_text() return; } +// now process own call triggers + if (directed) { + switch (tr) { + case ' ': parse_space(false); break; + case '?': parse_qmark(); break; + case '*': parse_star(); break; + case '+': parse_plus(); break; + case '-': break;//parse_minus(); break; + case ';': parse_relay(); break; + case '!': parse_repeat(); break; + case '~': parse_delayed_repeat(); break; + case '#': parse_pound(); break; + case '$': parse_dollar(); break; + case '@': parse_at(); break; + case '&': parse_amp(); break; + case '^': parse_carat(); break; + case '%': parse_pcnt(); break; + case '|': parse_vline(); break; + case '>': parse_greater(); break; + case '<': parse_less(); break; + case '[': parse_relayed(); break; + } + } + // if allcall; only respond to the ' ', '*', '#', and '%' triggers - if (all) { + else { switch (tr) { case ' ': parse_space(true); break; case '*': parse_star(); break; case '#': parse_pound(); break; case '%': parse_pcnt(); break; } - rx_text.clear(); - return; - } - -// now process own call triggers - switch (tr) { - case ' ': parse_space(false); break; - case '?': parse_qmark(); break; - case '*': parse_star(); break; - case '+': parse_plus(); break; - case '-': break;//parse_minus(); break; - case ';': parse_relay(); break; - case '!': parse_repeat(); break; - case '~': parse_delayed_repeat(); break; - case '#': parse_pound(); break; - case '$': parse_dollar(); break; - case '@': parse_at(); break; - case '&': parse_amp(); break; - case '^': parse_carat(); break; - case '%': parse_pcnt(); break; - case '|': parse_vline(); break; - case '>': parse_greater(); break; - case '<': parse_less(); break; - case '[': parse_relayed(); break; } rx_text.clear(); diff --git a/src/include/fsq.h b/src/include/fsq.h index db6b9e1b..353c1e72 100644 --- a/src/include/fsq.h +++ b/src/include/fsq.h @@ -88,7 +88,7 @@ protected: char szestimate[40]; std::string rx_text; std::string toprint; - bool valid_callsign(std::string s); + int valid_callsign(std::string s); void parse_rx_text(); void parse_space(bool); void parse_qmark(std::string relay = ""); From 198c5a01b50be0044d15a9311b869158e90eaa52 Mon Sep 17 00:00:00 2001 From: David Freese Date: Fri, 25 Sep 2015 15:33:43 -0500 Subject: [PATCH 026/138] fsq sounder/heard-aging * Increased allowable intervals for both sounder and heard-aging * Corrected repeated sounder to re-enable retries after a successful sounding. - sounder will wait until rx/tx state is RX - if Rx squelch is open then sounder will retry in 10 seconds. Retry is repeated 10x before sounding is rescheduled for next interval. --- src/dialogs/confdialog.cxx | 4 ++-- src/dialogs/confdialog.fl | 6 +++--- src/dialogs/fl_digi.cxx | 3 +++ src/fsq/fsq.cxx | 2 ++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index c417fc9b..b9a899c2 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -8233,7 +8233,7 @@ i on a\ntouch screen device such as a tablet.")); sel_fsq_heard_aging->tooltip(_("Remove call after ...")); sel_fsq_heard_aging->down_box(FL_BORDER_BOX); sel_fsq_heard_aging->callback((Fl_Callback*)cb_sel_fsq_heard_aging); - o->add("Never"); o->add("1 min"); o->add("5 min");o->add("10 min"); o->add("20 min"); o->add("20 min"); + o->add("Never"); o->add("1 min"); o->add("5 min");o->add("10 min"); o->add("20 min"); o->add("20 min"); o->add("30 min"); o->add("60 min"); o->add("90 min"); o->add("120 min"); o->value(progdefaults.fsq_heard_aging); } // Fl_Choice* sel_fsq_heard_aging o->end(); @@ -8273,7 +8273,7 @@ i on a\ntouch screen device such as a tablet.")); sel_fsq_sounder->tooltip(_("Send beacon every ...")); sel_fsq_sounder->down_box(FL_BORDER_BOX); sel_fsq_sounder->callback((Fl_Callback*)cb_sel_fsq_sounder); - o->add("OFF"); o->add("1 min"); o->add("10 min"); o->add("30 min"); + o->add("OFF"); o->add("1 min"); o->add("10 min"); o->add("30 min"); o->add("60 min"); o->value(progdefaults.fsq_sounder); } // Fl_Choice* sel_fsq_sounder { Fl_Check_Button* o = btn_fsq_lowercase = new Fl_Check_Button(366, 166, 214, 15, _("MYCALL always lower case")); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 15ed1071..9032192f 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -359,7 +359,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} Fl_Window {} { label {Fldigi configuration} open - xywh {677 32 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible + xywh {434 227 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible } { Fl_Tabs tabsConfigure {open xywh {0 0 600 380} color 50 selection_color 50 @@ -3475,7 +3475,7 @@ progdefaults.changed = true;} callback {progdefaults.fsq_heard_aging=o->value(); progdefaults.changed = true;} open tooltip {Remove call after ...} xywh {433 94 102 22} down_box BORDER_BOX - code0 {o->add("Never"); o->add("1 min"); o->add("5 min");o->add("10 min"); o->add("20 min"); o->add("20 min");} + code0 {o->add("Never"); o->add("1 min"); o->add("5 min");o->add("10 min"); o->add("20 min"); o->add("20 min"); o->add("30 min"); o->add("60 min"); o->add("90 min"); o->add("120 min");} code1 {o->value(progdefaults.fsq_heard_aging);} } {} } @@ -3544,7 +3544,7 @@ progdefaults.changed = true;} open callback {progdefaults.fsq_sounder=o->value(); progdefaults.changed = true;} open tooltip {Send beacon every ...} xywh {80 163 100 22} down_box BORDER_BOX - code0 {o->add("OFF"); o->add("1 min"); o->add("10 min"); o->add("30 min");} + code0 {o->add("OFF"); o->add("1 min"); o->add("10 min"); o->add("30 min"); o->add("60 min");} code1 {o->value(progdefaults.fsq_sounder);} } {} Fl_Check_Button btn_fsq_lowercase { diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 27f8d654..fea6ae50 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -8915,6 +8915,9 @@ void age_heard_list() case 3: aging_secs = 600; break; // 10 minutes case 4: aging_secs = 1200; break; // 20 minutes case 5: aging_secs = 1800; break; // 30 minutes + case 6: aging_secs = 3600; break; // 60 minutes + case 7: aging_secs = 5400; break; // 90 minutes + case 8: aging_secs = 7200; break; // 120 minutes case 0: default: return; // no aging } diff --git a/src/fsq/fsq.cxx b/src/fsq/fsq.cxx index 582ce905..7bdf4574 100644 --- a/src/fsq/fsq.cxx +++ b/src/fsq/fsq.cxx @@ -1681,6 +1681,7 @@ void sounder(void *) Fl::repeat_timeout(10, sounder); // retry in 10 seconds return; } + sounder_tries = 10; std::string xmtstr = FSQBOL; xmtstr.append(active_modem->fsq_mycall()).append(":").append(FSQEOT); int numsymbols = xmtstr.length(); @@ -1726,6 +1727,7 @@ void fsq::start_sounder(int interval) case 1: sounder_secs = 60; break; // 1 minute case 2: sounder_secs = 600; break; // 10 minutes case 3: sounder_secs = 1800; break; // 30 minutes + case 4: sounder_secs = 3600; break; // 60 minutes default: sounder_secs = 600; } REQ(fsq_start_sounder); From 04247643e6dbb750b9f13341704a94552ce82745 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sat, 26 Sep 2015 08:38:08 -0500 Subject: [PATCH 027/138] fsq cqcqcq * added cqcqcq button - casual users do not know to send cqcqcq vice cq cq cq * Updated on-line help --- fldigi_doxygen/images/fsq-directed-mode.png | Bin 2925 -> 3180 bytes fldigi_doxygen/images/fsq-main-dialog.png | Bin 7111 -> 8521 bytes fldigi_doxygen/images/fsq-mon-dialog.png | Bin 18281 -> 25678 bytes fldigi_doxygen/images/fsq-s2n.png | Bin 4256 -> 3236 bytes fldigi_doxygen/images/fsq-undirected-mode.png | Bin 3671 -> 3357 bytes fldigi_doxygen/user_src_docs/FSQ.txt | 32 ++++++++++--- src/dialogs/fl_digi.cxx | 44 ++++++++++++------ src/include/fl_digi.h | 1 + 8 files changed, 56 insertions(+), 21 deletions(-) diff --git a/fldigi_doxygen/images/fsq-directed-mode.png b/fldigi_doxygen/images/fsq-directed-mode.png index 811b77ec29981a06149bac7d85a666e839cc9afc..fa22b779fabe1241df43b138e02de3600c7ce237 100644 GIT binary patch literal 3180 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 XLWs~gVV@Oq00000NkvXXu0mjfFbtzN diff --git a/fldigi_doxygen/images/fsq-main-dialog.png b/fldigi_doxygen/images/fsq-main-dialog.png index a12237b5cc781020162cf9e02758df5b6bec4c84..ddddef7fb9d0505eb5021266122ea44c4ffea38a 100644 GIT binary patch literal 8521 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 WE$lxPTs#2fAX;jAszrCLU;RIA28`zb literal 7111 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 BZSDX7 diff --git a/fldigi_doxygen/images/fsq-mon-dialog.png b/fldigi_doxygen/images/fsq-mon-dialog.png index 5d224a8e858dff61839c0872b67c90eb4f31400e..1c5fd17858938cbe07c06271964da2329036a0d3 100644 GIT binary patch literal 25678 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

    7qJ=7Las5>~s zr9C(#mA>8zE)Vf8?_WYa=b^T1@leB|VE?JZB7t`8eCBZ|fB6*ZQlehk)<@c8joVlp z=ZT3RG#phDkn9D?H#maBoQh*x!gACh>=@_)P&5#!V^nGD3QlvDV&H!UT%)#z1I{D% z1zj99SSDiLYz%yrDK~mJAY>)# zsO+<4wrM)DG?+Y@Ytyuc?!ITlOhd>GUv`x~vL_@T%MC{YO*#!VT~)O5gUA05GwEEe literal 18281 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%0D$6Y(RbfB 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 diff --git a/fldigi_doxygen/user_src_docs/FSQ.txt b/fldigi_doxygen/user_src_docs/FSQ.txt index 6611426b..64ce7222 100644 --- a/fldigi_doxygen/user_src_docs/FSQ.txt +++ b/fldigi_doxygen/user_src_docs/FSQ.txt @@ -73,10 +73,22 @@ the directed station callsign is your own or "allcall". FSQ is case sensitive, and your sending case must match the senders case, i.e. w1hkj and W1HKJ are not the same for the purposes of FSQ Directed Mode. -fldigi-FSQ is active and will respond to directed triggers when the SELCAL button is lit. -Toggling the SELCAL button to "sleep" causes the FSQ parser to only respond to the * -trigger. When the * trigger is received the program will return to -the active SELCAL state. +

      +
    • FSQ-ON
      + when on the xmt and rcv are in FSQ directed mode
      + when off the xmt and rcv are in FSQ undirected mode
    • +
    • ACTIVE
      + when on the decoder will accept all incoming directed traffic
      + when off the decocer will only respond to the wake-up * trigger
    • +
    • MON
      + when on the monitor panel is visible
    • +
    • QTH
      + appends the myQTH text to the tx panel
    • +
    • QTC
      + appends the myQTC text to the tx panel
    • +
    • CQ
      + sends the FSQ cq call 'cqcqcq'
    • +
    \image html fsq-heard-list.png "Heard List Panel" @@ -86,6 +98,8 @@ the active SELCAL state. The "Heard" list displays the callsign, s/n, and time of reception of all correctly decoded transmissions. +NOTE: fldigi function keys are inoperative in the FSQ mode! +
    \section coding_and_modulation Modulation Scheme @@ -268,11 +282,11 @@ Directed Mode. In Directed Mode, only text directed to your callsign will print in the Rx panel, and only commands directed to your station will be responded to.
    -\image html fsq-mon-dialog.png "FSQ Monitor Panel - a Directed Mode Sentence" -\image latex fsq-mon-dialog.png "FSQ Monitor Panel - a Directed Mode Sentence" width=3.5in +\image html fsq-mon-dialog.png "FSQ Monitor Panel" +\image latex fsq-mon-dialog.png "FSQ Monitor Panel" width=3.5in
    -The Monitor Panel is only shown during Directed Mode operation. It is minimized +The Monitor Panel is only shown during Directed Mode operation. It is hidden when Undirected Mode is in use. All incoming traffic is printed on the Monitor Panel. This includes both Directed and Undirected traffic. The decoding is affected by the fldigi squelch setting. @@ -287,6 +301,10 @@ failed to parse correctly:
  • or it is not directed to your callsign or allcall. +The lower half of the monitor panel displays text that is queued for transmission, +for example the response to a ? or a $ trigger. Automated responses are not sent +immediately, but after a small random delay AND when the squelch is not open. + FSQCall Preamble The FSQCall preamble consists of the sending station’s callsign, a colon, and a diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index fea6ae50..c8f36a56 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -257,6 +257,7 @@ Fl_Light_Button *btn_SELCAL = (Fl_Light_Button *)0; Fl_Light_Button *btn_MONITOR = (Fl_Light_Button *)0; Fl_Button *btn_FSQQTH = (Fl_Button *)0; Fl_Button *btn_FSQQTC = (Fl_Button *)0; +Fl_Button *btn_FSQCQ = (Fl_Button *)0; Progress *ind_fsq_speed = (Progress *)0; Progress *ind_fsq_s2n = (Progress *)0; @@ -6163,7 +6164,7 @@ int alt_btn_width = 2 * DEFAULT_SW; // left, resizable rx/tx widgets fsq_left = new Panel( 0, Y, - progStatus.mainW - 160, Htext); + progStatus.mainW - 180, Htext); fsq_left->box(FL_FLAT_BOX); // add rx & monitor @@ -6215,7 +6216,7 @@ int alt_btn_width = 2 * DEFAULT_SW; // right, heard list, special fsq controls, s/n indicator Fl_Group *fsq_right = new Fl_Group( - fsq_left->w(), Y, 160, fsq_left->h()); + fsq_left->w(), Y, 180, fsq_left->h()); fsq_right->box(FL_FLAT_BOX); static int heard_widths[] = @@ -6242,10 +6243,10 @@ int alt_btn_width = 2 * DEFAULT_SW; fsq_heard->textsize(13); #endif - int qw = 160; + int qw = fsq_right->w(); int gh = fsq_right->h() - fsq_heard->h(); int bw2 = qw / 2; - int bw3 = qw / 3; + int bw4 = qw / 4; int bh = 20; fsq_lower_right = new Fl_Group( fsq_right->x(), fsq_heard->y() + fsq_heard->h(), @@ -6266,7 +6267,7 @@ int alt_btn_width = 2 * DEFAULT_SW; _xp += bw2; btn_SELCAL = new Fl_Light_Button( - _xp, _yp, bw2, bh, "SELCAL"); + _xp, _yp, bw2, bh, "ACTIVE"); btn_SELCAL->selection_color(FL_DARK_RED); btn_SELCAL->value(1); btn_SELCAL->callback(cbSELCAL, 0); @@ -6276,29 +6277,38 @@ int alt_btn_width = 2 * DEFAULT_SW; _yp += bh; btn_MONITOR = new Fl_Light_Button( - _xp, _yp, bw3, bh, "MON"); + _xp, _yp, bw4, bh, "MON"); btn_MONITOR->selection_color(FL_DARK_GREEN); btn_MONITOR->value(progdefaults.fsq_show_monitor = false); btn_MONITOR->callback(cbMONITOR, 0); btn_MONITOR->tooltip("Monitor Open/Close"); - _xp += bw3; + _xp += bw4; btn_FSQQTH = new Fl_Button( - _xp, _yp, bw3, bh, "QTH"); + _xp, _yp, bw4, bh, "QTH"); btn_FSQQTH->callback(cbFSQQTH, 0); + btn_FSQQTH->tooltip("QTH->tx panel"); - _xp += bw3; + _xp += bw4; btn_FSQQTC = new Fl_Button( - _xp, _yp, bw3 + 1, bh, "QTC"); + _xp, _yp, bw4, bh, "QTC"); btn_FSQQTC->callback(cbFSQQTC, 0); + btn_FSQQTC->tooltip("QTC->tx panel"); + + _xp += bw4; + + btn_FSQCQ = new Fl_Button( + _xp, _yp, bw4, bh, "CQ"); + btn_FSQCQ->callback(cbFSQCQ, 0); + btn_FSQCQ->tooltip("Xmt cqcqcq"); _xp = fsq_lower_right->x(); _yp += (bh + 1); ind_fsq_s2n = new Progress( - _xp + 2, _yp, qw - 4, 8, ""); + _xp + 10, _yp, qw - 20, 8, ""); ind_fsq_s2n->color(FL_WHITE, FL_DARK_GREEN); ind_fsq_s2n->type(Progress::HORIZONTAL); ind_fsq_s2n->value(40); @@ -6316,7 +6326,7 @@ int alt_btn_width = 2 * DEFAULT_SW; // Add S/N rule Fl_Box *s2n = new Fl_Box( - _xp, _yp, qw, image_s2n.h(), ""); + _xp + 10, _yp, qw - 20, image_s2n.h(), ""); s2n->box(FL_FLAT_BOX); s2n->color(FL_WHITE); s2n->align(FL_ALIGN_INSIDE | FL_ALIGN_TOP | FL_ALIGN_CENTER | FL_ALIGN_CLIP); @@ -9084,6 +9094,12 @@ void cbFSQQTC(Fl_Widget *w, void *d) restoreFocus(); } +void cbFSQCQ(Fl_Widget *w, void *d) +{ + fsq_xmt("cqcqcq"); + restoreFocus(); +} + void cbFSQQTH(Fl_Widget *w, void *d) { fsq_tx_text->add(progdefaults.myQth.c_str()); @@ -9120,9 +9136,9 @@ void cbSELCAL(Fl_Widget *w, void *d) Fl_Light_Button *btn = (Fl_Light_Button *)w; int val = btn->value(); if (val) { - btn->label("SELCAL"); + btn->label("ACTIVE"); } else { - btn->label("sleep"); + btn->label("ASLEEP"); } btn->redraw_label(); restoreFocus(); diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index 73522bae..e3394577 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -223,6 +223,7 @@ extern void enableSELCAL(); extern void cbFSQQTC(Fl_Widget *w, void *d); extern void cbFSQQTH(Fl_Widget *w, void *d); +extern void cbFSQCQ(Fl_Widget *w, void *d); extern void cbMONITOR(Fl_Widget *w, void *d); extern void cbSELCAL(Fl_Widget *w, void *d); extern void cbFSQCALL(Fl_Widget *w, void *d); From 593686ca11653e6a4e1530a511ed83f0f8547988 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 27 Sep 2015 09:40:45 -0500 Subject: [PATCH 028/138] Version 3.23.02 * Maintenance release --- ChangeLog | 16 ++++++++++++++++ configure.ac | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index e56833e9..4007276e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,23 @@ +=Version 3.23.02= + +2015-09-26 David Freese + + 0424764: fsq cqcqcq + 198c5a0: fsq sounder/heard-aging + dbb169b: FSQ directive + d47b1e3: rigcat delayed startup + e6ebe70: OS-X serial + +2015-09-23 Kamal Mostafa + + f75b92a: asciidoc timezone + + =Version 3.23.01= + 2015-09-22 David Freese 8ad0a8b: WX configure diff --git a/configure.ac b/configure.ac index 358a14f6..25dc280e 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) m4_define(FLDIGI_MINOR, [23]) -m4_define(FLDIGI_PATCH, [.01]) +m4_define(FLDIGI_PATCH, [.02]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.5]) From c3b610bb599fdbe35e01abdc7a9e68bedc36fffb Mon Sep 17 00:00:00 2001 From: David Freese Date: Mon, 28 Sep 2015 13:30:08 -0500 Subject: [PATCH 029/138] FSQ trigger bug * Fix for trigger decode bug introduced by multiple directed station parsing --- src/fsq/fsq.cxx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/fsq/fsq.cxx b/src/fsq/fsq.cxx index 7bdf4574..4f4fdef0 100644 --- a/src/fsq/fsq.cxx +++ b/src/fsq/fsq.cxx @@ -455,18 +455,21 @@ void fsq::parse_rx_text() while (trigger != std::string::npos && tr_pos < rx_text.length()) { int word_is = valid_callsign(rx_text.substr(0, tr_pos)); - if (word_is == 0) break; // not a callsign + if (word_is == 0) { + rx_text.insert(0," "); + break; // not a callsign + } if (word_is == 1) directed = true; // mycall // test for cqcqcq and allcall else if (word_is != 8) all = true; rx_text.erase(0, tr_pos); - while (rx_text.length() > 2 && - triggers.find(rx_text[0]) != std::string::npos && - triggers.find(rx_text[1]) != std::string::npos) + if (rx_text[0] != ' ') break; + + while (rx_text.length() > 1 && + (rx_text[0] == ' ' && rx_text[1] == ' ')) rx_text.erase(0,1); - if (rx_text[0] != ' ') break; rx_text.erase(0, 1); tr_pos = 0; tr = rx_text[tr_pos]; From 4025e3c28eef2836fc821c1d05678c93f9667742 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 30 Sep 2015 09:07:29 -0500 Subject: [PATCH 030/138] Version 3.23.03 * Maintenance release --- ChangeLog | 9 +++++++-- configure.ac | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4007276e..9af7aa12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,14 @@ +=Version 3.23.03= + +2015-09-28 David Freese + + c3b610b: FSQ trigger bug + + =Version 3.23.02= -2015-09-26 David Freese - 0424764: fsq cqcqcq 198c5a0: fsq sounder/heard-aging dbb169b: FSQ directive diff --git a/configure.ac b/configure.ac index 25dc280e..045e2384 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) m4_define(FLDIGI_MINOR, [23]) -m4_define(FLDIGI_PATCH, [.02]) +m4_define(FLDIGI_PATCH, [.03]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.5]) From 3bed0e3f2fb590e21e5fd7e5dfd64927431a4b2e Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 30 Sep 2015 14:16:01 -0500 Subject: [PATCH 031/138] log merge * change merge behavior when parsing unknown field name --- src/logbook/adif_io.cxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/logbook/adif_io.cxx b/src/logbook/adif_io.cxx index cff225f2..fc01b0fa 100644 --- a/src/logbook/adif_io.cxx +++ b/src/logbook/adif_io.cxx @@ -268,8 +268,10 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) if (found > -1) { if (!adifqso) adifqso = db->newrec(); // need new record in db ptr2 = fillfield (found, ptr+1); - } else { // reached; + } else if (found == -1) { // reached; break; + } else { + ptr2 = ptr + 1; } if ((ptr2) > 0 && (unsigned)(ptr2 - ptr) <= p) ptr = strchr(ptr2,'<'); From 4862141aa68e4f8bde62a7a455f53cc1af4599b6 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 30 Sep 2015 13:43:29 -0500 Subject: [PATCH 032/138] fsq abort * correct escape key abort behavior on Win platform --- src/fsq/fsq.cxx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/fsq/fsq.cxx b/src/fsq/fsq.cxx index 4f4fdef0..eb3eebfd 100644 --- a/src/fsq/fsq.cxx +++ b/src/fsq/fsq.cxx @@ -56,6 +56,8 @@ using namespace std; #include "fsq_varicode.cxx" +void clear_xmt_arrays(); + static int symlen = 4096; // nominal symbol length; 3 baud #define SQLFILT_SIZE 200 #define NIT std::string::npos @@ -1407,6 +1409,7 @@ int fsq::tx_process() put_echo_char(aborted[n]); fsq_tx_image = false; stopflag = false; + clear_xmt_arrays(); return -1; } send_char(c); @@ -1425,6 +1428,13 @@ static vector commands; #define NUMCOMMANDS 10 static size_t next = 0; +void clear_xmt_arrays() +{ + commands.erase(commands.begin(), commands.begin()); + tx_text_queue.clear(); + fsq_tx_text->clear(); +} + double fsq_xmtdelay() // in seconds { #define MIN_DELAY 50 From 7f23f3f543b0f5999eb58d549e158c2b0e11c0eb Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 8 Oct 2015 07:53:25 -0500 Subject: [PATCH 033/138] Update Check * change update check location to Source Forge --- src/dialogs/fl_digi.cxx | 71 ++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index c8f36a56..372b6ddf 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -2259,52 +2259,51 @@ void cb_mnuBeginnersURL(Fl_Widget*, void*) #endif } -void cb_mnuCheckUpdate(Fl_Widget*, void*) +void cb_mnuCheckUpdate(Fl_Widget *, void *) { - struct { - const char* url; - const char* re; - string version_str; - unsigned long version; - } sites[] = { - { PACKAGE_DL, "downloads/fldigi/fldigi-([0-9.]+).tar.gz", "", 0 }, - { PACKAGE_PROJ, "fldigi-([0-9.]+).tar.gz", "", 0 } - }, *latest; + const char* url = "http://sourceforge.net/projects/fldigi/files/fldigi/"; + string version_str; string reply; put_status(_("Checking for updates...")); - for (size_t i = 0; i < sizeof(sites)/sizeof(*sites); i++) { // fetch .url, grep for .re - reply.clear(); - if (!fetch_http_gui(sites[i].url, reply, 20.0)) - continue; - re_t re(sites[i].re, REG_EXTENDED | REG_ICASE | REG_NEWLINE); - if (!re.match(reply.c_str()) || re.nsub() != 2) - continue; - sites[i].version = ver2int((sites[i].version_str = re.submatch(1)).c_str()); - } - put_status(""); - - latest = sites[1].version > sites[0].version ? &sites[1] : &sites[0]; - if (sites[0].version == 0 && sites[1].version == 0) { - fl_alert2(_("Could not check for updates:\n%s"), reply.c_str()); + int ret = fetch_http_gui(url, reply, 20.0); + if (!ret) { + put_status(_("Update site not available"), 10); return; } - if (latest->version > ver2int(PACKAGE_VERSION)) { - switch (fl_choice2(_("Version %s is available at\n\n%s\n\nWhat would you like to do?"), + + size_t p = reply.find("_setup.exe"); + size_t p2 = reply.rfind("fldigi", p); + p2 += 7; + version_str = reply.substr(p2, p - p2); + + bool is_ok = string(PACKAGE_VERSION) >= version_str; + + if (is_ok) + fl_message2(_("You are running the latest version")); + else { + int choice = + fl_choice2(_("Version %s is available at Source Forge\n\nWhat would you like to do?"), _("Close"), _("Visit URL"), _("Copy URL"), - latest->version_str.c_str(), latest->url)) { - case 1: - cb_mnuVisitURL(NULL, (void*)latest->url); - break; - case 2: - size_t n = strlen(latest->url); - Fl::copy(latest->url, n, 0); - Fl::copy(latest->url, n, 1); + version_str.c_str()); + switch (choice) { + case 1: + cb_mnuVisitURL(NULL, (void*)url); + break; + case 2: { + size_t n = strlen(url); + Fl::copy(url, n, 0); + Fl::copy(url, n, 1); + break; + } + default: + case 0: + break; } } - else - fl_message2(_("You are running the latest version")); + + put_status(""); } void cb_mnuAboutURL(Fl_Widget*, void*) From 551d10556816bf76cf13f434327a5ad0b689953c Mon Sep 17 00:00:00 2001 From: David Freese Date: Tue, 29 Sep 2015 07:59:49 -0500 Subject: [PATCH 034/138] thor-image * add image transfer to thor based on IFKP image processing - supported by THOR-11, THOR-16 and THOR-22 - image modes are identical to IFKP images, fixed sizes and avatar. --- .../images/ifkp-image-completed.png | Bin 57053 -> 50949 bytes fldigi_doxygen/images/ifkp-image-partial.png | Bin 24169 -> 17682 bytes fldigi_doxygen/images/thor-avatar-1.png | Bin 0 -> 9677 bytes fldigi_doxygen/images/thor-avatar-2.png | Bin 0 -> 8824 bytes .../images/thor-image-completed.png | Bin 0 -> 51019 bytes fldigi_doxygen/images/thor-image-partial.png | Bin 0 -> 17666 bytes fldigi_doxygen/images/thor-image-xmt.png | Bin 0 -> 70748 bytes fldigi_doxygen/images/thor-send-image.png | Bin 0 -> 11394 bytes fldigi_doxygen/user_src_docs/Thor.txt | 214 ++++- src/Makefile.am | 3 +- src/dialogs/fl_digi.cxx | 41 + src/ifkp/ifkp-pic.cxx | 1 - src/include/fl_digi.h | 32 +- src/include/modem.h | 3 + src/include/thor.h | 61 +- src/thor/thor-pic.cxx | 829 ++++++++++++++++++ src/thor/thor.cxx | 432 +++++++-- src/widgets/FTextRXTX.cxx | 7 +- 18 files changed, 1546 insertions(+), 77 deletions(-) create mode 100644 fldigi_doxygen/images/thor-avatar-1.png create mode 100644 fldigi_doxygen/images/thor-avatar-2.png create mode 100644 fldigi_doxygen/images/thor-image-completed.png create mode 100644 fldigi_doxygen/images/thor-image-partial.png create mode 100644 fldigi_doxygen/images/thor-image-xmt.png create mode 100644 fldigi_doxygen/images/thor-send-image.png create mode 100644 src/thor/thor-pic.cxx diff --git a/fldigi_doxygen/images/ifkp-image-completed.png b/fldigi_doxygen/images/ifkp-image-completed.png index 5723eb59bd93cd08596f4cc825409cdbd1f92482..faadf434dd9830f496ca41947f2be5feabb8e671 100644 GIT binary patch literal 50949 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 literal 57053 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%0A7`jEmoA*A_Ku6|mPoqLt!B_mViKwO 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 ChwJ75 diff --git a/fldigi_doxygen/images/ifkp-image-partial.png b/fldigi_doxygen/images/ifkp-image-partial.png index 0b0e8faf9c4cf581d0462ab7c679f1ea3ed796f3..c6c759fb5af1fd12386a85baecb2e45f7b3abe16 100644 GIT binary patch literal 17682 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 literal 24169 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 ylWnU7kWTtiEfSgbi;Qgfp6 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 Fe*uTR>z0ssI2*E^`p00003b3#c}2nYz< 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 P00000NkvXXu0mjf60+DC literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/thor-avatar-2.png b/fldigi_doxygen/images/thor-avatar-2.png new file mode 100644 index 0000000000000000000000000000000000000000..4346dfb59511695b0ba4e9affb169e95c24883c3 GIT binary patch literal 8824 zcmV-;B8T0HP)aOZ;H;pd|i9i+)Arg^Mgo4Bq5=oGdB|;nomO4T* zaWx<%SXhbd@Q}a*v5>e32~Z>+A|#YN1dweYHgVhCZg+LvtIqAe?aNwoj`8uZ|5K@| zQ>Rns^f?XP=}$}lzxQ5q&pqe2#+q|nm)yC13r_;?z4zYV`n6vJ@Y*lFw%M$oNT1(3 zcBA@>U;XOt?b~m?`JeyIzxnt4)rYm$`!DLZe&wfc{_$UX$AR&8{^LJ<_4t{8^}l`B zcjr$2_P_kxKl@j|Io&^X{P(x`bf@(FM0)5M`TKwQSN_jG`IrC5{F5ijANkLI z{eS#Z$M>7%UY^$AzW>mNeBS@jfA8Oz{Wo9x@7`#i@}1mwUDxl9@~|F$Ao0-2bYJ>6 z|I#1(=70KE|M&ABqI=;Vi-%uZJO1PU{-3+@KYZ=KdVTu%iRu6N*)QL``OJ-*&)m5A z;!poazrB6RL;QZ?!?lCa0&4P+g`m9hXMXW#{>H!cSN`6g_?JHVmHZQbBbQ(Q_&egB(x^406}kBW;N{PSP^cb@-aU;8g#{pfls{n0beK6~^- zw1EC2=>PP)_ojOBo&WV$zxKEJFZ}C2wfOky{L;Vni~q{W-}r04x%tS4QMcnbZg1So*AiL&bN}wo|Ka-4kEUP$w}0Z(~ ze)^YxZ~Q)v_bDU&UvE61m3CkLh2MPhAGLVl&;HNv|JnQRzWfWndFvOxKSTTf0zXt* z!}pFK(eW{)X`24=tsW6iqtEXT{>h}{;d;l##l;i(g%9oM*S_}JpZU{&`ib=Uz2l?S z{bxbiIVrw(eE6$>@vC3`Pk!l_o=BhHJ06J(0P>{VKR*z-bpO=PKdeFem0$hqpRupM z@N<8D_u|Wc>gP%-!cZU4E?PaS<5``~Tiwtb05dbomXc`E-64YThyVahfH4@+z)($Q zGfgu|83M2|8ohx|1j7kYF%cDk2t`dai5gX)CaHtS*{>rcZ^&KMv-~b^G5FjA;kKJqF!+*eiqmY+>1ovBh*y4eo`d;*Y zKJelZl!>%lEF|a+ zAto?H9)a9PpyNYu`vJ`WWt-Y~K5b6hv;jjzRmCi+7QMV9!a0(m)|(X|ksjUzBANkn zBD|rEn5tSbD`H7SBmjy~1YlH;4Fr;tSx3##4C$d+Oho}9(C86#hBGRBVw)5mV@xOU z$?<;|Iv$k^06yOFoS-?p)q2tDnqEa!L_n*58n^C%D4?d6`a^^RflHxJDRn8&%nFI{$zvi(KoAD@$&dT##Y4VyoS!`? zdqXd(9$-)qweilny>Y@nxD#)k;G&917Rf|Fs7W=cs00};7y!oPW|{m%RC^?S1RtlEhwRfq&AX@r47+!qiw`i7ju z#F9!vgaGE-N0{T|&|y}{i41^XZLLLYQ<|l`FzsQzs)8QjWGE<{+}A@IU%6smd3N~H z&BgVDx#b>63CI%E2oeMxwZ+z3pgmLka6aAKpT7P<{O+CZgH0ENu=!Leq8f@s$&dos zQKOIqfTTBvgg`78?fvP}QSyw`@VdJLgam`$m{iiB-2xP^>+qHOruo*}`mnEGzTW@D z3(GIwSnkg|N|J^yAr}=h0utQq*&Sr&v28xJX)gNGp%klK;n(l*opr8Z#^%29X{FLx zK42;#8KDptnxKIbxD^IK)kx(j)8RgmO#rndnnY9yftrXgqJ8bnzknOfqmrRJMH7pArMow)TcZblyLW$5X}ihXrd_^ zBqe)xKKt=!XJ5H7yl{}aY(VL?o28Uef+iJH5fY#yC;@?hLXd)NCXyr-jg*p7Wb2!Y zZ9SjbU00yD)H8`>n2}MOJuyPJz?RY|4#rNa`|MMD96Ho8O`w^Q)n+MYBk7F{h$(_0 zxePZC@{b+2FJ8y9M`x z)y+wZao+1uS8nX(8~f#8(dE*KmSmc;XjVyTDk^{oQc_b(DOwG8y8CXY&MJmq*hsu)$3K+p{?qG|&nj6zw1RY2%SJV?hw@p#f<%z;Ga8oGf@poSPk z1Qbd!91Xm=s?wh6$-j~EjMe#wQ zln?*&^0hqB`o2vppFHu9UOzP+_;^O~V=bi$h=9%Gj64emLW$mVrY6x^itR%6urG&0 zp7lj?5iKcoITtMnDXSzAg#e_4stX{HAP5nX(i*%59TH|@wAKP5Gs97jt8<<(?mDRy zr6cH}6amCkqyrUD=p?O)mZwXHmE_hS6aoQpgg0VModQV|Ln#OIbTG@yE~S*A$;@(2 zRuXcjRD-$x<#@f~l_FdZV76+XT+0+b{t@OF;t#ruQwB+1t zp1~4>Y*S!@m@tzbJ|cpwLWroQWMm>+i{_pLgJG}4UT(Lix@`$!hD0G`=Mf-xqNXCQ z@YMLUZI+U!ofo22GIriNQx%AaW{Y{oJhRWVBw}WkQ_5C4>pECTnne=;gzuE4oq~V} zhNJB~g8}S(fq;sts+fq0v@UVcaj%PE;(0}@5HQpwg{IIH5bhQpm1fCPdFomz-KRFz zaHmi;%tTFqtRh{;(A%slIhl&?BuB|hQ(O#GIvEv;-IAwb6bYe_J68Zy)hOYN2zSIz zp#p)Vn5Wq5>T()Syo4pOtY#t3Xg-1NqK(-p6KphnFzEAS{T-`KMHNz2xpOr*0ig<@ zrqZR8xbSCU)r`Qvi&J)&Lc?OD-S^073{!1{uL1DdeS{OhQyulL%X|)`sxRG^h?T<_MoA zNu8pnl%SAKY#b}fC^0D}kw>v;UwiGf&)D?Czyc7UGe}SbNlkS}4^(r`DQ8V;LPU$u z2(-}Vb=vt4DcE@lFA0qnJAW_92r@v3$j;NImV%ApUZ*xqtxkqeK^A0fiZPfFa|sQI zM*}Ye7toQ2@QOOJJqjHkndE1M^@RXEK!Ef{j}T7o)bN&jwgTAhvOA%>%MR{*hk~8A zmwX*pzV4lfe5zdQ}fB`A(s+GvZ1SNYN z&`KXC?Bp#dL!)v%Vcnc?7y;%!UWv_8M`up4IeA*iA$GiN8Zj=wE{PnGWeS2}M1!5vMEw;jz zKncR>k02b66?PJ#sQ~bRP!!w=_H34yGwTi0c6#@=-&@z^VtaMDyn3*|zqd5Y+>xSL zfC#5IhKovwH1{@b+O!RC1c88i+qCVbHg8D+hLa}moU~gP<7}8eckSvImP^~VfB63C z8>eU71PNn{m`GQ^01a4!x_x3I-z~847-6Sm#m&i(2n)gPeixkA_{OP!=k~ai@%l1f zKbT)xjHkoBTX*||!=r=!!(mvYZkEc>b@ODowKiVdS)Y7xesX%g+HRXL&2m4alq{Om zZ5Ch5ZEw)2##?u$-+SZyy|eShL3#1&;^twA?dI)Ur{8)1{Pvm@?HTS)qDV4QgAx>m z*rVtjj}dkX9mL$E?PM{g+G=e+1>lI#m@o2hw0!oNgBPzY_m^|a9YeOYuJ7G8v%VYV z-7E|0v^hUJIXOF7tu91$d362w+0R{h=Hw8xh32oeL8A#oH(V=l{)oHX8=A;lRq&O_3dxW6pV;T5r6b2Nehlj^5bQq)v zbC-2K-{$_L`QG_C>z1(dZM#@)#HWM3`7<}3*HPvy;2G z-+TAy+O>q&dJ?3P9%Qo`hv$p z(uTvOy>NBD$oWe*%IB}x{(u#98j-vOxh1x0Q!)qPLD3N1sfGfO;qJ9QWpCJadl5`f8 zq}pQIZrik)>b4-vr>6aqm z(jFm1`ChF-^E9Q+rt7wCs1#wBI5VenHEyS9^U`AGlg=)tbmqefNvsu6$;PVK zCQd*^kRkCXipS&7(Q0$F*m)O(&=3Qd2)IXU^iZJ7mS<)|N?o#mN)D9lo=Vr{u1hJi zd4i^#tt&KbKF-xrzCYsSYO)4n?5p4oX>bkz~a^}`$ zGKA$+x_+j)h^Rm)5ni{Ojo0;-Q=))yum(LOnGRjXr?BXD3H{pZpg;eoj)*xC#rV{l}NjMrCnA7ge@in2;4gzSL=)Iy+Kcx z-E>$GvjtaUtTr_oW~KDGH_LEfs?uC?(Y>So;Gj2?RwJq!qVZxSn<}j})0UF75C#BA zsdTwC*vW{yYo2cD!J+^}#7gc{DFUH(s!3u5AMkfP9FL`jNoSggL=&Kziij#jp;?TA zl48+uu#Jt}+}>Q=&Fcn+&WGiE*qh~rwj8ZOl9k@0oxcCh`)_?4N#=Wd%jKSgoZmUU zc>jaCI-8fs`*UiXuP1C>rDaA;)5$pAI`P}*(`wonC!_l=pMZ>=`!?Lfm0OiZNP&K= zr4*+@h*-)qvAKyxu(>CZqN!4VHZQnw_3-nbyZ+4K!NtV8chAPvDru42=`hc;C0dh> zV&mS%+^SDwtZF^KSoL?hVYZ*T!yCu7Eyh^47`Iae!*VJ`=Y228cQ$gUL@af{EW#ryBUF*?Q4%R1gAOYTDuhakz>G;k-Ggif7f#@`ZGJK7 z*>iBv~F*)za$e(vkB%tTX9F5)~Q^ zwaQfKlX7H)YEWzpuIhHRO@$iTmE}+(k8Qkna_gPxI~NErVXgpEm4j&sXbDf?PJhU@`2k7 z$Q}~m8da$jh=ni&2(gerQprV<1!D3sXtPqT>@Bb7B$`tyr5j3D#3WjcI*A4VQbg2f z(5w{FwV_63c#9TbNpd*T4Qwl^tE0b! z9vG_b;#DK5B*4NU@T^{g8^?B1NDYZ_FFcDD%;6zD!weP#Vh0RO7)!w|l*)~aLmS#>> zv(zmtFF=KFC9l))2yvFjG4T13{zN`Kfc}{HSYMwq=#K>T?~g*{(+2S2XMv}k-%93Q74He0)W>&@3cc<=SolbdIEZyYS= zeGk=59dEDJAKY7AoKN$Vp1-lbcWr)nyss&Zo5`mZq-%&l#e`W^7R$xq{*|E)J{vEl zJ8!*z9u1b0m4VWkbxK4`;S)!XM|p_AV_CHAUgJq~mmo+X1VJ|EL?1<(kP~@p%XiN= zx6U`$N1x4y=byVi7d^Xmx~>gbtF%$J8Kp$N;`4*jmFv29G#p%84u^x5#1^J1YM~ke zRq4#!Kou?h!NK0p9d2#BeO7OuTwJWiK2r@Pd_B-ljU3%qp^Z{A&B-#@*6=zynAm&0tirKOT>-r0~OMQ(Mm;bKZ1$|75* z!9eo}ceWO_)!LdnMJ<&qG}W#z^X1Xue%0yr$;JEkPG6@Wr`(l538;&sjdi-$>M0&2 z`{!}!Nb?tvr-r+Td(tXAJQ@W8MPLe21hiGtw@#+lZ=GLXmLbv9G{NSnEUX`fJYVMA z+b(I{gS*JhE^}_Ik($$|x}EB_wry+GJpk!Swtm*l57X>$zBqbD#}}Vlzjbt+Xs-O-h9zAt$= zSfm%P?!R;G;O*P1Z>?9;NK@zJ<2dC&H{TzQFgtw8CLAxmCvpm}n#L4jNHC#-FsPb{LbTDRI!<+*rtNkdr`8zEu$;SY z?_hD|`uxf@nJsEqw(`Q&z3t1#<9fwu^ZK1li>`FD=nqr}OUhVpZ{2>nbO*;&{IWylu8l-5NPhTjZ>SN zx8~lwwd!o>vJH#baCq1qT(kLc$~oFJO`~gm^`+;Yzk2wSUwHO6{@~VcyuN<>v}7zz zQmd=F*_L>)fa8h!J8G+*f+28)U*;pI08HTkiGV|)F!fsf+jlpnEh`J~^0AfDhgvX| zs??qH&QwJd-rDGGQ^)F)w^qH@TG=8?n$70J!SQf(z1us|Ztx(rm2BQHR#-p(%FFq= zs|TNdcJ=GOzy9qvrh8}G6q5?tQ+EzJ;UQoE5rLf>S+hzOF;UT^6h=&Ss*IM4Fy%G$ zw8g5%+^9mbg$q5JSD=|P&@RU9`SxO}qkv@8)(}xN53^x$us=II?v_Wn-xD)IZIqCt zrXAZ@ebX@O^FQ;_-m`n%D_76{?{9Cu`Oew);ym+#o#n|Y=@uH2+yiY=R52Avz%Dy> z7uBB_HA%aERKEDajaOg1dh^OMBe-6_y`GNh`et6w{mpPtL-uj}u=iQoBld-I*A zyp+n~Ku+$8ilibAai;~~f7yB)XVmZ)8C^Vv{RZnaJ02*=P3%l*CC(NR9QmgmRT4Qk>M3WO*{MWCQl z#B!I4HQ$U=hQ4q$9Sr5lGX2*4DF+q=jnHg^OH95d#{>v#Yi-`!tIr*L<&|q+c;U+N z{=B)4V*qW|<>jzH4*3l2^w#O^vy&pS=+n@fiUmzXN={wsqUptU?QKe$7Q?{=qK~YVj3Nb;LO3BD28yXoyDkYw>CmpQx$t_hf=qlmfOyi~N z^Pl{}&42pUo6p}kN~xPF6+W9&Om{^V5xMKjBxv&7kU zyd#)NN)pwh?eC>8y?FRjuiX5x7q1;1?1kj!k&Tws1I|^tXCg*4fFSR$8AVl8lr*PEDjBl~3o*4^N-I_rPgy#YkyK4sV;W}u^0Nm& z_R^KlJ#%=l7zhPWlH{y}Fd{)LS>Gj-*rd^{h|Op+K`+K>y=|LuGfm!EK3vQf^I@1T zvi0g{;Z?=DE)C0WwlFIUzf8;JE`dTtL{zW~PX|P)W~r1w$*DuDs$@Ln{0=oyp+|JR zK7Ta-!gB{N-Pk)?c4EqqVw#ddHChNFWt1*;eG#&hI$sRl+&7ceX|+B>tW9lim=9f^ z&5D${<-L-!x3RgS>-xq1Y`Je`Mv`d2?x}5}qPw&k5eo0S#Z(iFp)Q@39vm<8fSxKH z5T(-uhl_Occ(`^r+nW`U)IwE6O+>W?Jsb#2DV35-FO1pD5B5291INnMMZ0hxJ!_uN z_lCugx{|eM^J$tUC5OfA==%KVM%V8t1#A=s6$B6v?y`DBcA=de8>$dd3SerQx|BMz z2kKd#aHS+Y=(7$-d-?DnFXkyFi=DY{qJqmDQPPr?(s$h=mzlt4K>$AN6&*^jo!?%c zysS6)20_CmLR#A0HRl9=$at~@k$&p2T)cHv>&J?2F9vZN4D zTvj^+CJ=k1IX+&sQ^}hP<4mSxL!^P~!4ACOad2yPaCAIa@A8lbR_(6|vH#yc~w(<>Fdb z=DYZRGP} z`n2m=5VbS*S-OmpVWui7R23~LiQwX5{nop;@7}vR4Bd+_ys+FmDy6g*?vp7}vQ%c> zu(wzqsTDBbQws)i8_(~ay#0;e`;GVB`9@0V`4?V!@#R_HTNQEHC9Zo!xa_u# z0LWV11387IRG`pV$)(i|o$)Ct`cG8vASaV*7G^M0)7|QRnP$J)tlz(V`}H^8ymkA% zgT2La=x$uuUoPgN9i)&`_&ALhtJSGl-wj19i2~%fxwv!d8}GjJTkpU7^>^NRi;^nC zioB3M-}eViO2nw*DiJ|%Ax4N$Z0C!!WVw{A0WuI|b#LC_Q~vBzdmK9YJmhqdR7}kz ziI^ly#Z+Q-u{k+Ct<(DEwdIS?9PTZKR}c%~00061Nkl2_WSSrKdaMsDAvyo_73MMW!2p;*m`wgs>6KGaz{`& zD#8?EmQqfZRgI#60v-%91fr%wB^B-I(D7llQ#Q#aNj0lwO{SLxfTbkU6l8=7lw?Y( z#@3>a+x2Q)aw$U*LGxDYRJUjA>COl5|NgyO-)iH%*)SUx$Ft>e?w4kX5w(tW9P7B* zsG6l-3<7AfTr5L1sTLJg5rR&SaDf95mEChigu8OxkKwxo79OM8N&dI5D`5ZNgA5d) z00~IDnu+`M*Sm|Afdq_z0~4?TGO)Xqx4;OjfKwoVB`^niAm8uAcNIcF1tws7|5tX` zT0ZhZfViJ({l!lk`Cs~_|Kc;w@o}o1{_g*epUZdWd;9t$R6G5E;#02ocTv(md$rRK zC_XIG`UoDbcRWUU&kq(pEYkWcjeq#*cqIJj(a#^lkLdUqeniK|@FO}th9A-KF+7&P u;|Cs3G_UlB82>~{$HSHMA4$i@@c#mV6-7?ckV{tp0000r2AyFBcXuZ^1b26L8ytd5aMxhLT>`-&INZGFp8E&x zhrPQ$?x%Kj)vC2tN2n^xVxW?szI*o$Ltah_{O;X*nSc8=WTby@bUkFFe+!DEoR-VG zcWAi(J@4OTW)r=8NAXTxN*v;`@~2Cys$|)1^G?U+{Ka>Z|4^A*V|ubeK5|jYx{g`8 zKAKM~p5j91-4BGXg(Hqq;ylI_@nqv)tArSMjE9k_G}*WI*j2>8(IDslYM=ooGe#C> z+I}>4vHt4j?gm|NpCj&eIPbcu`^&%Jy0L>?5!N^pvI=!O*>LGTKfA4NdhJhCc}@9Y z`*!Mow|RZE4ga@3&i9WAdH$0^-T!Q!23r5W);Cef3Mj}d7SSSn&Yrrrm<`&_kzHW3#lS92{K=nQ9m$HZo zyml;k>_P@#$Rl2aI5svOB|`i=m;{~}pa}pDp^zYqX88sz$piz^AD(dD4`5WcqZdN+#`~1hE zZa8kzEZt>A+~uBfGK>T*`fyKS3NbkedL(0rnsarz*@Pi?pR<}~Ej_R%A1F%mm|r}F zT#%@W5P+qMooI&DkD!VO2Zf`Pa3IE)L`N^b+B2ybGv`v@9eF5qZf1!t!710RmgQ+; zBljYpOi=Q;z6pFvQ>ZeRqHdJlIk1)a4qU+Se+?Rbl5ACpRxx;fx~pxyTf;ao=?er$ zVmBEU+R_AEaatMG?YVjlj zH5fsfBJzHTC&-j+jjuRsl86U>sn+0dJLrRE4cRAhaddRaY2zah)vh+5Xvfa+AIc@n zTBp0eQF7dib0f}UQt;dbsFnx?g>-VkT3BFo$aOJcpfOYo4?EtF83YA$qspv^yvH-< zpbB6ZN@pU5ubc-U2e3#fM?fs+|=g&f`gDL^z+rB=zY@v1~PkT zq%-P98jCSMfQzO$a31(e{Uh{9B7ZI%6^}Czr3)nxJYN}SD1(|?S93Mu%n3%5!f&Su z&PSNXHN}E3kx&M!x5{0jLMXz?wWWWHZMae7TI)3xeM@f1iFeIs(XBt1lCi8ceC=mT?5ISD&^l{oadFi5oc@yl3S&R! zl^_Zdsb{6iAH)zmv`8dsO5VL>*+E1k zTZAD_Iiw1iKP}arC7z#zD%YP4*md2jdlSo>JXbIIbYAQr>2da|` zd2|0JS15pXN<>raK#dt?5Y^STef0QrVs-WH_zYt5kL~ya^zjGcmE{Op-R=mu2^M!F z2e;q%vl;dbKJe=um$$JgXK1530oGcb(z0645<_#Nt~t9OVrpHkCZcY_WNp7Gzvo2o zca)kZ9aurL|CmIZ}p^7@UjQAK7>JEE#J-8hS3E8=66&g zOc!eNkjueE8XLwywq6)0lHJ?{fX``VCj?<{K$+vJ*Rtq#^O_oxshJMxK4~MsZFC%1 zNM~GdfRJ;X+)Aavm8*^o==S|@0Iv&*6h7(wnXLf>DHRIB;|p<`C=C|10l3A1KruKx zd_eqwsDql38oD)&wV^P9v;G|7zTr`CGQ|)UK6gLrJUD?!8&ekxu8CH-_b>|k%|-raM( zc@6LCtHM@bu5z{llelpDwv95wB=ciYe_g^7lX4Ij7J(%}dp~Fe{cH)B@J&nnVlO4| zXJrC}5z+bfZyTBfYC_>b#2hDk=rm=OL`7(N%N7Dd6G!S;1JMb16mhDS!$Gf#{|r8e zXdKLk9zZjO1(3wlXyaH6Jm?wq*_t}V?W5wLcZN>?{ot5Kls9#xLf{IGD7cqbqukk& zL6uMy9Z(MeNK9cY_mK2#+bs_vC^9rPWJFgwN!R$vMKM$+E+;3jxK>{!>j~N-m3&8) zrz-p|H6vn=TgbH)$kVe%hd8XNy?>Oap_mR(T)>S*Higy4Nc$S*Ov#|mIk zMzM7tuIR>Q0P51o+3e}qiq0)=UV3Ih2URr{O>B7vyL6G+M10K5TY#91|!zIjI4kBqXwzi!8aY6VNm32rFQdvc{!272acwbw8Y|$vtM{{ zHcW&9WlW?LkAPy56lo*nDd6DUAbxr3#x#rkrMv$dHa>y$M)^qC&x$}VT1s(kS~@(= zswR*0e2jH0PmV(-buGeHl9+L*c^h`U{Om^y9Hnc zFF>^7a0|%O5sS3VJe|aU4s6e2$B}Q!;uXpS(!~-iwfen;uev)pInG=!W*HpzzO>wr z$o@#%En2N|J~%^TyiIH>;Rz@2DVa>yzM!Hfr8SDBh!8hq?|_`0f_ zEwVS5COWd+l$9;w5%jMo>5#u7M`_*6irF#uQwi!~%prcwp!aW>23xGp{_ zG*Lqx@7$i8i{K^KZ5sdXcci@oQTFWGK@b9OTMQhvLWYR-OSFf%}2xSL;GtM^Sa((^xMU-AY)#~V*7I7&`p;6|FZQx35 zykcB0uaAg}ZI10^jB}a0@cU9o$_K(9DC@BXuR@1%oQJib4!&6DU2e|3@d zf6+py)@N_YfU~5`i2G8GUnt7;oC(RNI@pE7Y5;_YF^5>Euy{b%i3%XTaJB)QD5ciX zCEpNuOw5EyQWVM2E%zSQe^d<63|JO#nbn5weai&s#q%H%j6sgP*8>!?oOXQ7e0FCu z-S`hn2oL@j4@QRxF9bVH$W^O+3&09LKyg@~$1^?%^F;IKD)w5P5^$(fon%-5K{*Sw zd+-X8Y_&N-6^RulDuuGPwsvgj?39g12u4=)t<6Dy{^Z)J#9ahG?lh{F$H+jWM;1oZ zjG6%1wX#!7Hl^$?T&`r3-UuFNGeim{^FSPvS@+_1)DoL_oo^=OyU(W%4c$T}Z5gdZ zX=I>)^2E)altOg zoIVb;9mZMZSzKxC-DeK~vK6preCKR$h3FBz|GiVUd_Bbwy=-s6K;M1|4nITstJh6xC!q z%YxdV^Dcf^p-ACkZ2i0Fx2J)7*P)_od;`DdaD6yEJVp4%nxgaQ71>U?iuvq{1q*%g z%DX^+KH8^u(B>H1g;BJ93O2laRj%JXXhsA zBDZ<`dWc0*K&u_UbAe22vI&gd09CG)+3@Q$T|}Y3&fSO>K`hol-HFKlYXQI`yWkh; zmWd8{@EO`3<^C+{C#7dcMB{vN6ddQXhrjW*GoCH#(eqF=yyo>65lqf#?z1E77fkA& zR{}AEA)$_`Cm2Jx)4-7$#!c@5#FA3Jy7f6H6|LH(1rOq1`4d)J^R^=9eizs!iw%}j zxP8b4#gqqtqp4J_jR5)L8N(yms96=xGv1h7~3Q_JfbBj3yF7 zl5Nk?rv6Alh8a;lb~)o@mzrLNK$8BY5$5Lq?k?i;cl6w3x1^Yxx($@cuf^~I!%zS!iNiHO))c^k5(7+#GPLDGvZ2(o zO$I`PIL~cHHG|(_bYc92IGedDJl@J5LKAGgJN?OUZg69eFlBhrwoFh&u$3O4ftfNZ zk0O3Mi?NdgF<)b)>0uyE~<9*{}}mhC*Zf+;hZR3{8!dw;5b z&B)41lBUpEI_jISTXZa-Aedu&g@8jw$$X&|A2-4sITW&8M;D0osA!iYF)3Tk+j|*T z4j^q5tH36_!19(UD#a!+YV@wuC?YvOoWP>(u8s_qtisQ&u@|B$gF%{{X{-a2tiWRJ{m^a@kua#6W8ayxv};{1-NX_6bm;*NH* z2WPpzn~(9~tVXl7tf}i^y_lM}rtCyuTW1|=`@$u@Ye&q_{E$B9X!}7#tK-9JF@tpn z%@4cU>g9~zXI2fLuogc#)Mv&=B}O^5>n7Ul$28JfsEMn5^n8*?zwHz1@1?kruTa-w zjk$K)H|F9=vZ=7jJT=X4O1Ob{&H2gOELojVA#=}CJuC7z;?k;usH11XRkox2z5t`Q z_oFmplOcXptfHwi_F~r5`#_e48r&cmFqXNV?5{$aPpewx1iN8)l}*_ zf=36aI!&P{^ILY=`+xGKlEU#sH(f#e*=`gejg`PrME2G(-0^?a8133f85j{yC7Gvr z6XAJ*AjH$KS9iom%(S$~G?uKjH1g*W zZ81LB^-_ZamFiB0($q&(Y_4No@Z%LfV?z2F$R?tdW0aZP zICvIP6b9#G_~33p$b+0tiuMl#i6=*4M|WNdT(!`ds_zO7|E1j+i*58sdT*y)a=xHn z*0$I;(C8q@YI*X3143JiE|26p#Fb!8u~27{$j7MFg$h~!w8Ef#EeDDa|1C)o$_!^S z-&12&v!LU{tU|)Ndi>jRUcrfVB*-sxu@5>CPRtwkK{?IFncZB^c=5wQR4!2njRfJE zo&{U_gl25rQ3~dUQ2u!^i|NP1;fbGtN-U~$kPtAhkVwb$WiMse@RAXag>Y=}yphq? z^G@V#>w#G8ENU;@Y?b^g8Nza=JOtE&*08g3nA0x1qL;rOW_~jx5}7{!f>m~2mx6n2 z|F^wM|7Wyc(D#RWlqAL?;*`K}HnhG3iQjOQ1wTXhD|PwOX+vw)`>R(*Q1x(lNKLpO zp2F)Vr54D&^g3!Iac{mv@~i(f>dRm&{}dlxlEwN!@6k0|b=*BF1R>O&gvz zPMbdse=A~mxWuebt8k87QnS$`# z-s%Bd0b#f~g9{YW*$BeqIE?&eWyz=lbu1yvGY@|_QM+J2LQ`D<_UY^=c>I~z=%F-n zIq7E`TcowJS1I-B@XWZxrU7?6tK&}Q$lKQ%`M75=*TJJ+g*yk04XanS>*RVH?!tH+}}I(x#6qjq@Y z;t1)H&TSRZYP3kZ`MBV#C4z-oE52A{VfpoYp55|xl$(MwO=$@_q@zd|(wJOWXhqfn ziA3`^MP(d!CP4;u6z%0F_w)bQJSFo3m8->EL{+6dA@+TV$vNd1Dx9wPxy3-wcIPqK z&!8C7OB#zwn^`m46?KeOab}n$r@c}=zke9d+<;v5DGRsiAO@x7O=`Pa?hrnexsFvf zxlljy0rLsbT8;p8p90YwgaS&aHq(L^g0-zGg*#&5Gj-z>nC`#)?WIwsRLeZ%I4 z%hsM2Np(d;O!zd}4k9!RUW8b?Z$$LHeg}PFo#yNI%X!#l2UWdnq3WS4HmL%?2CuJS zkSbXw30T9IH=|)la4thv3DnOkh?t*zaSLES{H(6~s&{8uD1lkB6sjxVnuRXA$P(FT z%61@}-|v@>N@j~!&^f}}EJ^_L6Od?a3hekjOPA)g;w&W@xsGmQMPi<&{DR&5)ynt( z;0EJIUY-k>bWj2N&oH^s5aS{ZH}Q-i?8*>4oI-5!!;bb64Lgor;FO37Oud4Vz43_0 zq!)8L)eo2P1|(0iMkF4CMS)-^XDeQfLrP0inYiAM4i6-lSmSMo^p*g+WKM>nDObUbomaFmY?|cA zQrE0(nc|A4v)%XWO>&pat;qUx zg^iB9xqc1iPTWa+1N)qLo=?_ZFNi*K?Ro_w^J|Rp^_d&{`Gijf&$XOgDpin?zwxQn zpci&iNdR*0H?l$NBfQkFe%4ktpL}v8lTU@y)&=cPs;tsozp75%}PpFZCUUEqU|DMNXZ@48rzO)&~fOEWFijaPU+c87gK*8xO! zgqAG=)loGKA>u_H(F@w{r^ey03M)%7y=%3qS@uJK0v^fLzd0L?I@T?6Oh_Z9pM7@G zIxkB^4VxHsnbY>Hlz30#^U)<~FvfyfKF_!%$U1E7+C(jRyp~|H8IXY^YI?BU$JK)% z!tb+42(spDp{EU`xE`YpoIl#9nKFQtnq-f!CSzz{Me22J+JN>iiIIWeBJ`f z{)N(JD{BG(BjZva`w3#i!jF$wlD%P+D&}mBL`Ud=6kUWzF=UqBH35%<(ego*LqJ`9 z9~WcgZD=1!ti}J%?TVEci_$bSQifx=CZn#D*z^4E(mm-|x8lOc#`=_zt<5c5!QAPB zJHcPs5+Z>VNVJqU;^CmK{9jYd3ptKhwNh&knLKpy7V=FKahcnNqB#hoj!6_9XmusA zO`?BQePM-w?t3by?H!y4$<#s}IKp;QO&Yl0H2uo?I{bD(Sh2{C{^_J1e$-aoCN{1n zp*_H=tx%O%VS8%SuKVS2>AvG_dHRCT@3Ho3*Z=P{Xbjn|s34QI6t?p{Q!|sFdFQCh zgM+HP=pI9k-39iOCy20l#X>TWBc!?{)ZfqYuc6xQxq?FRmhNzMulcIwcsM80$E0{J z>~~oJf;x*^PCY~wSgD>lWurIh)f{-Kv&LmW++_r&Tsg8KtI*Gq)EL*=C)b_38 zpVIpe@f%fDM9)c$)fi2sMgZcGez91=@a-f!f6@4}7}#{kPq0DTkE-)=`*A5Bf%D3G zl^uFX$EZR!lAO{>^kc!;RXD{||B?n825LE5&&5rtzZcmbhnfkSn=`WANEACgIZ_y* ziG+LNXZ!TD?TUie+2tnd^6lQ5z(W&h1}}QAqpWXA`fo+GR{doKDmVbJ!$uMQbD;Q2V){k|1diCz^4^%}J+xOBOYdiGs z$LI(s>!7r=Yw~{hGZVkDvLYGtz6z^|!(P4fHDvk<^X zJI04(96k}qq43GsQL#GYy78&=<&3&UnY=;Q;r{9E!9e2e#9&|6?|E||5(nsnDRZ4+ z$W}{*VIbcjeV!y`fN>JT-V^{xd{kd2xa+dDv8>j-9>-h6)r|?!1u(*DU3)D0$Mj2 zbeNRr&6oCE=|6nO0w147gb)dQck)kkiDyyRx#C1CCM3<`fnnT@(6lZqF0Og?#RnuI z*fhzK+O{j_DIol;cInK|t zrn54`ezAE%mWm(`Y!bwjxTi=xV2=LYo{hxb>H?w!{W#<-2MKtUaY=7FUi4)r^r!eQV*<17vqNG zM}%OVj=p9xqrYrahZB*YvTN&Pkc=$lGsWq&guMsnt-FQgG z*X>}DC|hNYMa4NPYB)j@rw_KGr;jeAxm>_g`LeUN_cv#JtV1IsO354wsMIE^tS!X{ zg(j!pKG|vh8yS*iW_Co6FpP#sWR)qUDCxp=G7KBLfFxv1i#_>$g}9-VGk0Ug$Yjho z!ykkjyG;nzstQh?d)#L4cx`n4e1>7c690@wCm1IePP(nQGp51zsIqGT4nq3ZlP%Mp zKHY^ta~{m%`Rvhotjw=?H%2lZYC-nQzx>KgKH!9srVz!RZWe?D&zG(5c2kle#vNWF86{ z@7qUp{+KRZ3;@a$^Hqn9m6}iShU~ZMnH+hSxJ(BBROc#>7ckm5XBv8mzGRGHgsAT# z;nN0(&kC})$iGTJz(sKg7{yp?``SJ%zdo34NQ0xNFz3g<02n>8PVMJYXu1XRacPke zIE+(ZKzna(V2Ex=45D?wM)Od49U!E#$;k`qap*G`@#8oYwbQUzHujH(Q=B z>J3$h!)ANmqs;4ulZ=@4XBj-Azikovg-*Zr+62SV(&cu!Bvs&+R{T6n&=NA%THFK4 z!CVQB6b$)t8};!MrR+Dl2Dg1iZ3!M+$o&)kK@W$n+i)MxQJCp#W!_WN^UvB>6`viI zx8NZ8Hk|fv5QmV}=HJz$ztr(#GF)(~3l6(A$^uxLR0kP>Vc)=CV})q>_UY|gD3Aqj z6|3z&r9w968te$!0JGKmFiL!u(vcGjYR>9T$D^y!0vBqNLzc%%B@&`Qrx`O~gg*A+ z*!;mPPB2k2(PTio?;qSQMDV?Bhj0l`Ii05`gWPCUu&^?yW5KkLyR_T;b36vv&p->F)E|t#_8A zEt_3Cw%qI~ieH8xXyb5M;B||-k`!jowOh{Wh>cmFXjnj#nK`B5+(??p6X|o8!LwHP zO-L;c4_nDVBkTIs!6|M{je4i=8#XPVzc-q+|2^h3i>8B2XbnA!09-~o{XtZ0(JrFi zrpsHkT5g+X%-cP^=+N71hrzDPreBy>+uo$N!{xQ;E%}wg+kM^@z5kzKWW64k=zAb@ zx1@Je)M;YTYA~W( zisX=nCPW6X$v^&lu*yV()cxi~5mhhu2_*2tpD*d%?Gk&Oy%eaj2q+&^v@?mrJfvO$ ze6GRn{g0}uKmjdfFnppKO)z#N%)yh`1@P!^sXy6DRMiy9i6vIgeZSAwD{+21w1MfU>zT4!m@iFM99n#(G0VX@LwLyTNzvSkmtMW&hsV*V7+Eqy~OD zelXpePwu(=J4cRFtt)k2KH?LI3q4+4bRSAIOqfIED8cnkrXnZld1MXkLMEVS9r~8m zR-qv6`=h5?7j-&)e@?7g7C!I0Pkz6X-ca85YoFCbE{pufJhRn781s70=sHZl=uO>0 zOPNJ@qnb(k#IJt6_$=K^(^;oPF?gik)b!3w>^!yB3noO!zYH!gtIet20T6I_KPF>t z;+gC1J@8K?o&7yWXr#CChg~y6Q<4qsQ4&T3G+^3ECK6J_B-{RZL~q=(Mxu}XqBkwC zIse>=CQaIBwL@=VmqWz53vzh^U(%^l*%QGxfQCm*d*lESDKEDV4x6_b>)M;pxm96z zWnpz%SS57Fo;v_U0v#N%Fp87iy?tVOJ=ECT@_#rG_IrB{98M$M(6pr2S5%Xi$RYEXp_MNY`k3bwh<#IAzck~~};`epe)yT1w; zc%D|yE6Icrvx<5r74`F6nP+fyymaPNmwws5dF>ZE7(Gm=z(YtVq;Ge>zIo5xefU9Ss&QI$bH-5R zSCdy|ryGse^iX{$!P7G@*2*!dOG-j(Z_o~ALoytrHD^akPU;#|zPC524jSc<)As2b zT5E+gRsou$dul5`a-(JhIO1o#~brH04n#CGsph;MhpdQhIeSX(P~ zqStuKFqJPILpN*s$Rz(H8PE5%wByxNM^YR)!8%1l^qTa!$lzYZ^R$VTbFr^g&gYy- zw)1Ljt!2$lCQv+AW@uD?Pf~6|!Z=$d(yrChR>-|%kk z=dE{4rzx{CASv3Yk8|IthqNr=BJkxb`dnTjrkU((!e5Ix?Rre1(GQb-zWE|x@ctwv z_H?bUiMgm|;a3%1_v6!#ske)kSAfAo--#{kC$stU{qWgEfyKvGP4y`jo`H|CnBHJl zh~RC_Y3?LW6wQt4f!@x_C379E#d+u8x{Zt9pUqbk<>{&W8wcM^LVd4*4tM*DquI=e ziK;NdvkkMazpkeSO>CP?+jOu0!M3*@Nzn_GT>n=CrC2wMB03DAD>o#4Y-=4gibBYB zeK^vgczYa~tAiqk zh{C4r$=uXQ-S5iPzXI;R2%XtePbRq3f%xI?3!P85us$K_=id6f-6E#peKybs4dJ`F zNv~J^s^Upr2n~0>KKh2aA#gBw^3QYRF%lCLyGw&U8$-T!y2)&Uey5I5kUG)wdc^sB zym?P!@c5j@2qrS;6uBHjVg2DTLZ?!dMyc`GzM7IZsylAoqh2#m*w^NKI%FbIldn`?SH&< ze{|=Y-O({NtKG+Rw)!g(vtb=oGo$p+D4OhfkQbV5pF2FCPOi~hqBkLhlFSjuAeDsu zlW8-Hkk0T~4pRbzt5s#h+hFdm3zmy_TXVNqkl^>ScOZcHg!KDv(u?4P!9dZMe)s!s%uVA?j#NTwS@^X! z?ip5u-*CJR28V+dn5~}kpyL6r_QH7-luyI50j4%JLt|Wa9#6B3oA*OY9-9+K2N7?( zXa>7c25$oY%)hfm_?T1EzX|BcHhcoe{r34^=b2jSAELqZ8y<(zKmMlqM{Yh;Z~mf{ zZjn-mJsVpD4Ko=_N8rp-&DX0oIuN^>{MuQQ44_gDgV_;Iyutq||Gv&@|2iwK*4zr; z65K!ENr?_=CazS z1T~W?D&I1V?~jG<`C&G2$ChMtZtw59HVW#s{nnHH#&%e4SFekEET2A&xn8lu)K)HD zPMM}NJAEg3s9wtwO#%)?Eip(>{@Les9BVPk*jYGx;TZtnD^Jn=VV4NDyMqR2U}< zWLrK;9z093+ZawHY3+Vxv24BeGE<-`gL*4@n&{`Ka~jyh`}RjuZ`99*uVJq-f!Cpx zB}$bG&79yRQt0J})Nobi{_iTW|AsZZp_df4Lf2Uf=<1vr&}#8cc_pU6r6n8h2>ymK z9wNUQ+luCTtnjByn>g!C3wT0`gV#%ZBeg|HzzGMWEo(PEChuixMsKBRkL2jz5boP@XmW6LzpQzoc7t_ z*?j6gi6-5BHl7^4>^UupU63|c!&xHaY)AIQY3J*q!s(DBPgV*UXG~DaNJ63Iw2#)% z_lqEZnI+#lO}ShlEn7PZA&gD&{6X>e!&rLz$KLT( z;`Oz{>z2FdV3_~b?pn8t`!KpAP{oS$y?CaCxdpBHqRa<79YY(tlPUC8Cw}R#d=cCo zIaHw$h30}foQ=(o1q2O@ZTBB-3Iv)Mo|*Rks6!tGejNipIT1)e4es}8Xx?a3N8JKD zMT7oR&eWq7%%ItLpCs;U0@`8m#)W7JB7Al1C&^mQw+d;=^Nj3mqhHj&N;wYRMc#7& ztgZwP6(gv zjW8LK+`9epnVmDQ1|Aj?7t9B+c-k6Ps)(!T*HF3r&+q3KFT`6jE z3Le{BZ}t7tu)&|tyGk|d^0~+3Zm_rdg}gnDM#<=^z`p~T83acMtW~|e6SP< zO({XUPzngGnv6^xNEok|98SQmOf0W*1|%kFI_;H{0p)2FQlSl>m=CDVXym>jAmdQf z!*izhR=J<8Jay!`Ty6V4O);c6L{=X33#+M#6_k0auHOm0e0e*(E1OHWInaq#7)%Lb z=ZPVXHrDriRmk?Zh|bbBGYBmjx3uGT+CPgqg!BWJYDsa`og&y_#3!KkQ*i|PGr z7A+faX)n|fqEOXK7%9f@aeLEt%&Bfxf9Ta(GvH1}QbXg&6#Z*L@E0!9k~)(<(2DGR zZ28!i6M$_sZ8GOMwo^wyElev+*`MxWXp6hN8z2QQoif+xnS>LQ zvaY0`&1#7DXjceY!JOFy16Ck;HKCTP#@WwXA>tk6s-@k)Oah&rrOXxdo9mBh-abHua!SAeYE7Jv3E??#o0o(oa&M( z%kMf?#D0!sB4}A`;xECwBR!{MEJK88YdIwutv7R57VIDdLOs)PTXjUc)Qu zn_nQqPBazK>zN@+N4?}KK5wub+)@!X0)pSST?V+8pM?*=&&n_+!N7Jcm5?7eVMFIB zJi2HB_*XL?!1<)JNNhC~&6tuIe1};lJ(7T^bH)`=R1N9Q!+Y&s=a%sg)3z76yW?Di z-@b0)aMLgo`p9l;D-kj1=5YS{G4b|{COV8};P;WT03AP0v|;1{H>#KzU6yfDCg>{@ z96g0Br7L3Uj7(A~Z9ku^mx$jMSi9GB#R5+yUHRG?L)khr)-XGb3>_!+K#+(M1u}8a zM`po04JPSj()cPzhfBgkuYyrY@CAmRwR$C?rBgV?AQ?7rt#yIJjn`uD z54pB`?dv&E1)5f>s6=QPTwNI0r!D-Q!g>0t&d;=8UH*l`)sN;v1U1@yn>gh?Z3=7D zu3Yl&j_1ejvg2H1L;<(pzOJBN2J1sn*>CYkcd9Jl56UQD=oGnGMZwofT(^tr36vAR z(tu6|MmO3P6upQdfWkt^j8PG>6O4B_Y51VczfF?*B3vl#tK?7B=0Z)iod=eqz?ZDF z`zFk{FVmveWXNGM^IM}X!aQCdE0jma6P3rQt;O{B47t~v3%3RL>glF|RSA|x8Kshm z^YIo0YV9-;dla0-(h(eiU*>el_h~ZrBsc#u+zCB0;Ns4H1lF9LUWGX5ZLcWjHBVdw zo7HTyFWtz`Wm^$6@`=heE({`v#PdhFP*yL(@qRE#-2Nt?d3CH&88Gp4<>&VI6&Kx^ z%o+E}2uJ2p_h4a~yy=@F&dJ@02MFph1`TZZ#IHz(jisWe2fS!tIc3K`WrWRga>yTM z;8;?Vwq+AXOo_Mk%@Otm|3j48i>OtE7_=Gr0hDyfz_t-$VNA`Tlk$CGu%dxZc2sh5 z`4q>JF03H+=$%AibQQsvb*8JZSufS7V#pfr;=EEd$&Xq@Z5<%S3Pcs2vKN}tnCA#X zI~5d(%0U`F%(}@`D(AJ!%%zDZFkmcZ_s9+U!a3BjbU*y#BJbiRts9Jpwz;1W=9Mk5 zA)c0a89;~XQ^=6dK;sEOd7<;eqA-=8ha}@9R*9w1dZHG|N7s|saA_rQknH1S^rmKl z)Z-8HwLfn9zBwr~^*6O_?4|HJTvYt44v&AaKm*ZFPhWU^g+A1L9-uKBJ^m?FT`pe1 zxx;1T;LzuqJ!{V$k!jcbSC%G-vY%`BRKs9vBkZ$J;Z-Y( z!HG&FfSwRBdFz%T;n8KRTXyz{@A2;jG5g(~zmgfe{z+r%i`v{1zMFRO*`OYGZV>86K@VYI zTiF7BFyZDmDNRbWFB|s$@$zL-m2;BLLn*J9!X%v^xrnifQlWA?nV~Xes47`*db?K0 zE0f&giYq{gf;j1SU`~)o(rB=H{9L#|v|0=`I@5Z%;%%#|P4qk>XiL>};p;^H7r8{T zVSK4|f}}69Woo6n=^A<7nVgs+V^@#XU6Vy87#Yh){_0~ZD>1WF7({||dFmXWX(=6P zl?=8Q2dM4P<&798tE9o_S*zClRtNO}wiKUAf;mCdl~nKFH) zl9nVpX@jOUp$G#oYLOG@ae78&W;aGtFQMw(!D?l*(&S9@v$|Q3ObgeS3{hqm=_AiL zQH=Y&Ect7k=RuM|A1;M(-0;*?WBVEnE8=J?4LVh(5@v|fUk}dj z^r2@V6`!pxTZ7Z<$+Q|{-5K?SeZB6M$v3Gvf+EUcB3FC?K)0nOIeKA+A5Ar zz^ak?5iYlLm8s%=o!ev{Qhbq2#%-rCg#k!e?$0BDkayk|%wPEt8X=q+qZlcB592|8i4bpqv_P?C-xpYz47RV>Xn98-TZ(e(s zphgmO0w4oXK1AVw^;C-&U`AS*UQhiqrzut6Q9C6X*4&nf(c9WM`)JtPU70{$%pP$< z^3*q4NB3lcZSpP4J>0arg%qnQsyMlPO^QoSZC~SmMrKwq-&lrx1~pFF>pQ!66Q<~!tqq*?2)-)*a}XK!=eLi!*nStfR}?4}u2yQH2sl>>0QE!E7@odZ3O+DE(1kkLuv&%zt(gX0D3~Rp%=h&P^9@18 z_c5v!6&{gTEJ${vBq%SwoC&uJ3w5IEgO8y^>wX^ha#z2R=#L|4nxe{#FZ#SQ(BZw7(R|E}L6W@}mF<~3aK*xwBj9_#3Uw<4dge?2}wsOm@x~A0h_r?*FyPI@rjLMsXay|mDyt+ zMg@gTdQ0@$b%Cv+jr1PqjeuPPmx&OOlOx;KVA+q6<$n;@$`gZ@N%Sz|DZh#teZoj{ zr;eoD>@SqOHINMI$I*0LTKH$aOBQhc$!`Du0Ixt$zhSm70jCats{T1qhvM<-)eR0B zRXwjB+=zOQ+gd0}7?%d$9Q7EF0^{8{mCgfFDG$ZIQi?-;n!F=0R{h1>8D2G|zLT)> z7pJ23aJ6i9EoV3_4%aSbB{X$kQJYGOS7FcY&^*>iEnRAq@1l#0!Fa^4{_P*utB*XO-nQ*w32&{AvN>Jtn zp3tU>a|pjtd+H1F)xd%*NjA4L18R~E%A;5<56I|D>KG2AVVJN+Y|VPN@vxC35&L!?ByDKqqE%6Zo7mX*lU0;dYc(6mjgqk(|>$-dvV1)o< z@FNG;6buIg{^@`DlYHe1UqCnl<@nrpro;M18)0(N*r08WAG(#9y%D&+sy9F+b1lWO z6Aq=;m`TF=LV$1rQsd(KRmnIQ<@66Gw4$7)#SZPc1ws$@_qMs!Pf0ROZZy&nblWaX z-(`{{jI$iqg_Z+lsWFaAGis9OmayGpaej_?G$om4sG5-$N=2usuu?OMQ^H0>vl(I1 zlEMgj-H3&TN7D~j>W26pYz?P~Tr*8FUijM6oOew|SrG__YWwN&a3$&IK> zWJxtmww79&KU?#wzs_oZ?n4CG;g_7Mbcyvgji`%cVM~;#LZB5Ajlv42lK5y#X*5by zP+X}>WN{Q2j{@UeIh77bZRNx4$jZS@NNSqSOy5}X7p1CJ0PlpUa@fnd9W1M|*w+2T z*@W93_PgwC^Tp1D$TjJuF2{waBp|lltDQ}sO;)fs*yo@A*FVcMpZN?@K<+3uj<;D_ zXiz2@ld-1N42YtDI4vmh%GuDE42&hqOUf+g>}r!UtAh62JT~ZYb$iUMTL(-BDZ|}_ zGPgLPPhlGD?Pa`vX`45;2JBA-(=;W{$0%!wgrQ6gSpl7>MJEaoD3ow;9f>c&^Ig0s zqTw~@x-QMoBh@LB>6AI&VSTkn5O%=0^tzSbOj#OA;SdBKp5q{uR}G^akClZrI?XOO z`$N*{hM6&ZVdI}#gp93>wPw#06&1&5fzgnchODq?UH|>E z@|ls+;`<6wlpGBA`1QZ{Q+)MPpTV&ptm4#Kn^S8YLPwJ1m9;_`fFm_pOVVP3aw`Kb zttEkP=`AU`3jy85b-KMS?_7U}>$`n~5B;$u&m^T)>?9>O4hBr(jFnEvQad8>GnPI~Y!&zMj3(!JQ)`I-mXI6n9YDrHuo~eJ=k0UWS7*i<;X2Nbs&2AJk zuNhS#%dCc@jPWQi-i>E$BT^$O<0@I1u+JRkloE#;w!`M26^E9M_Kx5GUq=Y)AbW>4 z(pC~*b4R9_VaQ5NZY!yevh_BHF(_A2W;r|kJ%0Va`boa_sn1u_XQ7y1Zm@ZBj%MhP zq!J}ceAiNHOI|wFphhStbA)p7TuHanVs)WI;FKKf56RO#0>@{xtJvKw>9`K-^9}ZkUpi6bUIyn%?^`NW28eTbWySzYWS|I%%_Z|={U^K zH7jkVm2{exG`9@;8FQV0xmHL#8iPC4qC!}S<(!v5(3$EOX z(MiV6bj+JCf1R`E9%ONK796>Q=UC5{#qCeea=Qn7IGsL}Zc%53vhE*(6je7-ihB22 z{J%3uQxDB*)q<^hoHMg6F*Dgx2I&Zjq&T{SM}hI~JFy5zbv;?ENh?a!(?$i-sRNu9 zI2b%pWtGkh6mbWbpeno6VLBN`XUG zl-%kM_}~8CPx6h=f4(-37xWfA&YxOfwbMWg4=F2eV^LcHC`Z$3Lf|G$^Ma`sY;JV8 zcfHAUV!3!_%B7q8JpIBhuU{Fkms*mEAPRln>E{d*!@Q>mJr7rwSSuNfrcCo3ZE{jm z;kS-0FVhSIavcML$s{8!G*QE&*^bC-llfLC8EL`WxB7%ybD|CHNTG$IunwJelh#}t z$8C{njjIGfE5s3&B+2kSpQzg<&vW*ML!|WR^tvq1wHb}4-0Tl&8pA<<%r~C@3a9RW zfR(kC+6!DFgo8Czd5x`UIEPzF@(yH~y# zl9^^fm_yAgRK3tV&5thOQDD6L&XkB$SHa4Yw|k264!;*wPcbVwPn`wUJjIzzXNFUm zfgvhOgxkD6D@oU!9icD9RQr0~#<5p6XdWZV_Jx$*Kuumil`a^*XA_mC;H})pj(&Bne z9$E-^cw>c2J7aG46C9mW3eYwK42}z(Mo3v|G?LJDxPNnr6RRDjdC4TxNNaI@MUvzc zMYZLlq@c)32IDD{@r0F5mwS$HlBnvv+gM#AsqJ8y(Tb_d@|s#~Emmmq zMHZ2_9GTGA*Tv|!d7klY8~u$DRz5)Dbb?J zBpp?i>HMZ=jgdj>9BCcK#vuKW z#i-3<SfB4?(~n zF|>j?4V)hkRg*qiP zQrxD08=?L}30&hK4uQ87xlz{;3u*?W^B1y2aacLrvE5Yr)>xylA}3FedW=Vb@h&`D zpZs&;j@ml2dd*V9 zv=Ed=AXR0a<*Mq&I=+J~3l1iIe)E_AGrs!Ck6|<<2BJW4=ENM!ixTU26s00BG{UI> zvqfG7Xx|aE1BK&A+MPb@i#d_<*xzq(Ybzt4SR|VLea-erv(k#Ve|?R?v}77YRdaWi4O&@JtT;)*~1^a19oMjke5!zskA)SnADnk&$ zG&hKHgmn!E@q|umfp({hD06}+z`7pU!H9U0(`rT(Sjr?J*9E@oVq6zWi&T>-vbNXN2%+n6D(cs)7e}qFAFG~M5tS-o_;i}Fb#s?zp8guY{gL0|BOm!4{`g=2 z0YCKb|H#oL{7W3?=q>nnbAI^`e;YpXPgp;8nuWOq;$(yygru2fr@zf3k3Gf*Kk$7l zZ>-X2wUMq@@5c)Avht*pvUU)xeO@dUYpU%FPm0={y=v6!I$$~yw5>mU4ezWV7;P)ZjqLt38Y+aK(4devojVli1vCsG7%$oBpSV=di|!c#u^G-fn{ zd+t#@veu;C6GSH;pn35cuDwOnZt%I69R^9jhu?o6lfv+?zj2K&32WVupc$YXNm|+p z!BtqMqbX9Q9A8^zbG1ucDlTnp(U67{OCkHClwzuASjjLq=u+d#ltH1%u-voQrs;a< zq#z3v^HCdBSibSi*Vy0aas1d4TKN=N%-(cB%Wu(KSR@#YxOQ`g#l;1B8%yXoVQ;UG z?}s$IT|}u#Er^Mw)m!4nKlE+nfBG4|c6ke52;RPYiC_J1et}>5AO0~9KKvL$`dC{c zrNx*6Da$(Bn`s=KiuP@EwMHnZ%57t6L3gD|oXM(;F_c9?zkk4$OBeXe$3DrWw=UA{ z%^`y(c~&BYr8FgZk>k4|S)QXzjwt=33wRV5@6NN_TOw5>uHCpoUS=%LFOU@(IEwZ4 z<80sD<#&Jg_i$VVWrod497j>us@K*Z4r#Vq{OFJU1m_;OAK^7B2B36m?9>c6G25{K zD=e-fvD%OuL1A>Y%bXXChhu*C*ZvOAeEj2-Q;R7LCNMnuzzQc;Lkb+E&X|l71P)OE z%|Mc*8k-w3l~EW;Z{DHZp5sOyvbz=IZM}%FO#*kG{dWp(-AuV}qlNM_E??PVJ`8Yj z%LJEXQZk*6!5Bi{L%5Qrf(7GaU6qys2SlZhfJ50;}KzRjt{)|39jsZhHHBRqCDZvmtWz3{N-QdmwxSk z;r{av)Pop<6bfr}o#0!nFcllgTCAw{Ges%Ml9bn9d!3Jc^v~!I4se~2JTK{Xx}Yu7 z>6jpFAcV^}j_Iy!;Hn0tHON3xW+~}3#S23`*C!qikwW0NnnxG#FL}h@{+oZp{>E?q zGYfoklPAC9eYDzbQtOhImaGKNQ;57^Jly9azw$Tu z!k>H;om-|BWJB@6C)c=lt-=1t;z&)a>5*&2?(Ue}WGr@l0^xFfH=`_5HdX?TZ8&sV zE^lvJws#Yx%n&lg%LFgIofE_%@4NpD-y9xrDalBOQ^vy#55uYB^St+=6YTA$ynSVh z`KDo^>l1_#ln%%SYs-uDBFShx=JM`#{c*aWJR??c!WS zBWQ4Acf>-c!KvfN*xeuDNy$U!j&WjRiAK<(U&45>hfZT`5FmvlA5ZB;A#P`mxIbk& z8PQ$n&}cTvvy?oYlE)ga8S>7R>wM&2eU3}J2e=6Qc8hnt=Slv~ulytKJ9i(hs#ug| zk#hOM1z!BdOH4)@X&w55ZH!}a+y;4;QKnhdD|QuGSx}}iPVM=UPcnSz;rfQrbV^Bx zuL3YBr7D;v3Da?m@?9d|LzX3JQTtsZ`6s{r4~{P3QO0=po%`PX9@e`qTYG!F^y+Ku z?Cufy4dxfScTOk(0?76*iC(OfsbvwJ}yB zbjj`@=3}4y5=u(SGDg~xhHy}BKw%ZneDaTY>T{ptAT^Y#3Ygz@W{I_C$nMCHjB`R? zlBo<(5fd=(aLO5l4P`lqXeC~c?#1a z>mMMjrrn81lLULPOBh9<8pOj1LOJLn<;_diXt*JB!ZNqm^9POCbz{tYjRQr11@w=I40up@-Q#bpojqE?>OJXTS73UwQU<23gMf${PIV))J#7Uw%W^leXY?)-ToH{j~kTU@<-jd;9=c72?nL*R93J040Fh%7@Y7mJ7I zHISk}ISxi!4qp8<`sTM#%A-^cD8;$O0I!U>ay_9TC5<2?wTjGon7lv>L8loq9*-Hv zC8yS#EOY|K+TaHrj`uXLUcJf1>k~|xvb!g+x#Gk^hpl8vH*`68p-B* z58+GRzO=_6H9WT2p&dm`3n+>d6Xyg$K;*U<4u_;=!rI0H>q2tr#(>Pz+<)&np&Mc- zxU}16cd(5zhI9gxQn5a_#EBEfxxBx_o3Fmje51kY@(SO)aE&j&@CxsL{0vXrcM2~{ zE3>U2AfJrb>&Nud9Fe6AMpH8D<9cx8g>PYvo-2Bfj9t}c+|C6jSV zxvIvT@%-1V8zo z^ZFpHA-Lsk}GzFCrQOD$`7rY`Md^)2Dg) z@`x{e^UFMZqQ~iD3#2)i(x5zr$uzh2MoiO`PE!ykmP|X8Wyv$&e2e|j6y+$QR-3fQ zaFQH9YOs?R#0K(7#>MAf;j^z^wEDvv~$?CtJz^QGr;y_3wX zZF2v~@8`ZBHw?-cEiA5TR090%5%F7JW^VHg*eBX0Mtgg_{qk2?e(w)6fA1N_ z`#HiD_H@WfokMn^K9R^YL_{5v{pgP7fB#LX9;M#g=@j*rPpOqo)o z8J%vE_Qo;#Z$6Job2_Ullv=RZZQ_x(f*DBBCw>>2c-Ob@r~j!FGSd)%^keT+^EOu*M~5G#Hj(8VyS2Gtz>-mXxhF z?OvCD4mZbBme)eo)?IvmjC4|3;TS6fSNjFNH7Fz5N;Qsgcy(*atGgvhoY4#ow?;8< zZ71was^I`i;QKw^efA7%OH16?+au0Wj5G*UO{<54j7v8%hDkxU8K9LzrZp?`J$%2# zt-U_FEJ%wfnKm?h!6+@bzH>m-2#BJP;Us1_$r+AglCr|BIiADi8@IT4Yn!GkSZH|^ zu1jOSMbPpXW*J&2It%m6ZS)wI1^v;Klc!E{;>>A`2i>_A^D8~3Sf=BcAPBL($I9j^ zjVNHypMX{P4$LnvbLQN;=ml-2)}zQY-cZvT4_H{a4`*%(iy|?a?Y#rC+>ogViDdWk zO&qv6ZlcYfy&pJfneCc8Iy^Xp$BnqQ^6w#j5PqAUcCmKb617_q>ZqP0NQ z>e3Viei$<7?=iS^f#qYz=^a0f$t*q~REgJa68QnfXb4?=rxJnZMxb)d{%)TapMQp{ zZ@t85&}TXs;kmlnZ6+liS{hD8-RaDC=|qx+xi*d#jHiY$Ff6Y+L@keoELo0Rd`kA? zn8oD`r6nK#(u8+*ES@cy#FYt3FKVD1MSoII8pB+($$cl5SzTLVJf6@AJWedOX@`n~ zamp)Kw`n%oY;=9%yyTr5yDS`E;rs`GlFP5ZMf%29=rlrd3+;B3G|#wv^%_mjXJfI) z?j+^c z(~|vB&i28GZo{SBQrsFA=u#7TF4uPU*dNBsH3H%^DX;nN{V1LKz4r*D-zvq7IJdx+4`Ym=(Nau=#VHDQF1^W@KJgn|d;LYE z$*>}4d98~}K{AdR4@%~Gf@xY3c!Ehh#BVm(8V`uP4x!_*w%+2{u>c$Iaj=u}?1cj| zb}_CZZ~~gPAlD_!i%o=0NrnT~=330Pn>2zZlO)Ah z%ZbHhws!W}Q5usKtQ?)fmM16#?2KdPBaeI<MY-bC0J#_vf5Bdq2k(R*Cx==mW$KrV6y>52DuSv*GIW7t+i#u!BvEIq1mGm zwP>y!WAD|Mum&2v9^=BLAvHU@7x~kV{Y$RA{3ug6@ym9sJ5Vmz6!HAq-& zw`lv4G`IAJQ$RC*-k?+g zO=Z}=vBS%M_GdhB?s3k4+hdG!OP0iB@4SPvagJbZ10xlws;EdMDH@NwFqBEq|b>kX#utUp>Io^W%*5)y9zslZQFQIlX zkzV)~FMsOey!@FjGQ9Q1VECt)&yf&7G9JfrFz2tIdGHbjny;!bXEq=NJ^Fl}xe{<9Z}Ti4X-Y zDZBf-NG}DQabssliNtpl<1Aq`h&groERX%QU!rsNN&FzdXp3?x`On(fhq<*kKp)&- zF7z1;#w2M;qum6nh*N{EDK%N1(N7Bwrc;WdM3-f?MN*dJc}`&rNl}1Rv@{Ge7^H?1 zy^wf1<+W?OY%b1oY{AD59oFU}0uf@8gzl09QnR?WLS|Az*XO?Dt3=HXg-uaH5V#@n zV4rv1yvX3@4rWsD(hJ`pIoP7Oa)GB3mKJpY03ZNKL_t*l@A1O3 z&-2PtpJICTn=JbY&iG6fNH&ymLasKgLDQM@P_o3cl2+5hD#3U#VmKX>7X@XUqP0cS%@I2x9sWj=Ifo=)KKZ(kep&h|m2K~xgyx{M|%TKFVsOxyABq`?a#&aQM= zY6vcD_Zejg_Z{D0X>N{#IAwnjv$itN`S1N{Rv!I6qIMglBuWCt;CU{N$w<>FpZde! z*30#Mr;e=tFGf6UXTlup%N>XMSeh|=%0s>c&PR48; zTjlhYPMG;r7UT1%Q!p7!03Gmc2FL7&sA4<)!v-k2J{`C(t?}cRT4T9x$bO}g_GNCq@ghr`53sO#54Kb&VaZA#H`EN@xxiO{<5$>E4;Wg(wF__4 z2qI40d!Fxj-;?~}-};%OOL){{y!+1O6CXsk+a!f%sH=V0&}ibKAlkmb_iUsLm(H?h zL&iJc$q}w68H*l`?&GYvh9vbF=S5BMHjrDA(om2h-H?U?xpIt`KJiEFy?ue!@*+Z& zG+pR~9!6M_I3-Oi9-5{MNL5L{A6FKxwI8Pn99E;01`|H^$=5(MK@4O+Gi3Z_X(l3PNrV6)dG3SFdvwEXej>b&wQBQGd^#8@z0p|9g2KP;49`@ z9)oE~*y*qm1~jHI2*vi^nEf;%&r?+3fCE`k;=3NlPMjhu629>2TlB(+wfPpWkFL?5 z@3FYDiV7{K?pfx_8#i#~y4={>;eiK^F-{_;v$)>G9Kl)C@;ro%l@U; z(2P)FlO&hOw4{+_l(#M*iZRv{y!^uRJp0Lih0G=_H6r@gFEiNN#ugca{s5ybMVXTn zDPiQ&?0C4oL`Y54aA>s!j%z8>g6R~jaWNuiY*U7rW^z#CWInnmn4jx#WzX>3<(y%W zW2I%97L-QdI1bj4jEWp9EV?vE&!^Ll7!D5D-XGxm1xU%o?E`jpCLG^b;Qk-@8IC>r zeKeb`%D}7US$j40TuBMW;(HE(r#O55JlAe+@%HPlA*A5y?vUM)MVA@F$&fV7SnADl zFdTDpua8M%x>1X!A5i3w#wp5?7+o?=G`h$LUBPHLV0WBzFq*QvyUi=FUgphjUZ>q# zV0U|$g~bm2;ea4mAPO364MyB|`V5ae_#nP3818KoE^IJ=>=>`T{W>qc`U=NRtg*Pz z=JLfim>%qL>EdNR{m1`?6H8rw@V)2hZ|`vH>MJY-8P>#Hzcr#6Sl)T{Ek5zjf0O$k zd6Fl-?Y*RXLtI&rbyT1kZ*8;vwWm4xuJ7gKi$IDNB0$;?eojygWD^FpeLAn|v752s( zY$TV6Uw?`h|NQqEj}GupJc2jBL}_wf{`l|l`e#1Mg;!qX;-w2Xp-0dNkW%3J9@Z2D zp2CxYJkb1uJuMMe$z!9dRojVosT)7gg#dRD!*X8^pPjKN@pRYduB2rjdZjS3ZY>yJ+%wUB? zVHk`@jPnvJAkI@PhQN1l9TzDi(i$jA2IC1D&BjI#Jcl>8#_Vhl*}P|s{$xydvBmCw zpFu7$I-?!7_zynxy=-nS^U*JTi7$QQ70#SK#krIBFxnrmb>kW^R}VS={bA2W1xkDr*Q9T`S> z{{OJ|Ucs7W=Xu_<*3NtX`9C@L=^SUKCx@PZNdQ66APJa6k(4M>B3-7Xa>=HxQb~4| zWl1hkmPAPua{>qm1POvj1OdzpfB|NJ$)S5Xhtqv>`18N>UVHoE3}xQ4Sk)Kjz2BGb zTWhcHTkk_B%1QfuYSB%m4<5mp-4B|Jj)qWzOld@MjFl@oH?DE-!I3=^?giuRr+3f2 zgs7EJ?G~1;aiE;DSdK8-Z)S7o_t%IA1Mn?`H9@&iqbn;s z_njBX$L{8?AO9tsqYqJU)DS_yH-GzI@ZQVcBFP25-$&Oq$TJ#sk4$A0nZhmE0NA>Q zEj8jWq|@qSO2MJoNpuB5SJcJ~BB4MSZ0zI&3781b1!0=9(G9qKtHt&pLTCkX6c9xL zag<;KiX|`~yG2Q@{9+smvZ{T^X!o9!aglPPfIkf8$@W-tn=f zX1Mb0KjFKd|8+L6{(yazfMa6?#n#(==QF>~n_vALAOGq9e$Rw^!Fc=W3)i4{^BZWr zHA26|_s%Y}!3f6T`v~S9V7+pHVRaGv#9dUUCz+f+Npv7isFGnZnWx2Ezfp-hePp38R!@5|ic% z;Y#MbGS5CV$ItxT#~788ch0XfC<>x}Oq%P&1D$=7E(;Bv*^+@{fK#ioFf~b@79_dE z^IRUh_cW7Z<7{mA8H5pe4pK9bxJ#YcbkpD;Z!fngfE zgcDJK$aa}B6c`dLU7+g{O=|x?PrE3PQeqf7M~>ai(#k5!OP3j`RWYTGrU^DXJ%&+8 zrR?n@OI1dZ=NN{8u4yD$ic%RVIZ+a$7lJI!==whEtu7-YRZ=Mk;*877+qmTlvr{ED zx&wx>Vrslj!>b@;!RSbZ@iCjED7bL#2Gg_C%uJ7Q-% z4Pv5hNYLJ4>+(Cy%$=YZ3o2>rOC#=NayL?8n%5|5NnqC)u&a*w`_6>+BmW{MbW0dF<4l3HO5W_EYH3(t6-S z)D9eAa(ssQWA{;=n1({4=lL$CRI{mQ9!24CxA`CJ9-pu%zIL5B>xn`?>#>k&z~bY3zbQ->2Sb zQep~rdC`VM*Z+!*BmNp^dzY)NX&Re1@7i6|(!HYmZ+kC>U8q2!cMk-)GtGQ-5KR6#0+aZ0<_XYCjG;%}Xw>!vdZ!ve*gNz=#3mNO|GRAlL)kV7d7@)hn!Rl*Y zXX4qX+5gyMoHF)2xEGAKp{}%THm!mz_YhHrS3qh>63ux3E=@zqoJbl}swSdT`e#f}j8n1= zT$$kL`7Rkz3d{mbDKVtLFy(*ag1?t8iuZM&%KXu?dnb5dFxFq%OF)b zg(xUgz8ky-=!Qncv@kVo_d9#{{xuGKbd`}N1-9)Xbc;bWq&M{O{gBael|c})?FTsJ zI=1IgXp)sqz{XCOG%0A*Mkv>staTHXTOIm?A+5oXgaXsD$#d9TU1j6OH6Fe94j#Pc z9xgAfaQ*5fI_s0_mVjskMYRf0E|ZJ{r=*HFQkFLTQ2| zF-VhuXlILf_4^p7@1b(|7!3)BjJ?+{d%<`cYNKl~sFWy6#lRP|ubsn_IcB9sTIlby zUo;>m$P6mB$K?1T{?+HuuYZTZ%`4noS;J~BpqECtbmKbDf9ccoT0O#Hk0eQVxi1I| z&A_oNvMgm645*`P23e9(GA*<`Cyrtgky9iwWCF|@yeh5faY;$I6z_^WW#F?5}W&pgKJ z<|=2;og=fy5cz#k5Y!jxPU_+gIgSa{_!xh4@pk`O z_gajMjUx4eFi9w+K-V;o0?)E=J%e(|B~3G;STP(1=vskUGSO^W1Xq{V=(aYIMZ)MP)M^%aS|H*C-ORBo4!vGPcNi1L zDRGhSa<2`Iho1UTe(9h7M`jo1$qgN?C@^)2B?>G$`5+74Ew!N))G zaqc*Mipv+TP|+ogW`*7`!teHQG@Uz+AE91vveD`i#R=23299I|(B9xmB-WH>WU# zj&G!BdB`b8?wRm!puLwbe@puF6@w*Q4w{OCX@~dDeV^a?PyZUdAM@Bh|1BzyJU|$O z&{IU5V~8BhbUs+5 zee-qJmo8#h0^73jOanvLcA-z%E-^1nQ-*<$>pEDbMZed>AM`1NV3Cr_T@zx(Kqu+okB<$v_^oPFgxVCtBfM%}h|Pp?wY@LW(aahek-L6pQq zaY7t}=enpkqE<3790OGp)N55ruE!ush?HWqWHMK;QIR?kHohbAW+u6Ed4=t@EgpO1 zUbZ&Z84d%c#_BkRN4-`??7yjW#_|U!2 z?3r*c7;iuQ%K!dr3_kW@j_kjiAQi-bVZieF*LnN1zsABxKEZ*fo+0k$2vK0>3aNuu zNb&;eX-xdwr}@gKex3KW+K@z)D|H$pWh%8ASr`)eLsqvo84QNlu0_3K=l=db;`lwMQJF%THaC{8 zabR|V`Kd9AECsRqtBP)rqtWfOx%l2YOiWBOF+GWj17s$ULbBcMbK%^(RIM_N@duaq$-D8Q1faCO|b3v=y$rLkwUW# zlqjfJCZ45ZYdU5Dxo4xKhEf?}9FbcZ^W(ETxiC&uQ}hj34h5Gk-{8zs4^Wxh&wu@s zZ_{gS^U$5gS)8krCNXiCp&2HQX|l7^=jLXMoPx{`kxrRzENBl>bW3MpZl3#}`6#8C z6GXX%AvFxcz_v6TT|>7Oz6$8BuHkq4WaV*k%Oh5TSP67jv9sLe-#*>gGvVH^^zEms zqo)a`_ahW23XEMKDpS)_?B9Qa)h~UTR+v#bbQqaHAp`{mC8-$XF@N^i|G;y9`bpgS z1XH6UShhpI*J6Ebm6e+}*=e=t_PR_=j&SJc93vxDV3%o}iyUd1=$e7&Sd>c+MWJYS zBH}cq5KwVVT*snP@|c?#;lRv1JFS@Sy?L3HR*%?%L?~=cVinNZ8scgNL6Wm?vQ8GJ z#41ApgCr$ow+c&>28LJW=}-J5`%fO>mFt&TibB$OfbS0p6N4xc4Dy)5&vYQFzO9tqfTPjDBEK|jxjod)vPmj{4nGD7x43#yzJ3QHH_H@Lfompi6-S;sy zJI(s#OJq@ip$RCU$k}DBWHFkaTTYa=*K&}c_*S5)phLnPGxxviD7#myLyzy*dFNs^0fvo~|vRS#22bZvKG+7<;_CcvxUP9GyZ z`#MD`F{dWT6OG&er${**uTi;imi0>)7<4ySSXkgk&OE}Q=}|UXZ3-!84^2YZ zv8a_DY{wyv5{fitqEW>*3|ieG+uL1&Af+gBvP7W?L8)ppH9bXl5D|2IN_otcjUHDw zyVw*g*2*-h9!Zj+l8kc2qgt)AFf+o{4WE7%(f31iO;E9IeBUQjDGH5yo_U6Ycb}o& znB&00VJhVseq{`Id7L_>o=%QjWW5gkJYmmNd17}&?nO*PPt5hB93BK z+W}+s8if>Crle2_vVfA~?oRj<@RdS0G$aB$6PQvm^hyj%Hrs=cYd5z!v~Pl`T8Rr+ zud=khN)%-DI(>vnX*d>hv-???nZob1dGX~paLZ*5&W#fUA=}*{Vx~ikzs>sZKR19{&l(m%q>Glj6jrWxo`Q0NNF&~Ob6sWRGI9X4B=2*aXQ zGD-SN6n@0Q;$hk=H>gg}@PS|a2Ym6@e~XRHE>l8c8$Oz;v9ujgL>V1D3H8Mv-6+B!hm)NX?<_XsmboBxz2mT%sE$XzuR) z=%uYqys;*m>+8Jv);r)h9BDQQ2Z~lVz$rOYM;i2d1JpDs76Z>5p_XI1> z95vlz{oD^Yd-gB5_v8_N;irF^>q(g?6j;(A%Q8f=ON+N(N6peh(*( z9i%t#SzF(x-Rt7H9&w^}ckOCbT*qVO)&^^9Yxuzs0d%`V!XO}uBJ{%8ZJQQ?$&m`j z4jw=gl8si2MCH_)O;nmw#3_md0StyQnq@Ou63kAGkV#1z%nj*1HQcDo0K8co-Ymku; zXpqYsj~q=aust0|*U%gdUCXg$!R1y+D@>_dIZIpHL`t%+;c#>58rS^*p3c;;gYusAf;LMZHaP0VT9CDIiKvZNjCPwJ= zhP?U4Ii{y4IDT?JZn;7d2Be0CD!N>|be(<2PEzyAJon`nPzxuhpT39he(O1|e(Tem z7)_ZRt+O5$^s&PK__k&>hIDP4Vm;rZuqT$j8$O*D2C zck(EaJBqAL60D!)`7ix8%WK!rO^IXc+;`_u=4Ymela$V&MZ4Rh?0Fp6H-pe5?QWlL zzel^*CRH*0VT7(}6aq4pl4dDUoFa5dt>Q8#9lSuNZV#P3sFJF zxLaX#c0ZMR4XwzqYGr~nVbBS1Etguw!?8>ZO+z;=lmwObF^qzSW#YymPRT+uHEao1 z0Y$1fduxM18d9&=ba%Q~IW)({Sl!%WbA6TA5SYyxl`JIbws2*{@d?35r9|k*_)$)^ z;WE~!5vB9~xPO4z1}kOr6~O63xsWe{eHND1^bzz+j@ zg&g>IOLVs{5LPjf(n zLUQ5z&vE|if6hZc_VXNn>Vrf+%Cdvl z(_?x`Ozvs)x+c<)wEG!vpUsHhy2h*D-sI$CXYlF{mW;5XMJ`^vgo?TxoSkK>9kaQ; zMWtThg5lv>74$+e91baRn?||JcL@f4 zO190y&@&&P*gQaO{veuVlO_U0K~V^#mg8drDgD+4FMsC$Vd>oKNL}N=z8UVn=OnII zCLKyDO41)hY=nwjW~gkyTj$>-&SNrF(CG~+mmHEfMC7|YhFw45@a!~W4TnyWajUgM z7KDUhgz4Gjn!qqD97n?|HRuN+!|fKiNGaD!gh7a5dn`v^I6f8lEO!0>>Ci zR}u0za@W?xfOv)aVV{*Ff@U{akVGn!l*r2>n=nuZKYr(74Cs{gYpnEf zqCA`QPd`9?rC?JyOm06u05q5gu{!oVz zr5MN*2B3t~sQ)>U|J>9+_?D(Rpvg;YbsGjH1fB{$KE zzj+oJZ7;tg=;y6<~ybCiTHn=0dD7iu=Mr6l9vmMTkG&PiIu4h;OF!*X#ZSi_e{^vpl&sf zr6LQ_C$HzyDgcZ*rs8LqPk)P>P{kj@!RseWyIkfG5Oew=awb~4azEp$h4*b0!p%U) z?};=uU6$f>AA@jR`6;JA(br#IMrk8co1^8-q8%yIL8UN{>5VPa4Z(r~$H!qI&9T=y zhtDI$Q|9V&uo2etvAqh3eyg!eF zL8iVfIKZm7Us7zfm~LQfytVptqk@$hqC}%PPn6G7DM zs8@rH`Ub6@Sro`OnY@lcZp_Ae&kGfaE?*RJ094<`>e)ac49<(L-biEHk8x7tj=}SH zpI}o~51W(-Tzyo5L2^vbo@IB$8R5ueyPEk`6H6C(@Om!yIeLf?wP1{wGWXN*gMH1P z8Ivlm-SAKnlkxkOI_JR2V@0_1{xU9^7YWC*EomrnO&P-ip;Jr%PE{4^%b;{zwirb0 z$1Y`F3`xmt()WBL)0sx_H|VBUNWAubXPT_5r^KS$s=+vhT!_E<>h9#r*TYWbPk&85 zb9#@-+zLQHoP;sDt-*kUt>+A?@mrSP$Xw2&IcoNw7}h13YqE`>kwCYE8sUibFD7qM zjSts*_Oc)UdT1WSibgejF#a~uwFRsUzyhU95F-%Q{0H_asSGXe_W23Up!VYZEB2h5 zn-AUEBwNX~$#iiru+hnt+43{RHZ8$U8Rdq9Js_}UWcP*YF4P~p^W;U-JmkRi19J8p zNvc9Tm^y_*wfLXE$Y4T#Z>{1qnQyxjPv|8n6z%FlMv?gclELGAtFLX9>hi)gwBW?Y z->ci*lIA=Y{E6H3mVxW>w9cPEf$ApW81e%^1`7VHJS^ZXa4Pgra{8RtXcUgL`uGIC zBx6m>OPSwGxc*tN-cu6@eBrF> zb`a#x$N#~FRz(=$|AEt6_SheUZ%LPaRMmKzWQ|#NHCpy|V18!l zx6MR`VubG~9gpxY-c~LOARg^)zG41f2`ZLq|LCvlbqtS(3ry2cyPpa8g_lM}m1em>52&W*bw!(N4!8jrB%$rXaGg43~5_zhCeA)s8m|Is0ibeu)xp zB0XBA>W(gO8T#w(f5zu$Bns&d7N$O!v$0JXH^%bb;AgHAFWTQxOD;Tu(vHCIyD=hC z<@Riz^D7+xHo~v&=llE)QusKHP4;JEF!!JWCp0aX0+0Jq^oz$<30OGXFPQ%H{Kv;O zbp@YYv`TBH#fYJ}bNs}US{}s~hn4BKHD$#|l}9-Uvd@? z0UZ>gOq!)LrGlgslCcZv$s;kHO~_Hg6Zx_eOBKuj_aovtlp`}-M2ajj35kMQkZ7JV zE%`Q~XdJ5^>R?#mfSV<=fR^vpm0}Z(h%XY{&7QY!Fm!i+aV4TdEYctg<)_uHlqTIp zRm6Ft02>We2Vf$t!jf6#ab89MV@%rhaf@qsrv{2TtZJ`Jl|t33BvyRAcJyG}zm)%vH23bJ3hl=m<##fY*UNfB-%FH>s&B0xPvl}HQalJp zxUe&<=I%%Eg!;C<^N10vSaKDP_h%$3JXG1vfDD1Ku8#4FoDVytObOvV+s z8t%n=wHuns`$TGQ;GM!a1%M->p5`-{bw9E38(nB5%A|1P5NQ5oj=-Mev~5i~@=F;%|C|3*StyC+ z^D@zAS(kkKRqN(X_q&APdt8hPE^*aK^<{zOm1;k{E|X#tz`Bmk(=`iv(WCAnX| za|k+KfHOI_l9b;q`QL~i{9Z5EoDN|Qsp%)e69|*UMaE^`xK|cPYCLSBp5{cxb8EY4 zc;FbnVW{bw@jAe8;HjKco0ZUYB85B3u1vFD#|lQor9-Ka(OxnpM1bRgY+{_0>Jg-B zqW(>5Ey|g+(=bhzTdhr|Yu6xrkmYW!l+qm<%^5e9L%ZBvBEP`@h* z@Sw*yX*G`#!14WT!Dq2}aARjsOHBf{&ty&Jq#ELApv?5losB0v6lYhsFO+OM*x%?B z`NaajN2D&Z;{)}Ep!s6mYPE93ZE3s?*Kcsbnsd~r_lU2*9INEki7topB)oSerc9Fz z6X!Roy#oowigb70Ih3c7#El+zrp)9+2Ok0W(1vp4u(GNucz9dmJIWkk&hMLk_sX<; zM8dCI-_-0E@le&97Mraao9HwqZ%5|(!$+Q~{roL925dOdqa4be;77PZx1RZ}r%gZ1 zl+C724}z8b;v-pngF~m*`vQlQ&i^;H#nk2DfAfjJc;*oq8r4dfCNMwWC1Mo3Hj#^@ zQ4JYc6{uD_|ExjuC8>Ha+PfBDF=5Wmm&5L#fx9xx8~V)WcjWV6id&U zhRKb}&g9eXoM4m-XwdHmM_BOfhA5#?f#`IKL+v~$VH+q0SSMxb|I-D5R+u?FaYbUy ztnj~%k%f_S|1m^SG~2YoR^-rGh48uwf$Fnzkz0`qm3LSbyMCP_qd|#60h~akS zB$gBt)lDth{c)SnrJ{4_lbf5SZQA+e;fHl9MkuN|X_n?@!b>*4LKP`X6(7%R-NId&ynD~i` zpsGmZ?2V<=US|$n@JVfQ;2HSEWRujdD1zw&+0+ZRj^}SO(HDwbZh67F?2VpjVpZb! zLyz<&#jW!UsI_rBI>brh1tbk|g;wdkE)}U#V)4Z&`2a(P8U}8ovH+9B<B==(O;&xa=%!pP&zHf>g!;svDYn!q65YCyW?J;?x zzY`A?ab!^|Qm;UAz(tiChQ7cI3larU|IHQV|D!sXRZ%Wl9tW=hj%;T~F`KU`C;m$y zFD2pra;?N!H|-a{(0FS1?;o-X6hn?Es3gK6W%{SK8{7L8#=TtDC~I@|8%I+ z^Wv!4{u-s&9^Sm(eag&Ax<;m6Us+f?{6vJ2L!hwr+ zSBD%VCMT`RH`~Zls;&fwA$@~mEOAGu(Ka<^$-FO5_OrU3-Qn;gq#44p6>HK{NbRFA z_b8Q{H4iBNBdRL#J^gt965yi<=$HKK5@MrWW0w_ICe>v8jLf~^^X25wOhaRw$YFSV z*W^_!g_5D=Wrl{=8{}`x`~7B=!23eLn5K-DIIRQTuSoi$<7>WBO6jHr*am*B>8U^A zLA~+$^(oSx)n`dPQ_uzX!ZyUf2%G@RcYu*m@%NV?(RLa%jn0sPU&7rnR@F5Cs630c z0|>03T(gnXRkE@Ik(U^hv-6odoR8`-wYL!_F8^NYP+^x^i9=$jQeVFH>pA^{QcGL-sJ&LsWM{&A?EK6 zaf_Vt+2hN8*?&M6C+G5yjW<9lq^>E9#)A9vn}c2LU~-OT<>;G^?uKMdq|{HvgvnV= zt*NfQe(gb4;IScGcZ)5u|DeL%@J$>1`;Ao% zFRyE*gmnyX6sya5??c=S5e<~T6sXLnLB_~@ZSXVMB?%! z!kr#A(^o6|=EFyyeAfSxDEiOGVi+-Z`K;2r88p*!a?C9XM@L8bwNtbKxA6U{;>@s7 z)=2}ch;n!Mz}AQYtQW%2xLP>NrNx$?Pt^3XXn#V=`gB(Mnrt}@OHB1{;e;KM*#vlk z>x7cE+z>tu*r@R`0G92#mLBF&MgaA!)B+8J=B)EKbkc zWUM0%-g--h1vZC--rVqnxJIjeE=N8i^nckle4mp(t}aYY*M`2R7aXQ+{2N@kxXL=g z4d=q`Bc@?;o@EqIwqAemC)xg&<%TKwr7p_J;JxP)UAAI#>bH$4cvl;v`kP1P69I`Q zPRmYKJIq%qo%)7t#OD|16Z6LVAbib=6i!B!Hq9DI$RYO`Xik6`LlZo;XZ_>pf8Pmz zq?jWL`(f;5Pi!Hpx^K6M9+zfWt?s40wCJT>?Oe}NhlJ1qK?;Bl;9%z6J{nz}Hxj>G{{q==uc$INt<7>yo!a`$?(=lTj9{MJUF6$xfw2WDvgYi;p zxss-ZrsS@N@0Dafrm_ZaKG(nHeG8lhE;g^Dym^|T=^cq(WV;4TvLK86=SB$Q{dEc$l>?QR;v3S;R8fKP^%dHceTAcdV0Z8=o+z6FF+BTW5-mdBp8|pY;JU z8f2gD`jzJ>qv?^loF7CD&Hf}frbRRu(5JkW*LJa&viS;K?}%q~6`_83cm(=5l$=!( ziw1XZZ;{40717H7Yq`78(_L*qAcRXi~-H+rO(W zoSq4sX4Asr-EGiz=pT!gSf~inKR0_J64~yQUSxYIFUbJBt-# zyXqe++$qPVTZU1{(Z6U`jy|)#+B@G*DX?fSDm!urQutF8jBMnABxKl;C=ny0UkN4e z$jJcACzm*t)vJf)$3^)$#^NWMOMx?Ks6ba|MO8zI7y+Cxoy^DD#>6LR@g`4G?`2WOC^0XBwc1uPa5@*|ZgEL;D{Gh^Bs@WY@SG6-F#S#b1I~yq5!qhhQt8J&@@97Qy zZ!Vq^1`H^0Wer(no-0Ya1dbn%~1-yWFx0Zp^K^)$`XUB_7W$!7Pqo`9fyRXWT<_ChuAthfnUSohFa@s(hXr+Gm5DDMI= zP?RPENa`ln}%7nhrXpOB5;J5%M4X#=Yw`>VY9WAo4IRJCel zhaQ_L=l^q^y^1=y$Xzcbzo}|}RkYtZOglz;YdZJNHbRc|+_8--g^R;B%FPXq~ti{{74uKFewVFbJH1ddyu_Ffn&dft0G zmSGimxv69Uq@|OeHKH_P$qk2hydr8;DO7|zh?qdvxaa4~t(EUm=Ly$bzO*fE;}h;e#x#dZx@dz1nI#?Vdsm13!h2WL40l#03YiP6NxNwY94{^QCC&KIZ8$L~y&hVHPW079-d;?`P zBSIuMnvHBF^s^R;>?Yzt&DHr!%g1rG+Ug^1WC{!D&clB25pR;;wi_>xKyFI#{mpBs z_Fs)z&zKsEvWm|uG4b=AA6uP$YGQybx8meYxPoM87?Vi^Ne7(lhnOT!<#ksC0@y+1ewjqNnP~FV?mNlvP1S~<{)t87h(88}t8TI3gv|Gb zo!^rmX{6WW$-)Zbq-K`SSXt$>786S_r%45sX(7Vm31|IP*>`VlZF(#f}&TL znjSDSkwF`ERsh~WLOSbs1m}qA4vv|h>o+I&WUcj3dKH=x#ZMGkjo^ZR*jd)8njdru z1x2Cd$LbY97XKjzM@z^hVMMVi?2pG5&grhU{o%D(`0sPNcbHKfvmsQ47sT4GQe=&6 zz0f&wUb?_6s(mAXS%J1As)8g^FL(H5YUI-HJC$lgcv6gDCCXaLyg)SqB|XaJgw;i# z@j~ROX6bU;FT|=QD<@r(iRuD=|7J!@2I}-me$}94bqE9+1cnUG1&}UQc035X#-PNH zfDp_OzT^PeLBPk!Fcv~dDkS~R0yq`y_e;#CsfSQf}&BquH9F_gTk53Fo2!g_-s2m_KGh@}G zD96@Q3>+-ras2Q(;oX1j+Sx9MCd-sVEz!nkcaA6~l~D2^WoqOl|E-V*lx7oHs`I<~ zbc}flONIhzSXx^n3F!jAX@}*r;YZPb9y>Y=3fMKxD-H66GA#GDl@^76;u2&pe=2~u z;7lZ(u`s}jl?lAUCR~d_^ZC2ud&$ujN+M@i#6JJnh`m4(1D|KVA0&6bQI~cirbt}rMq5Xh}|!Vo9x$tWLZVA%IdT@vPHA9vzxZj z#oqq5d5CFD(+jHum&=ra2|Mlg%R6{Fv%NcJ37m~?(@Ps-d97d4#&r+&n0^HS?rc0TsJVhXvuVmc#vA}EY&(HaGZt_L6{wm1T@Gub)gQ5k!fby}~8JL2SSqBTL2DU3xxbmU(j zxbZe+RGdWPic)P%gG*6i0;4s{A2Grqa7D|8e5EG(G1 zaH_a!&B`iJn|50Jwsp5X(n{AAC6LR%2}cS-!}QfIyhJ-os3=zayHJdR?Q)A#s`1Ao z0b!dr^Nq4#V2@7TCHiVUr4>vq*T|w0MU9%NcMi4ra-DtVS03M-gy)-azH98$IlcxN zvMQ>StIH(H`H*R90rwy_NN6%`Wx~Uk^Vj#J)0Pvx$+p{^BcWHALHZHX=!F0keQJuZ zuQHrw6g#gA=(Biv`rc_Cr>0Ov(Yo$hx&Kj7`X|bq6cmMWL7S6X?_o?>#Lxfxvi>xd zG5w|b`@cO)6LQ5qtIF`&U)-`aH3v@!WZ{r}LOi|j%j`$&Z<~KYvUfH|11OZgH~i?q zZ=e1r8yO>7MoFY&3oHI41Cd-gxZymDMu?<|l+no{+QkK(<*cQ+hYE`LLQI3!uH-?qzMX^G{B)+h@ zYmrAuk22&&S$s?z(VI~mS_iji6{%KWXxm68m^*fYjslG8JVtapP#}dA2|$IUl{&Xr zH60oTiC#}f--+c7GP!~TPArrZ`Sp+Kg43K-nP~sRL-T*1NrGqzXbM^LNFA&}`UX`Q zhB%;Ul%%!4J*9t>71a@Va%O#Q>~HhB3|q8r3ka4BY3e2xxFtVah^+{Y@%|U5C_gJI zArs)7oJ|#4XQv%5UELO83XIDUA`!uiMc#GBAx0Zj%Hc2@p$(_O)@1p96(>F8(~r0Q z7{#K#=_=xs!elNfZ#|b)qyk-7_=AiVkj%puGlRH;0vfUsrAr`Z@k#t-y!Ckogfz-j zlnvo*Y8^&~E<3DEt)Lg_{#+braJ@%gG?#9o>{8hFA^>wRFqsT2477!^x-wZE(sxq8gN9u;9(JWi3dI1dnBG`TPxZqs#yD zj4)Wg3w_dv6A-+WXqphfe4B% zA@i=p2H1#F=7~puPV!+nF)FDv;(sSwL>S)adfh04xy?NfScCD)M`dJC|Vgf$gY>mXL;y>R;tuk;6r_rHs`wE$m+fy-x(WSd7W`7Ynppyibht zKZz$3wnpeFQdCJ<*Z50560h>~(<5fY;Z)Y>;E|hu(Inbl{Mwerct5kS5dlOeo5m^p zRvRP(XlT$u9+Yd~)`$fO_NWR;-J^cHnhqIaRSg6ZejzSXK%IK1`4ui+Sv#i+!KwJ_ zpF@WIcuGPDdYBeQNw(#Ws(~XIqRqQZRKTIJRVde?+?)jp?}b9gYehUkhZ1_x4`n`idg`ssuuqsZe?+v;UVyMHzq*sJELzqAkW+ULHBFfE(3~4M)enjOX)nDcHW268kEoF|T*Y#lhA|x;A^ZaU zSs-VGXyMy3OF6q>rMetm33^ZIIlhpTRCnc+f3@PIbb!gm&|#Q%sB1Q$m7C|4hBkobmZI$0*zT;y46I5Gx>0fzZaoO^k{tngZ_quV-nMggj2vu$XFhnY^&b6%Hw}4 z$&#Py^*v@AJ{o|lVyq1h-v&@%jUtJf7JW*(8?YYNh<6T_3}SfPu*Z^_^9g0~SH%+% zboz7}ngA4-_DHf{BV`;DvL5HIAuguI5RFSe_R>wDG7vNd)O+lm>0K{I=^(@a_`0n{mcE= zgasrsrp6YaLChs3WC35W#Vp8CB7vnTVPx-6;203if79sP)P$}Ze2Hb(;dAR|Sr)`v zBvhG1n!x0(gQoSpDif8fZbY!UNdtX1LeafLUdLzLK`jKFls@MEA-oTF}8u2c~1d(gnBq*hdIKR$WF>5sZv zSdjrTX_A3c3ZuRSmbeSFhcM^e>`_FA76aWQ9l8X{>wDlk7 zHZ5n_jm}v=(GAC9EF2v@OG2rx7EPlT+4xasbYde!J%bi0cJ%)gFLHD`5Scv8F!CO; z4D&SSU&WR7#}*Gr%LOOW;~CM3o%$nERvCpY`x1z}t$Z6M@r0|077kG}`~`=uM@~?1 zrj9&Dxdx`h2(OI~VZ#bLio>R^6vIJcG-~(?Knxw8 zqZBu4fhb5~7*ht8m)Ez6-}5YwPCEz8ihUYY0T9bwPXnFdg?nPAiQ^I$bnAp)&k}l#rok{Fx8Akom?hKIei!>Dq`L>1M%)?Sxq|26SlE!NLbY>^e;;-I z@!pfNOfYV;XTu^^gv^Q0Hp&@RB}EWf6HcyclaOQp>mSbOzqhA0{g3ZtH=dS`H!1cm$2 zuf@q95q5U8Hp>FS!NV{z$Qk!ab@mP7yXLG8GB@i3?aveTmRqmE^S107I1bxB2S|L$ zReB?p5HV?V)!2dDSV22N+XR!UMoQv6XLb}jMz(<8P2}&V=7P>^EW^RrtDpN(aSy!| zMbI+7Hx*(c=?=0U2Qd*}jsmsl_f)m`XjA|7ZuE7>zm4;s&S&R*PT}VCX(@}jOhNe0 znd91WH}iljQBg`5rmU=SzJ2WVrhTO!Z|^jGFD?iC6rXF{O-uQrYz$WAcafcMAGlqA z4xm1Dv5) zRICh3>g{o=1$Gp0CeI6ss?szWl2wQ+YTPzyXCGp-rT@X}(1jNk>oCsFt@dhwu^3>F zy!|~Zp>o8jm8ESkqkzNFd8)1#1VuQo2(Sb1QklNz0;zLdzw|hX1b-A~eK#f#Huvl3 zd6p(A(DVSU36#pQq+t$jhaV|P1crIkQK{%8Di-sIGaS+G(>YI=^kwnHXQYD`*MsM) z`k}cwWwjjRPIs@Qwxbpsi&p=`4p5CypqIWN8>;g;ac%nhEa9myFx)sG%mmVr&LoCJ|+7yn4Z<5f;nuhX_?X8>9uVc-S z%8rB=+`v6pmU5q$j$8;G!@JTQnKYd^#bJNNPCZBs*k~jWNw9c^Fq(o902X}2I8BqPxGe!T*`>sqsjgA`Uf9C%IXg85i}N{c>VHIz!-J0{FX^%`**l3+++*H)Lw-DHkO?l4W9yr zK0b&Wj~a38);qmBHFX&uBxLGOWa&L5VM{=m_i@`*XtqUejjlsi8%L#~e10o~`WttV zTmgfFPWB#IpAlA5Vt}G@lUu>MXN%LtRb^>JE^2xtR-kEQy$~%NUC*Y5JMCf)e^4=s zT2)%|#l!T3+B%q8Pd{U3F!n}>y>?J8$D4b|hPmZGynex^d*N3NID+7L8?ufwk7&JR zm~3E>`7yn8;C~{QvGk(mjxgDh_)#KE5NdW>tSrN<2G@yVwMEDo9*_%r1owbVkZs_P zG_fV)CEF2nS&Ndow8+rgfRyv(ae)?_i~`0uGmK6+PJoK&sOTt?!fzSD3!Pa-=%R|m zBvKqG%O%_KE8Nl zQYOs2fuMBO+0)F_!eR<)8>j)#IF0|xAktH#eF$sMk2B38V^?e3b&rY2EBcBBs%W7j zGl*I=46k$~Hg6yzOLd2K|#p4;R?Iu zpZTmMckJaw`t&- zSH;o{Yko8O@#oyqU0w+^bF8URKv}`LN}d>e1k)%UOXx4ko>Lr^n@7d)y-L9pK2YE6Rk}!8%7z|0&TuQnTow6 zigvk%HTr-?a%Rb8k@TuggIWWp<)NXA;J3|({|J`6Ba?1kWSXZeTC!12#HbMc%rWe~ zgSN%E8;Zn+MJHk11xzyi1#6A#L}U`;C>gRwc-=hx2TT>&3lp*_FRAF1(Fa19?T&KX z1EfE9F}({_M*ee7+6FWv5)-O8STn`=9TmzxJ_<%XByl3lMKe=|R5jr$;lk$45yR$n z(W}Fy`on38(s`6cNd*$604Z`N8M7Qc_c+s43N{?&e#vZdBGKQS30@@a35b~N_F4?! zIL1nlj}-mcR!RJKSG%vR8r`Es3~aR)OW9en5e?I%bGn~ErlYBnviWj_#d4i0Jp7D8 zjo;Kp+zscM}ESl)T2&qGloKNSYCk_+-;` z1wAUuu#Cd`8_n)a2~=~9rklqz5i{L3bP-nX_Mn?07N8Hzl zZ-XVQ%#NcdCz59@Jj;S9m6)ReOqu{@Mb-LgdI^44k^bdLI}oZ!LKCb!LcvjH*!>6} zJ70%qR#4gU5iDu8f&V~3v^ZE%*(`_}ee2bxW2t zR_nZw=j`HKYyT4$J$)KkgUgyb*!4?cV6K zXDGssJVrYH$wtSk6ggUjg8pjIbVA-DQuIj!+Qe#m(=m32gLWcM z#7+yW6)B9S?Dwp6Io$w!HjNV;6Dl=8WobRHWfuB7R0|~rYG~h;ehU`i=XEP+X6q+! zCM*AE0~7e!{@Hu@lb28lK=gSNvEZ}KYvRmHh)M(bfA{eJcRl?-yyO3W2JjBL%svbF z#H-J7ly_hFZN99lJH4*3&YfO}+FlnKxL&LfkM5DQdIL3guVakP`)95!DIz!~-m@zd zI}^uHNjIF1jMo@CFG)VbTd$K5=1zR{d+bl*CP44MwPpgwAA>yEZY+0g#Q*#a{00t$ zKk|iJ9y$-~jpm<;7^emsU;G|ex%%LmD({t#3jq(K< z>g_Xw@Ph|)>ux;mU60{a>y(IjA$*%J{9L`m+57A2+lufFM_P*GN{%KVLthU-K=f9C z+t65bhBtO);8oUa;C-du@#JriGXnbTLY@{2iN(5urR|hm_+@2EtwQsg^;>o|?;lr@ zma})Y%Rlc}WABx{y!`BtM!#1i;Uz~xE0#NN&qmxe8ROIEiFwC2zNQz2nhuenIuV-| zC4H|U2<@R0Qz#pp8Oj6`ld{jp?L*ha^QPOT!fCKy8>FkceZ}A$@8n*5ajNk%F7x+e zxAgCn$ZuiDLv_WJtqCC!UdW)Qu!B3i-I;RdzT+cb%1xxujF@$%*W*i4=sR!+5{)8q zU{wA&qOuFWm$!>Q?{0<h+i?0NpZcpH75&UVH528Lc-x5!e=a8G58sC6?e#Ra- zzJD+NTm;{u8nkt#p8dvqzx&wV#>APM*$~q|5Y)bj$`>lW$JVv{&)59{^zHFt?hFX8uQvUA z|M%46Rjc#PUwiss%30I4=4q72VYJOY|AfeRZ!$_?x$(&L{pL(a@b*mru)uIRo1@_cn% ziZ2d+V_n%qR|Ow!$#n#*t*#$m5Fa*%LVi-&dyOI9?x`2*zv%ib>bD%0Cij=#A@KO@ zekE)z&1kwu{iEHL9kb3VqcA);)d}%9cum|YF&Lvee{M@+^t#AW5K3U`B7Iw|emv|F z9*+BX_YroQVH>xZh_^dB7}_FZK6DSKxyIhot%6uB&&O zgDd-!dshDTjIUjf#_h#JULjuPnYT~Xj#sBf8}D<{D|Js~ogc+N_;V!eGbZ*dLYAO| zyq2ycd1EkfEOHo$BBL)#I^V_aJAQGXarAh7PP*-8uks7`=<$udy%eAHi;afps)DGG zEp*G2u3(nUrnEN+{nn>C>Q1jC5yzd#2`0d>MZE4DM zCv@td&n>BpxaK#Z&eOMUGZbB~k^j!l>JRyLZQo;_y*eM#66lahg|1yXc|7q+UP9H6 zWa-$Qj3-_;)}}f(TVv`{#Ffr=Yo(jm@afa{i3jtt-Z?hZJ#nV)+^&w4{q}QxyT7@^ zm2xXZp(q~FkTj9cW%{qeG~&8r96l{>1(&wjJcua$l^O#ZIP7S*uzKNYzfM%}Ip(HN zS$5=**xM^;w`J{2dVQ^EtE1KYe$?tW#5WP+c(cgw`(e|P`(e`Qd*jQg^5-I>647WN zn4uotHU<9GdsISWmdF{@UvH%Ev%6-n#2Y!b>BD%|sr*u#;`mfS;rm`CUD_e~=Q?1V zjo4=o6LPvaU?%cH6TN(m-RV38fC~dQv$5YJGxJ$cjcHeco+1|7w~e{UwlQ4yURsX7 z+&tdF8;^)SkQ?3aD?7|}KH^=J9ew#=?YQvycx)%0KNQ2yuTVh7vrZ&XzTZh-1rf1N zfQ_SA8JjmQ1(s_0gyOc;d$WG=ql?OWARX=LgvX?m<0cAJp0<@l5dC`)nYGB@jYax%Gbns4>rwA;aq0UWxcI+yH3~OC6DD==gVud z@M_!SPR4_9uUQOr^&Np*%~Q$2+*$L_{{`(dZ2lqF$mUp>_NZ&>om3-N82$g+IYi_UWaqwwvsUz0K_3V8J{7@1J z^1OFwzxyk_W7icUL^eAx&L$$wsyRM*zPAK>Ua7#1@91TB;5i z+B{CKrv+a=PhB~9bBu{{&%faPoIdtd{%y?|sYCvfH|DS9pFZ2?Xs5F|Kq*P?8Sc@tz^qJ(tvkw3g&sWD;m7m+Aim%q*yfknI9VCxe!(!DJ1FX9n1eCt*Gc;|ly!>HM>;NqoEaK(o{$?a`#;M~QjM7W;GE?)=< zZ#{*Nd|(y#{6FXO{%_yIj)@wziJjbc^}q1ezy2|UPx~j?mFM%y;Cepx#d{cwW5(|J z5+DD$$C($dL_Qx~IXH8Szjb5VDO`3@6Tke_ciHZ(<^w`vPIPvn1qMW_eD>rb;!jKzUAw>d?XGg2WVU{XzkB6s=J)h4 z@91}Ob<;cf%2gNA??Gnu-}2GZ*YmDpkLIM)U&A}EYvcId)YJYz7pGl(2zzheNcS6G z&-^EctIuSYF9<0XUh;j`TyZjc{^KH!TG&tT($l&0>mwX{(FwFa-K)zV%g4X_VHRBb zW|nl#X5hkWnfKxE@QLFJnCGJ_2f(v#32bZcV02`df4+auZ~Z3Cs>|0g_~hH(Gx^Z> z&*Ve@<1c)GtMC25?;iI2-g{u~g;#RVg;)NMa=es`RJI()`>)x^`wy}JJ<|}kR;#`! zqUhTF#cg-haWemK<;ncR@4LY7-)z9&wc#MO4_b|J=XGVPeeZ2pD z@8j~1Ud~%CzW5pI^Ym=J2YUS#pZh$QU3S@v`hYIK{PL#~rXKA2Js(`VAKZ3-DGTgN zx$Mt+w88N3{ux!^N~PkCHaLj&d%n1KKR8Dl%ryIZE;jj6F8i|z7|AW;OJ2fy5 Q2><{907*qoM6N<$g63i$!vFvP literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/thor-image-partial.png b/fldigi_doxygen/images/thor-image-partial.png new file mode 100644 index 0000000000000000000000000000000000000000..a2169676839195a7b85e2d664601f0a3bd0723bd GIT binary patch literal 17666 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 M07*qoM6N<$f>Wm$>Hq)$ literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/thor-image-xmt.png b/fldigi_doxygen/images/thor-image-xmt.png new file mode 100644 index 0000000000000000000000000000000000000000..ccb1b16b4c73a4f75cf4509d0af1774e695cc83b GIT binary patch literal 70748 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 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/thor-send-image.png b/fldigi_doxygen/images/thor-send-image.png new file mode 100644 index 0000000000000000000000000000000000000000..b784ccec30c0b4821f85ed7b47e379975d31f654 GIT binary patch literal 11394 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 b>>1mS+EfNk!TJHG3 The waterfall and digiscope will appear as: @@ -40,11 +44,6 @@ tone pairs moving through the tone filters. You can also use an alternate digiscope display (left click on the digiscope display area).
    - -\image html dominoex-1a.png "DominoEx" -\image latex dominoex-1a.png "DominoEx" width=1.0in -
    - In this display mode the red line represents the center of the multiple tone bins that are in the detector. The dots will be blurry if the AFC is not locked on and become very distinct when AFC lock has been achieved. The @@ -52,22 +51,207 @@ tone dots will move from bottom to top (opposite the direction of the waterfall).
    -This is the same signal mistuned: -
    +\section THORimage Thor Image Mode -\image html dominoex-2.png "DominoEx Mistuned" -\image latex dominoex-2.png "DominoEx Mistuned" width=6.0in -
    +fldigi-thor can send and receive images and avatars when the modem is set to 11, 16 or 22 baud. -and with the signal badly mistuned: -
    +Small digital images are selected from those stored on the disk. The image +transmission is similar to but not compatible with the IFKP image mode. +Thor images are always transmitted in a fixed width to height ratio. +The W x H format is not limited to a single ratio, nor is it limited to just +color, or just gray scale. Thor transmits the image in Blue-Green-Red +order. The thor image bandwidth is the same as the signal bandwidth for +for Thor mode in use. -\image html dominoex-3.png "DominoEx Mistuned 2" -\image latex dominoex-3.png "DominoEx Mistuned 2" width=6.0in -
    +The start of the picture is signalled digitally, and the receiver simply captures +data continuously for W lines of H pixels, as requested, resulting in a WxH pixel +image, then reception stops. +A brief period of silence, followed by a sync signal will be transmitted at the +beginning of each image or avatar. The sync signal is used to align the start of +the received image. This is the equivalent of a vertical sync signal in an +analog television signal. There is no equivalent of horizontal sync, therefore +there is no risk of the picture tearing due to timing changes, or breaking up +during selective fades. All that happens is that the image may noise up momentarily, +but will stay correctly aligned. + +Image Format + +The images are approximately in 4:3 or 3:4 aspect ratio. thor images can be received +by any thor capable decoder. + +Available image aspect ratios / formats include: + +

      +
    • 59x74 color +
    • 160x120 color +
    • 320x240 color +
    • 640x480 grey scale +
    • 640x480 color +
    • 240x300 color +
    • 240x300 grey scale +
    • 120x150 color +
    • 120x150 grey scale +
    + +These formats correspond roughly to a portrait (3x4) and landscape (4x3) photo. +fldigi will scale any computer stored image to the target image. You should +edit the images off line to be at least close to the 3x4 or 4x3 ratio. That will +prevent the fldigi loader from distorting the loaded image. + +The image mode sampling rate is the same as the base baud samplerate: +
      +
    • Thor-11 11025 samples/sec
    • +
    • Thor-16 8000 sampels/sec
    • +
    • Thor-22 11025 sampels/sec
    • +
    + +Each pixel consists of 10 samples, and there are P pixels/line. Therefore the +line period is 10 x P/sample-rate seconds, or the line rate sample-rate/(10 x P) lines/sec. +In colour, each line is sent three times, in Red-Green-Blue (RGB) order. + +The is a single sync signal sent at the beginning of each image is a tone placed 186 Hz +below the center frequency. The sync signal is 20 symbol lengths of silence followed by +20 symbol lengths of the tone. + +If the sound cards in the transmitting and receiving computers differ markedly +in sample rate, the resulting picture can be skewed. A small timing +difference is enough to cause a noticeable slant in the picture. This is easily +fixed after reception using the Slant control. High quality sound cards should +be better than 5ppm, and result in barely noticeable slant, but some cheaper +computer built-in sound modules may be rather worse. If you plan to send thor +images you should calibrate your sound card to WWV. There should be no slant if +both the transmit and receive sound cards are calibrated to WWV + +Transmit Image + +Transmitting an image in thor is initiated by selecting the "Send image" menu item +from the pop up Tx menu. Right click on the Tx panel + +
    +\image html thor-send-image.png "Send Image" +\image latex thor-send-image.png "Send Image" width=2in +
    + +This selection opens up the Send Image dialog + +
    +\image html thor-image-xmt.png "Send Image Dialog" +\image latex thor-image-xmt.png "Send Image Dialog" width=3.5in +
    + +shown with a 160x120 color image loaded and ready to transmit. + +Transmission begins when you press the "Xmt" button. fldigi will insert the text +preamble and immediately begin the image transmission. fldigi returns to the receive +mode when the image transmission is completed. + +Receive Image + +Reception is completely automatic. The decoder will identify the picture start, +and record the picture. In doing so, it automatically opens a separate "thor Rx Image" dialog. + +
    +\image html thor-image-partial.png "Image Reception" +\image latex thor-image-partial.png "Image Reception" width=3.5in +
    + +Demodulation uses a phase detection algorithm based on quadrature demodulation +using the current and previous samples. All the samples are converted to pixels and stored, +but only the average over every 10 samples is displayed. + +The raw image is stored in a temporary buffer of expanded size, which allows +fine adjustment of the slant and phase to be made before the image is sampled +and displayed. + +If the transmitting station goes off the air or reception is lost during +recording of a picture, the recording will continue until the necessary number +of samples has been made, then reception stops. + +
    +\image html thor-image-completed.png "Image Reception Completed" +\image latex thor-image-completed.png "Image Reception Completed" width=3.5in +
    + +The Rx Image dialog controls from left to right are: +- Reset: clears all rx data +- Phase adjustment: moves image left and right +- Slant adjustment: slews image diagonally +- Save: saves the image to the fldigi image folder with a date-time stamped file name +- Close: closes the image dialog + +Image phase and slant should not be adjusted before the picture reception has +finished, as then only part of the image will be corrected. + +\section thor_avatars Avatars + +Avatar images are 59 x 74 (width x height) color images that are associated with +a call sign. The avatar images are stored in the folder + +
    +C:\\Documents and Settings\\\\\fldigi.files\\avatars\\
    +C:\\Users\\\\\fldigi.files\\avatars\\
    +/home/\/.fldigi/avatars/
    +
    + +as "png" images. + +You should prepare an image file for your own call sign, in lower case. For example + +
    +/home/dave/.fldigi/avatars/w1hkj.png
    +
    + +in a 4x5 aspect ratio, preferably in the 59x74 format, but any larger 4x5 image can be used. +fldigi will scale the image to 59x74 when it is read from the file. + +You can send your avatar very simply by right clicking on the thor avatar. + +If you receive an avatar from another station it will automatically be displayed in +the avatar box. You should have previously entered the call sign of the other station in +the Call logging control. Left clicking on the avatar will then save the image in the +avatars folder with the appropriate callsign. The correct avatar will then be displayed +the next time you enter that call sign in the Call logging control. This is an example +of a received avatar with timing misalignment.
    +
    +\image html thor-avatar-1.png "received avatar" +\image latex thor-avatar-1.png "received avatar" width=1.0in +
    +
    + +The received image may be misaligned left or right in the image box. This is caused +by an error in the start timing of the reception. You can realign the image using a +combination of SHIFT, CONTROL and LEFT/RIGHT mouse clicks on the image. Be careful +to use either the SHIFT or CONTROL in combination with the mouse button. Mouse left +and right click without the SHIFT/CONTROL will cause either a save or an own avatar +transmit to occur. + +
    +CONTROL LEFT click  - move image left by 1 pixel
    +SHIFT   LEFT click  - move image left by 5 pixels
    +
    +CONTROL RIGHT click - move image right by 1 pixel
    +SHIFT   RIGHT click - move image right by 5 pixels
    +
    + +The same image after alignment. + +
    +
    +\image html thor-avatar-2.png "received avatar" +\image latex thor-avatar-2.png "received avatar" width=1.0in +
    +
    + +You will probably need to manage the avatar images using your OS file explorer. Easy +access to the image folder is obtained by the menu item File/Folders. + +The avatar image format is identical to the thor image 59x74 format. If you receive +and save a 59x74 image you can always rename the saved image (date-time-stamped) to +a \"callsign.png\" in the avatar folder. + \ref thor_page "Return to Top of Page"
    \ref main_page "Return to Main Page" diff --git a/src/Makefile.am b/src/Makefile.am index 69a2ed53..8a39ab87 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -607,6 +607,7 @@ fldigi_SOURCES += \ widgets/pwrmeter.cxx \ fsq/fsq.cxx \ ifkp/ifkp.cxx \ + ifkp/tux.cxx \ fsq/fsq_monitor.cxx \ wwv/analysis.cxx \ wwv/fftscan.cxx \ @@ -648,7 +649,6 @@ EXTRA_fldigi_SOURCES += \ ifkp/ifkp_bitmaps.cxx \ ifkp/ifkp_varicode.cxx \ ifkp/ifkp-pic.cxx \ - ifkp/tux.cxx \ mfsk/mfsk-pic.cxx \ mt63/alias_1k.dat \ mt63/alias_2k.dat \ @@ -657,6 +657,7 @@ EXTRA_fldigi_SOURCES += \ mt63/alias_k5.dat \ mt63/mt63intl.dat \ rsid/rsid_defs.cxx \ + thor/thor-pic.cxx \ trx/tune.cxx \ dialogs/guide.cxx \ libtiniconv/tiniconv.h \ diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 372b6ddf..d40f0205 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -273,6 +273,10 @@ Fl_Browser *ifkp_heard = (Fl_Browser *)0; Progress *ifkp_s2n_progress = (Progress *)0; picture *ifkp_avatar = (picture *)0; +//------------------------------------------------------------------------------ +// thor avatar +picture *thor_avatar = (picture *)0; + //------------------------------------------------------------------------------ Fl_Group *macroFrame1 = 0; @@ -1152,6 +1156,18 @@ void startup_modem(modem* m, int f) ifkp_avatar->hide(); QsoInfoFrame->redraw(); } + if ( ((id >= MODE_THOR11) && (id <= MODE_THOR22)) && + !thor_avatar->visible()) { + QsoInfoFrame2->size(QsoInfoFrame2->w() - 60, QsoInfoFrame2->h()); + thor_load_avatar(inpCall->value()); + thor_avatar->show(); + thor_avatar->redraw(); + QsoInfoFrame->redraw(); + } else if (((id < MODE_THOR11) || (id > MODE_THOR22)) && thor_avatar->visible()) { + QsoInfoFrame2->size(QsoInfoFrame2->w() + 60, QsoInfoFrame2->h()); + thor_avatar->hide(); + QsoInfoFrame->redraw(); + } } if (id == MODE_RTTY) { @@ -1271,6 +1287,14 @@ void remove_windows() ifkppicTxWin->hide(); delete ifkppicTxWin; } + if (thorpicRxWin){ + thorpicRxWin->hide(); + delete thorpicRxWin; + } + if (thorpicTxWin){ + thorpicTxWin->hide(); + delete thorpicTxWin; + } if (wefax_pic_rx_win) { wefax_pic_rx_win->hide(); delete wefax_pic_rx_win; @@ -2789,6 +2813,7 @@ if (bWF_only) return; if (new_call.empty()) { ifkp_load_avatar(); + thor_load_avatar(); return; } @@ -2808,6 +2833,10 @@ if (bWF_only) return; if (active_modem->get_mode() == MODE_IFKP) ifkp_load_avatar(inpCall->value()); + if (active_modem->get_mode() >= MODE_THOR11 && + active_modem->get_mode() <= MODE_THOR22) + thor_load_avatar(inpCall->value()); + if (!inpAZ->value()[0] && progdefaults.autofill_qso_fields) { const struct dxcc* e = dxcc_lookup(inpCall->value()); if (e) { @@ -2893,6 +2922,9 @@ void qsoClear_cb(Fl_Widget *b, void *) clear_Lookup(); if (active_modem->get_mode() == MODE_IFKP) ifkp_clear_avatar(); + if (active_modem->get_mode() >= MODE_THOR11 && + active_modem->get_mode() <= MODE_THOR22) + thor_clear_avatar(); } void qsoSave_cb(Fl_Widget *b, void *) @@ -5729,6 +5761,15 @@ void create_fl_digi_main_primary() { ifkp_load_avatar(); ifkp_avatar->hide(); + thor_avatar = new picture( + QsoInfoFrame2->x() + QsoInfoFrame2->w() - 59, Hmenu + pad, 59, 74); + thor_avatar->box(FL_FLAT_BOX); + thor_avatar->noslant(); + thor_avatar->callback(cb_thor_send_avatar); + thor_avatar->tooltip(_("Left click - save avatar\nRight click - send my avatar")); + thor_load_avatar(); + thor_avatar->hide(); + QsoInfoFrame->end(); TopFrame1->resizable(QsoInfoFrame); diff --git a/src/ifkp/ifkp-pic.cxx b/src/ifkp/ifkp-pic.cxx index 6d29a30b..33c00776 100644 --- a/src/ifkp/ifkp-pic.cxx +++ b/src/ifkp/ifkp-pic.cxx @@ -591,7 +591,6 @@ int ifkp_print_time_left(float time_sec, char *str, size_t len, // ----------------------------------------------------------------------------- // avatar send/recv // ----------------------------------------------------------------------------- -#include "tux.cxx" static Fl_Shared_Image *shared_avatar_img = (Fl_Shared_Image *)0; static unsigned char *avatar_img = (unsigned char *)0; diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index e3394577..bd9934f1 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -204,23 +204,25 @@ extern void display_fsq_mon_text(std::string text, int style = FTextBase::SKIP extern Fl_Group *ifkp_group; extern Fl_Group *ifkp_upper; extern Fl_Group *ifkp_upper_left; -extern FTextRX *ifkp_rx_text; +extern FTextRX *ifkp_rx_text; extern Fl_Group *ifkp_upper_right; -extern Fl_Browser *ifkp_heard; +extern Fl_Browser *ifkp_heard; extern Progress *ifkp_s2n_progress; extern Fl_Group *ifkp_lower; -extern FTextTX *ifkp_tx_text; -extern picture *ifkp_avatar; -int ifkp_load_avatar(std::string image_fname = "", int W=59, int H=74); -extern void ifkp_clear_avatar(); -extern void ifkp_update_avatar(unsigned char data, int pos); -extern int ifkp_get_avatar_pixel(int pos, int color); -extern void cb_ifkp_send_avatar( Fl_Widget *w, void *); +extern FTextTX *ifkp_tx_text; +extern picture *ifkp_avatar; +extern int ifkp_load_avatar(std::string image_fname = "", int W=59, int H=74); +extern void ifkp_clear_avatar(); +extern void ifkp_update_avatar(unsigned char data, int pos); +extern int ifkp_get_avatar_pixel(int pos, int color); +extern void cb_ifkp_send_avatar( Fl_Widget *w, void *); extern void cb_ifkp_heard(Fl_Browser*, void*); extern void enableSELCAL(); +extern unsigned char tux_img[]; + extern void cbFSQQTC(Fl_Widget *w, void *d); extern void cbFSQQTH(Fl_Widget *w, void *d); extern void cbFSQCQ(Fl_Widget *w, void *d); @@ -529,4 +531,16 @@ extern void log_callback(Fl_Input2 *); extern void set599(); +// thor images +extern void thor_showTxViewer(char C = 'T'); +extern Fl_Double_Window *thorpicRxWin; +extern Fl_Double_Window *thorpicTxWin; + +extern int thor_load_avatar(std::string image_fname = "", int W=59, int H=74); +extern void thor_clear_avatar(); +extern void thor_update_avatar(unsigned char data, int pos); +extern int thor_get_avatar_pixel(int pos, int color); +extern void cb_thor_send_avatar( Fl_Widget *w, void *); +extern picture *thor_avatar; + #endif diff --git a/src/include/modem.h b/src/include/modem.h index 1d6a58f8..ac1a4d1b 100644 --- a/src/include/modem.h +++ b/src/include/modem.h @@ -153,6 +153,9 @@ public: virtual void ifkp_send_image(){} virtual void ifkp_send_avatar(){} + virtual void thor_send_image(){} + virtual void thor_send_avatar(){} + void set_stopflag(bool b) { stopflag = b;}; bool get_stopflag() const { return stopflag; }; diff --git a/src/include/thor.h b/src/include/thor.h index 5d4a686b..f406e9ba 100644 --- a/src/include/thor.h +++ b/src/include/thor.h @@ -35,6 +35,9 @@ #include "dominovar.h" #include "mbuffer.h" +#include "picture.h" +#include + // NASA coefficients for viterbi encode/decode algorithms #define THOR_K 7 #define THOR_POLY1 0x6d @@ -62,6 +65,8 @@ #define THORSLOWPATHS 3 #define THORFASTPATHS 5 +#define THOR_IMAGESPP 10 + // the following constant changes if a mode with more tones than 25x4 is // created #define MAXPATHS (8 * THORFASTPATHS * THORNUMTONES ) @@ -77,7 +82,16 @@ public: TX_STATE_START, TX_STATE_DATA, TX_STATE_END, - TX_STATE_FLUSH + TX_STATE_IMAGE, + TX_STATE_AVATAR, + TX_STATE_FLUSH, + TX_STATE_RECEIVE + }; + enum THOR_STATE { + TEXT, + IMAGE_START, + IMAGE_SYNC, + IMAGE }; protected: // common variables @@ -173,6 +187,8 @@ private: bool preambledetect(int c); void softflushrx(); + void parse_pic(int); + // Tx void sendtone(int tone, int duration); void sendsymbol(int sym); @@ -194,6 +210,49 @@ public: void restart(); int rx_process(const double *buf, int len); int tx_process(); + +// support for thor image transfers +private: + double amplitude; + double pixel; + double sync; + double img_phase; + unsigned char tx_pixel; + int tx_pixelnbr; + int image_mode; +public: + int byte; + double picf; + double picpeak; + C_FIR_filter *picfilter; + Cmovavg *pixfilter; + Cmovavg *pixsyncfilter; + double phidiff; + double pic_phase; + cmplx prevz; + cmplx currz; + double image_freq[10]; + int image_counter; + int picW; + int picH; + int row; + int col; + int rgb; + int pixelnbr; + static int IMAGEspp; + int TXspp; + static std::string imageheader; + static std::string avatarheader; + std::string pic_str; + THOR_STATE state; + bool b_ava; + + void recvpic(double smpl); + void send_image(); + void send_avatar(); + void thor_send_avatar(); + void thor_send_image(); + }; #endif diff --git a/src/thor/thor-pic.cxx b/src/thor/thor-pic.cxx new file mode 100644 index 00000000..5b0233fd --- /dev/null +++ b/src/thor/thor-pic.cxx @@ -0,0 +1,829 @@ +// ---------------------------------------------------------------------------- +// thorpic.cxx -- thor image support functions +// +// Copyright (C) 2015 +// Dave Freese, W1HKJ +// +// This file is part of fldigi. Adapted from code contained in gthor source code +// distribution. +// +// Fldigi is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Fldigi is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with fldigi. If not, see . +// ---------------------------------------------------------------------------- + +#include +#include + +#include "gettext.h" +#include "fileselect.h" +#include "qrunner.h" + + +Fl_Double_Window *thorpicRxWin = (Fl_Double_Window *)0; +picture *thorpicRx = (picture *)0; +Fl_Button *btnthorRxReset = (Fl_Button *)0; +Fl_Button *btnthorRxSave = (Fl_Button *)0; +Fl_Button *btnthorRxClose = (Fl_Button *)0; +Fl_Counter *thorcnt_phase = (Fl_Counter *)0; +Fl_Counter *thorcnt_slant = (Fl_Counter *)0; + +Fl_Double_Window *thorpicTxWin = (Fl_Double_Window *)0; +picture *thorpicTx = (picture *)0; +Fl_Button *btnthorpicTransmit = (Fl_Button *)0; +Fl_Button *btnthorpicTxSendAbort = (Fl_Button *)0; +Fl_Button *btnthorpicTxLoad = (Fl_Button *)0; +Fl_Button *btnthorpicTxClose = (Fl_Button *)0; +Fl_Choice *selthorpicSize = (Fl_Choice *)0; + +void thor_showTxViewer(char c); + +Fl_Shared_Image *thorTxImg = (Fl_Shared_Image *)0; +unsigned char *thorxmtimg = (unsigned char *)0; +unsigned char *thorxmtpicbuff = (unsigned char *)0; + +#define RAWSIZE 640*(480 + 8)*3*thor::IMAGEspp + +#define RAWSTART 640*4*3*thor::IMAGEspp + +unsigned char *thor_rawvideo = 0;//[RAWSIZE + 1]; + +int thor_numpixels; +int thor_pixelptr; +int thor_rawcol; +int thor_rawrow; +int thor_rawrgb; +char thor_image_type = 'S'; + +char thor_txclr_tooltip[24]; +char thor_txgry_tooltip[24]; + +static int translate = 0; +static bool enabled = false; + +std::string thor::imageheader; +std::string thor::avatarheader; +int thor::IMAGEspp = THOR_IMAGESPP; + +void thor_correct_video() +{ + int W = thorpicRx->w(); + int H = thorpicRx->h(); + int slant = thorcnt_slant->value(); + int vidsize = W * H; + int index, rowptr, colptr; + float ratio = (((float)vidsize - (float)slant)/(float)vidsize); + unsigned char vid[W * H * 3]; + for (int row = 0; row < H; row++) { + rowptr = W * 3 * row * thor::IMAGEspp; + for (int col = 0; col < W; col++) { + colptr = thor::IMAGEspp*col; + for (int rgb = 0; rgb < 3; rgb++) { + index = ratio*(rowptr + colptr + thor::IMAGEspp*W*rgb); + index += RAWSTART - thor::IMAGEspp*thor_pixelptr; + if (index < 2) index = 2; + if (index > RAWSIZE - 2) index = RAWSIZE - 2; + vid[rgb + 3 * (col + row * W)] = thor_rawvideo[index]; + } + } + } + thorpicRx->video(vid, W*H*3); +} + +void thor_updateRxPic(unsigned char data, int pos) +{ + if (!thorpicRxWin->shown()) thorpicRx->show(); + + thorpicRx->pixel(data, pos); + + int W = thorpicRx->w(); + if (thor_image_type == 'F' || thor_image_type == 'p' || thor_image_type == 'm') { + int n = RAWSTART + thor::IMAGEspp*(thor_rawcol + W * (thor_rawrgb + 3 * thor_rawrow)); + if (n < RAWSIZE) + for (int i = 0; i < thor::IMAGEspp; i++) thor_rawvideo[n + i] = data; + thor_rawrgb++; + if (thor_rawrgb == 3) { + thor_rawrgb = 0; + thor_rawcol++; + if (thor_rawcol == W) { + thor_rawcol = 0; + thor_rawrow++; + } + } + } else + for (int i = 0; i < thor::IMAGEspp; i++) + thor_rawvideo[RAWSTART + thor::IMAGEspp*thor_numpixels + i] = data; + thor_numpixels++; + if (thor_numpixels >= (RAWSIZE - RAWSTART - thor::IMAGEspp)) + thor_numpixels = RAWSIZE - RAWSTART - thor::IMAGEspp; +} + +void cb_btnthorRxReset(Fl_Widget *, void *) +{ +// progStatus.thor_rx_abort = true; +} + +void cb_btnthorRxSave(Fl_Widget *, void *) +{ + thorpicRx->save_png(PicsDir.c_str()); +// FILE *raw = fopen("image.raw", "wb"); +// std::cout << "wrote " << fwrite(thor_rawvideo, 1, RAWSIZE, raw) << "\n"; +// fclose(raw); +} + +void cb_btnthorRxClose(Fl_Widget *, void *) +{ + thorpicRxWin->hide(); +// progStatus.thor_rx_abort = true; +// thorpicRxWin->hide(); +// FILE *raw = fopen("image.raw", "rb"); +// std::cout << "read " << fread(thor_rawvideo, 1, RAWSIZE, raw) << "\n"; +// fclose(raw); +// thor_correct_video(); +} + +void cb_thor_cnt_phase(Fl_Widget *, void *data) +{ + thor_pixelptr = thorcnt_phase->value(); + if (thor_pixelptr >= RAWSTART/thor::IMAGEspp) { + thor_pixelptr = RAWSTART/thor::IMAGEspp - 1; + thorcnt_phase->value(thor_pixelptr); + } + if (thor_pixelptr < -RAWSTART/thor::IMAGEspp) { + thor_pixelptr = -RAWSTART/thor::IMAGEspp; + thorcnt_phase->value(thor_pixelptr); + } + thor_correct_video(); +} + +void cb_thor_cnt_slant(Fl_Widget *, void *) +{ + thor_correct_video(); +} + +void thor_disableshift() +{ + if (!thorpicRxWin) return; + thorcnt_phase->deactivate(); + thorcnt_slant->deactivate(); + btnthorRxSave->deactivate(); + thorpicRxWin->redraw(); +} + +void thor_enableshift() +{ + if (!thorpicRxWin) return; + thorcnt_phase->activate(); + thorcnt_slant->activate(); + btnthorRxSave->activate(); + thorpicRxWin->redraw(); +} + +void thor_createRxViewer() +{ + + thorpicRxWin = new Fl_Double_Window(324, 274, _("thor Rx Image")); + thorpicRxWin->xclass(PACKAGE_NAME); + thorpicRxWin->begin(); + + thorpicRx = new picture(2, 2, 320, 240); + thorpicRx->noslant(); + + Fl_Group *buttons = new Fl_Group(0, thorpicRxWin->h() - 26, thorpicRxWin->w(), 26, ""); + buttons->box(FL_FLAT_BOX); + + btnthorRxReset = new Fl_Button(2, thorpicRxWin->h() - 26, 40, 24, "Reset"); + btnthorRxReset->callback(cb_btnthorRxReset, 0); + + thorcnt_phase = new Fl_Counter(46, thorpicRxWin->h() - 24, 80, 20, ""); + thorcnt_phase->step(1); + thorcnt_phase->lstep(10); + thorcnt_phase->minimum(-RAWSTART + 1); + thorcnt_phase->maximum(RAWSTART - 1); + thorcnt_phase->value(0); + thorcnt_phase->callback(cb_thor_cnt_phase, 0); + thorcnt_phase->tooltip(_("Phase correction")); + + thorcnt_slant = new Fl_Counter(140, thorpicRxWin->h() - 24, 80, 20, ""); + thorcnt_slant->step(1); + thorcnt_slant->lstep(10); + thorcnt_slant->minimum(-200); + thorcnt_slant->maximum(200); + thorcnt_slant->value(0); + thorcnt_slant->callback(cb_thor_cnt_slant, 0); + thorcnt_slant->tooltip(_("Slant correction")); + + btnthorRxSave = new Fl_Button(226, thorpicRxWin->h() - 26, 45, 24, _("Save")); + btnthorRxSave->callback(cb_btnthorRxSave, 0); + + btnthorRxClose = new Fl_Button(273, thorpicRxWin->h() - 26, 45, 24, _("Close")); + btnthorRxClose->callback(cb_btnthorRxClose, 0); + buttons->end(); + + thorpicRxWin->end(); + thorpicRxWin->resizable(thorpicRx); + + thor_numpixels = 0; +} + +void thor_showRxViewer(char itype) +{ + int W = 320; + int H = 240; + switch (itype) { + case 'L' : W = 320; H = 240; break; + case 'S' : W = 160; H = 120; break; + case 'F' : W = 640; H = 480; break; + case 'V' : W = 640; H = 480; break; + case 'P' : W = 240; H = 300; break; + case 'p' : W = 240; H = 300; break; + case 'M' : W = 120; H = 150; break; + case 'm' : W = 120; H = 150; break; + case 'T' : W = 59; H = 74; break; + } + + if (!thorpicRxWin) thor_createRxViewer(); + int winW, winH; + int thorpicX, thorpicY; + winW = W < 320 ? 324 : W + 4; + winH = H < 240 ? 274 : H + 34; + thorpicX = (winW - W) / 2; + thorpicY = (winH - 30 - H) / 2; + thorpicRxWin->size(winW, winH); + thorpicRx->resize(thorpicX, thorpicY, W, H); + thorpicRxWin->init_sizes(); + + thorpicRx->clear(); + thorpicRxWin->show(); + thor_disableshift(); + + if (thor_rawvideo == 0) thor_rawvideo = new unsigned char [RAWSIZE + 1]; + memset(thor_rawvideo, 0, RAWSIZE); + thor_numpixels = 0; + thor_pixelptr = 0; + thor_rawrow = thor_rawrgb = thor_rawcol = 0; + thor_image_type = itype; +} + +void thor_clear_rximage() +{ + thorpicRx->clear(); + thor_disableshift(); + translate = 0; + enabled = false; + thor_numpixels = 0; + thor_pixelptr = 0; + thorcnt_phase->value(0); + thorcnt_slant->value(0); + thor_rawrow = thor_rawrgb = thor_rawcol = 0; +} + +//------------------------------------------------------------------------------ +// image transmit functions +//------------------------------------------------------------------------------ + +int thor_load_image(const char *n) { + + int D = 0; + unsigned char *img_data; + int W = 640; + int H = 480; + + switch (selthorpicSize->value()) { + case 0 : W = 59; H = 74; break; + case 1 : W = 160; H = 120; break; + case 2 : W = 320; H = 240; break; + case 3 : W = 640; H = 480; break; + case 4 : W = 640; H = 480; break; + case 5 : W = 240; H = 300; break; + case 6 : W = 240; H = 300; break; + case 7 : W = 120; H = 150; break; + case 8 : W = 120; H = 150; break; + } + + if (thorTxImg) { + thorTxImg->release(); + thorTxImg = 0; + } + thorTxImg = Fl_Shared_Image::get(n, W, H); + + if (!thorTxImg) + return 0; + + if (thorTxImg->count() > 1) { + thorTxImg->release(); + thorTxImg = 0; + return 0; + } + + thorpicTx->hide(); + thorpicTx->clear(); + + img_data = (unsigned char *)thorTxImg->data()[0]; + + D = thorTxImg->d(); + + if (thorxmtimg) delete [] thorxmtimg; + + thorxmtimg = new unsigned char [W * H * 3]; + if (D == 3) + memcpy(thorxmtimg, img_data, W*H*3); + else if (D == 4) { + int i, j, k; + for (i = 0; i < W*H; i++) { + j = i*3; k = i*4; + thorxmtimg[j] = img_data[k]; + thorxmtimg[j+1] = img_data[k+1]; + thorxmtimg[j+2] = img_data[k+2]; + } + } else if (D == 1) { + int i, j; + for (i = 0; i < W*H; i++) { + j = i * 3; + thorxmtimg[j] = thorxmtimg[j+1] = thorxmtimg[j+2] = img_data[i]; + } + } else + return 0; + + char* label = strdup(n); + thorpicTxWin->copy_label(basename(label)); + free(label); +// load the thorpicture widget with the rgb image + + thorpicTx->show(); + thorpicTxWin->redraw(); + thorpicTx->video(thorxmtimg, W * H * 3); + + btnthorpicTransmit->activate(); + + return 1; +} + +void thor_updateTxPic(unsigned char data, int pos) +{ + if (!thorpicTxWin->shown()) thorpicTx->show(); + thorpicTx->pixel(data, pos); +} + +void cb_thorpicTxLoad(Fl_Widget *, void *) +{ + const char *fn = + FSEL::select(_("Load image file"), "Image\t*.{png,,gif,jpg,jpeg}\n", PicsDir.c_str()); + if (fn) + thor_load_image(fn); +} + +void thor_clear_tximage() +{ + thorpicTx->clear(); +} + +void cb_thorpicTxClose( Fl_Widget *w, void *) +{ + thorpicTxWin->hide(); +} + +int thorpic_TxGetPixel(int pos, int color) +{ + return thorxmtimg[3*pos + color]; // color = {RED, GREEN, BLUE} +} + +void cb_thorpicTransmit( Fl_Widget *w, void *) +{ + std::string header = "\npic%"; + switch (selthorpicSize->value()) { + case 0: header += 'T'; break; + case 1: header += 'S'; break; + case 2: header += 'L'; break; + case 3: header += 'F'; break; + case 4: header += 'V'; break; + case 5: header += 'P'; break; + case 6: header += 'p'; break; + case 7: header += 'M'; break; + case 8: header += 'm'; break; + } + thor::imageheader = header; + active_modem->thor_send_image(); +} + +void cb_thorpicTxSendAbort( Fl_Widget *w, void *) +{ +} + + +void cb_selthorpicSize( Fl_Widget *w, void *) +{ + switch (selthorpicSize->value()) { + case 0 : thor_showTxViewer('T'); break; + case 1 : thor_showTxViewer('S'); break; + case 2 : thor_showTxViewer('L'); break; + case 3 : thor_showTxViewer('F'); break; + case 4 : thor_showTxViewer('V'); break; + case 5 : thor_showTxViewer('P'); break; + case 6 : thor_showTxViewer('p'); break; + case 7 : thor_showTxViewer('M'); break; + case 8 : thor_showTxViewer('m'); break; + } +} + +void thor_createTxViewer() +{ + + thorpicTxWin = new Fl_Double_Window(324, 270, _("thor Send image")); + thorpicTxWin->xclass(PACKAGE_NAME); + thorpicTxWin->begin(); + + thorpicTx = new picture (2, 2, 320, 240); + thorpicTx->noslant(); + thorpicTx->hide(); + + selthorpicSize = new Fl_Choice(5, 244, 110, 24); + selthorpicSize->add("59 x 74 clr"); // case 0 + selthorpicSize->add("160x120 clr"); // case 1 + selthorpicSize->add("320x240 clr"); // case 2 + selthorpicSize->add("640x480 gry"); // case 3 + selthorpicSize->add("640x480 clr"); // case 4 + selthorpicSize->add("240x300 clr"); // case 5 + selthorpicSize->add("240x300 gry"); // case 6 + selthorpicSize->add("120x150 clr"); // case 7 + selthorpicSize->add("120x150 gry"); // case 8 + selthorpicSize->value(0); + selthorpicSize->callback(cb_selthorpicSize, 0); + + btnthorpicTxLoad = new Fl_Button(120, 244, 60, 24, _("Load")); + btnthorpicTxLoad->callback(cb_thorpicTxLoad, 0); + + btnthorpicTransmit = new Fl_Button(thorpicTxWin->w() - 130, 244, 60, 24, "Xmt"); + btnthorpicTransmit->callback(cb_thorpicTransmit, 0); + + btnthorpicTxSendAbort = new Fl_Button(thorpicTxWin->w() - 130, 244, 60, 24, "Abort Xmt"); + btnthorpicTxSendAbort->callback(cb_thorpicTxSendAbort, 0); + + btnthorpicTxClose = new Fl_Button(thorpicTxWin->w() - 65, 244, 60, 24, _("Close")); + btnthorpicTxClose->callback(cb_thorpicTxClose, 0); + + btnthorpicTxSendAbort->hide(); + btnthorpicTransmit->deactivate(); + + thorpicTxWin->end(); + +} + +void thor_showTxViewer(char c) +{ + if (!thorpicTxWin) thor_createTxViewer(); + + int winW = 644, winH = 512, W = 480, H = 320; + int thorpicX, thorpicY; + + thorpicTx->clear(); + + switch (c) { + case 'T' : + W = 59; H = 74; winW = 324; winH = 184; + selthorpicSize->value(0); + break; + case 'S' : + case 's' : + W = 160; H = 120; winW = 324; winH = 154; + selthorpicSize->value(1); + break; + case 'L' : + case 'l' : + W = 320; H = 240; winW = 324; winH = 274; + selthorpicSize->value(2); + break; + case 'F' : + W = 640; H = 480; winW = 644; winH = 514; + selthorpicSize->value(3); + break; + case 'V' : + W = 640; H = 480; winW = 644; winH = 514; + selthorpicSize->value(4); + break; + case 'P' : + W = 240; H = 300; winW = 324; winH = 334; + selthorpicSize->value(5); + break; + case 'p' : + W = 240; H = 300; winW = 324; winH = 334; + selthorpicSize->value(6); + break; + case 'M' : + W = 120; H = 150; winW = 324; winH = 184; + selthorpicSize->value(7); + break; + case 'm' : + W = 120; H = 150; winW = 324; winH = 184; + selthorpicSize->value(8); + break; + } + + thorpicTxWin->size(winW, winH); + thorpicX = (winW - W) / 2; + thorpicY = (winH - 26 - H) / 2; + thorpicTx->resize(thorpicX, thorpicY, W, H); + + selthorpicSize->resize(5, winH - 26, 110, 24); + + btnthorpicTxLoad->resize(120, winH - 26, 60, 24); + + btnthorpicTransmit->resize(winW - 130, winH - 26, 60, 24); + btnthorpicTxSendAbort->resize(winW - 130, winH - 26, 60, 24); + + btnthorpicTxClose->resize(winW -65, winH - 26, 60, 24); + + selthorpicSize->show(); + btnthorpicTransmit->show(); + btnthorpicTxLoad->show(); + btnthorpicTxClose->show(); + btnthorpicTxSendAbort->hide(); + + thorpicTxWin->show(); + +} + +void thor_deleteTxViewer() +{ + if (thorpicTxWin) thorpicTxWin->hide(); + if (thorpicTx) { + delete thorpicTx; + thorpicTx = 0; + } + delete [] thorxmtimg; + thorxmtimg = 0; + delete [] thorxmtpicbuff; + thorxmtpicbuff = 0; + if (thorpicTxWin) delete thorpicTxWin; + thorpicTxWin = 0; +} + +void thor_deleteRxViewer() +{ + if (thorpicRxWin) thorpicRxWin->hide(); + if (thorpicRx) { + delete thorpicRx; + thorpicRx = 0; + } + if (thorpicRxWin) { + delete thorpicRxWin; + thorpicRxWin = 0; + } +} + +int thor_print_time_left(float time_sec, char *str, size_t len, + const char *prefix, const char *suffix) +{ + int time_min = (int)(time_sec / 60); + time_sec -= time_min * 60; + + if (time_min) + return snprintf(str, len, "%s %02dm %2.1fs%s", + prefix, time_min, time_sec, suffix); + else + return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); +} + +// ----------------------------------------------------------------------------- +// avatar send/recv +// ----------------------------------------------------------------------------- + +static Fl_Shared_Image *shared_avatar_img = (Fl_Shared_Image *)0; +static unsigned char *avatar_img = (unsigned char *)0; +static Fl_Shared_Image *my_avatar_img = (Fl_Shared_Image *)0; +static int avatar_phase_correction = 0; +static unsigned char avatar[59 * 74 * 3]; + +void thor_clear_avatar() +{ + thor_avatar->clear(); + avatar_phase_correction = 0; + thor_numpixels = 0; + thor_rawrow = thor_rawrgb = thor_rawcol = 0; + thor_avatar->video(tux_img, 59 * 74 * 3); +} + + +// W always 59, H always 74 +int thor_load_avatar(std::string image_fname, int W, int H) +{ + if (image_fname.empty()) { + thor_clear_avatar(); + return 1; + } + + int D = 0; + unsigned char *img_data; + + if (shared_avatar_img) { + shared_avatar_img->release(); + shared_avatar_img = 0; + } + + for (size_t n = 0; n < image_fname.length(); n++) + image_fname[n] = tolower(image_fname[n]); + std::string fname = AvatarDir; + fname.append(image_fname).append(".png"); + + FILE *temp = fopen(fname.c_str(), "rb"); + if (temp) { + fseek(temp, 0L, SEEK_SET); + fclose(temp); + } else { + thor_avatar->video(tux_img, W * H * 3); + return 1; + } + + shared_avatar_img = Fl_Shared_Image::get(fname.c_str(), W, H); + +// force image to be retrieved from hard drive vice shared image memory + shared_avatar_img->reload(); + + if (!shared_avatar_img) { + thor_avatar->video(tux_img, W * H * 3); + return 1; + } + + if (shared_avatar_img->count() > 1) { + shared_avatar_img->release(); + shared_avatar_img = 0; + thor_avatar->video(tux_img, W * H * 3); + return 0; + } + + img_data = (unsigned char *)shared_avatar_img->data()[0]; + + D = shared_avatar_img->d(); + + if (avatar_img) delete [] avatar_img; + + avatar_img = new unsigned char [W * H * 3]; + if (D == 3) + memcpy(avatar_img, img_data, W*H*3); + else if (D == 4) { + int i, j, k; + for (i = 0; i < W*H; i++) { + j = i*3; k = i*4; + avatar_img[j] = img_data[k]; + avatar_img[j+1] = img_data[k+1]; + avatar_img[j+2] = img_data[k+2]; + } + } else if (D == 1) { + int i, j; + for (i = 0; i < W*H; i++) { + j = i * 3; + avatar_img[j] = avatar_img[j+1] = avatar_img[j+2] = img_data[i]; + } + } else { + thor_avatar->video(tux_img, W * H * 3); + return 0; + } + thor_avatar->video(avatar_img, W * H * 3); + + shared_avatar_img->release(); + + return 1; +} + +void thor_correct_avatar() +{ + int W = 59; + int H = 74; + int index, rowptr, colptr; + unsigned char vid[W * H * 3]; + + if (avatar_phase_correction >= RAWSTART/thor::IMAGEspp) { + avatar_phase_correction = RAWSTART/thor::IMAGEspp - 1; + } + if (avatar_phase_correction < -RAWSTART/thor::IMAGEspp) { + avatar_phase_correction = -RAWSTART/thor::IMAGEspp; + } + + for (int row = 0; row < H; row++) { + rowptr = W * 3 * row * thor::IMAGEspp; + for (int col = 0; col < W; col++) { + colptr = thor::IMAGEspp*col; + for (int rgb = 0; rgb < 3; rgb++) { + index = rowptr + colptr + W*rgb*thor::IMAGEspp; + index += RAWSTART - thor::IMAGEspp * avatar_phase_correction; + if (index < 2) index = 2; + if (index > RAWSIZE - 2) index = RAWSIZE - 2; + vid[rgb + 3 * (col + row * W)] = thor_rawvideo[index]; + } + } + } + thor_avatar->video(vid, W*H*3); +} + +void thor_update_avatar(unsigned char data, int pos) +{ + if (thor_rawvideo == 0) { + thor_rawvideo = new unsigned char [RAWSIZE + 1]; + memset(thor_rawvideo, 0, RAWSIZE); + } + + thor_avatar->pixel(data, pos); + for (int i = 0; i < thor::IMAGEspp; i++) + thor_rawvideo[RAWSTART + thor::IMAGEspp*thor_numpixels + i] = data; + + thor_numpixels++; + + if (thor_numpixels >= (RAWSIZE - RAWSTART - thor::IMAGEspp)) + thor_numpixels = RAWSIZE - RAWSTART - thor::IMAGEspp; + +} + +int thor_get_avatar_pixel(int pos, int color) +{ +// color = {RED, GREEN, BLUE} + return (int)avatar[3*pos + color]; + +} + +// ADD CALLBACK HANDLING OF PHASE CORRECTIONS + +void cb_thor_send_avatar( Fl_Widget *w, void *) +{ + if (Fl::event_button() == FL_RIGHT_MOUSE) { + if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { + if (thor_numpixels == 0) return; + avatar_phase_correction += 5; + thor_correct_avatar(); + return; + } + if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { + if (thor_numpixels == 0) return; + avatar_phase_correction++; + thor_correct_avatar(); + return; + } + std::string mycall = progdefaults.myCall; + for (size_t n = 0; n < mycall.length(); n++) + mycall[n] = tolower(mycall[n]); + std::string fname = AvatarDir; + fname.append(mycall).append(".png"); + + my_avatar_img = Fl_Shared_Image::get(fname.c_str(), 59, 74); + if (!my_avatar_img) return; + unsigned char *img_data = (unsigned char *)my_avatar_img->data()[0]; + memset(avatar, 0, sizeof(avatar)); + int D = my_avatar_img->d(); + + if (D == 3) + memcpy(avatar, img_data, 59*74*3); + else if (D == 4) { + int i, j, k; + for (i = 0; i < 59*74; i++) { + j = i*3; k = i*4; + avatar[j] = img_data[k]; + avatar[j+1] = img_data[k+1]; + avatar[j+2] = img_data[k+2]; + } + } else if (D == 1) { + int i, j; + for (i = 0; i < 59*74; i++) { + j = i * 3; + avatar[j] = avatar[j+1] = avatar[j+2] = img_data[i]; + } + } else + return; + + thor::avatarheader = "\npic%A"; + active_modem->thor_send_avatar(); + + return; + } + + if (Fl::event_button() == FL_LEFT_MOUSE) { + if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { + if (thor_numpixels == 0) return; + avatar_phase_correction -= 5; + thor_correct_avatar(); + return; + } + if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { + if (thor_numpixels == 0) return; + avatar_phase_correction--; + thor_correct_avatar(); + return; + } + std::string mycall = inpCall->value(); + if (mycall.empty()) return; + for (size_t n = 0; n < mycall.length(); n++) + mycall[n] = tolower(mycall[n]); + std::string fname = AvatarDir; + fname.append(mycall).append(".png"); + thor_avatar->save_png(fname.c_str()); + } +} + + diff --git a/src/thor/thor.cxx b/src/thor/thor.cxx index 6e075b32..b4491204 100644 --- a/src/thor/thor.cxx +++ b/src/thor/thor.cxx @@ -22,11 +22,19 @@ // along with fldigi. If not, see . // ---------------------------------------------------------------------------- + #include #include - #include +#include +#include +#include +#include +#include +#include + +#include #include "confdialog.h" #include "status.h" @@ -52,6 +60,8 @@ using namespace std; char thormsg[80]; char confidence[80]; +#include "thor-pic.cxx" + void thor::tx_init(SoundBase *sc) { scard = sc; @@ -88,6 +98,11 @@ void thor::rx_init() fec_confidence = 0; s2n_valid = false; + txstate = TX_STATE_RECEIVE; + + state = TEXT; + pic_str = " "; + img_phase = 0.0; } void thor::reset_filters() @@ -149,6 +164,8 @@ void thor::init() modem::init(); // reset_filters(); rx_init(); + imageheader.clear(); + avatarheader.clear(); set_scope_mode(Digiscope::DOMDATA); } @@ -174,6 +191,9 @@ thor::~thor() if (Dec) delete Dec; if (Enc) delete Enc; + delete picfilter; + delete pixfilter; + delete pixsyncfilter; } thor::thor(trx_mode md) : hilbert(0), fft(0), filter_reset(false) @@ -195,12 +215,14 @@ thor::thor(trx_mode md) : hilbert(0), fft(0), filter_reset(false) break; case MODE_THOR11: + cap |= CAP_IMG; symlen = 1024; doublespaced = 1; samplerate = 11025; break; case MODE_THOR22: + cap |= CAP_IMG; symlen = 512; doublespaced = 1; samplerate = 11025; @@ -253,6 +275,7 @@ thor::thor(trx_mode md) : hilbert(0), fft(0), filter_reset(false) case MODE_THOR16: default: + cap |= CAP_IMG; symlen = 512; doublespaced = 1; samplerate = 8000; @@ -318,6 +341,13 @@ thor::thor(trx_mode md) : hilbert(0), fft(0), filter_reset(false) symbolpair[0] = symbolpair[1] = 0; datashreg = 1; + picfilter = new C_FIR_filter(); + picfilter->init_lowpass(257, 1, 1.0 * bandwidth / samplerate); + + IMAGEspp = THOR_IMAGESPP; + pixfilter = new Cmovavg(IMAGEspp); + pixsyncfilter = new Cmovavg(3*IMAGEspp); + init(); } @@ -349,6 +379,41 @@ void thor::s2nreport(void) s2n_valid = false; } +void thor::parse_pic(int ch) +{ + pic_str.erase(0,1); + pic_str += ch; + b_ava = false; + image_mode = 0; + if (pic_str.find("pic%") == 0) { + switch (pic_str[4]) { + case 'A': picW = 59; picH = 74; b_ava = true; break; + case 'T': picW = 59; picH = 74; break; + case 'S': picW = 160; picH = 120; break; + case 'L': picW = 320; picH = 240; break; + case 'F': picW = 640; picH = 480; break; + case 'V': picW = 640; picH = 480; break; + case 'P': picW = 240; picH = 300; break; + case 'p': picW = 240; picH = 300; image_mode = 1; break; + case 'M': picW = 120; picH = 150; break; + case 'm': picW = 120; picH = 150; image_mode = 1; break; + default: return; + } + } else + return; + + if (b_ava) + REQ( thor_clear_avatar ); + else + REQ( thor_showRxViewer, pic_str[4]); + + image_counter = -symlen / 2; + col = row = rgb = 0; + pixsyncfilter->reset(); + pixfilter->reset(); + state = IMAGE_START; +} + void thor::recvchar(int c) { if (c == -1) @@ -356,6 +421,7 @@ void thor::recvchar(int c) if (c & 0x100) put_sec_char(c & 0xFF); else { + parse_pic(c); put_rx_char(c & 0xFF); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { if (((c & 0xFF) == SOH) && !s2n_valid) { @@ -857,6 +923,93 @@ void thor::eval_s2n() put_Status2(confidence); } +void thor::recvpic(double smpl) +{ + phidiff = 2.0 * M_PI * frequency / samplerate; + img_phase -= phidiff; + if (img_phase < 0) img_phase += 2.0 * M_PI; + + cmplx z = smpl * cmplx( cos(img_phase), sin(img_phase ) ); + picfilter->run( z, currz); + double dphase = arg(conj(prevz) * currz); + pixel = (samplerate / TWOPI) * pixfilter->run(dphase); + sync = (samplerate / TWOPI) * pixsyncfilter->run(dphase); + prevz = currz; + +//if (image_counter == - (symlen / 2)) std::cout << "IMAGE START\n"; + + image_counter++; + if (image_counter < 0) + return; + + if (state == IMAGE_START) { + if (sync < -0.59 * bandwidth) { + state = IMAGE_SYNC; +//std::cout << "IMAGE SYNC " << image_counter << "\n"; + } + return; + } + if (state == IMAGE_SYNC) { + if (sync > -0.51 * bandwidth) { + state = IMAGE; +//std::cout << "IMAGE RECV " << image_counter << "\n"; + } + return; + } + + if ((image_counter % IMAGEspp) == 0) { + byte = pixel * 256.0 / bandwidth + 128; + byte = (int)CLAMP( byte, 0.0, 255.0); + + if (image_mode == 1) { // bw transmission + pixelnbr = 3 * (col + row * picW); + if (b_ava) { + REQ(thor_update_avatar, byte, pixelnbr); + REQ(thor_update_avatar, byte, pixelnbr + 1); + REQ(thor_update_avatar, byte, pixelnbr + 2); + } else { + REQ(thor_updateRxPic, byte, pixelnbr); + REQ(thor_updateRxPic, byte, pixelnbr + 1); + REQ(thor_updateRxPic, byte, pixelnbr + 2); + } + if (++ col == picW) { + col = 0; + row++; + if (row >= picH) { + state = TEXT; + REQ(thor_enableshift); + } + } + } else { // color transmission + pixelnbr = rgb + 3 * (col + row * picW); + if (b_ava) + REQ(thor_update_avatar, byte, pixelnbr); + else + REQ(thor_updateRxPic, byte, pixelnbr); + if (++col == picW) { + col = 0; + if (++rgb == 3) { + rgb = 0; + ++row; + } + } + if (row > picH) { + state = TEXT; + REQ(thor_enableshift); + } + } +/* + amplitude *= (samplerate/2)*(.734); // sqrt(3000 / (11025/2)) + s2n = 10 * log10(snfilt->run( amplitude * amplitude / noise)); + + metric = 2 * (s2n + 20); + metric = CLAMP(metric, 0, 100.0); // -20 to +30 db range + display_metric(metric); + amplitude = 0; +*/ + } +} + int thor::rx_process(const double *buf, int len) { cmplx zref, *zp; @@ -871,60 +1024,65 @@ int thor::rx_process(const double *buf, int len) if (filter_reset) reset_filters(); while (len) { -// create analytic signal at first IF - zref = cmplx( *buf, *buf ); - buf++; - hilbert->run(zref, zref); - zref = mixer(0, zref); - - if (progdefaults.THOR_FILTER && fft) { -// filter using fft convolution - n = fft->run(zref, &zp); + if (state != TEXT) { + recvpic(*buf); } else { - zarray[0] = zref; - zp = zarray; - n = 1; - } - if (n) { - for (int i = 0; i < n; i++) { - cmplx * pipe_pipeptr_vector = pipe[pipeptr].vector ; - const cmplx zp_i = zp[i]; +// create analytic signal at first IF + zref = cmplx( *buf, *buf ); + hilbert->run(zref, zref); + zref = mixer(0, zref); + + if (progdefaults.THOR_FILTER && fft) { +// filter using fft convolution + n = fft->run(zref, &zp); + } else { + zarray[0] = zref; + zp = zarray; + n = 1; + } + + if (n) { + for (int i = 0; i < n; i++) { + cmplx * pipe_pipeptr_vector = pipe[pipeptr].vector ; + const cmplx zp_i = zp[i]; // process THORMAXFFTS sets of sliding FFTs spaced at 1/THORMAXFFTS bin intervals each of which // is a matched filter for the current symbol length - for (int k = 0; k < paths; k++) { + for (int k = 0; k < paths; k++) { // shift in frequency to base band for the sliding DFTs - const cmplx z = mixer(k + 1, zp_i ); + const cmplx z = mixer(k + 1, zp_i ); // copy current vector to the pipe interleaving the FFT vectors - binsfft[k]->run(z, pipe_pipeptr_vector + k, paths ); + binsfft[k]->run(z, pipe_pipeptr_vector + k, paths ); + } + if (--synccounter <= 0) { + synccounter = symlen; + + if (progdefaults.THOR_SOFTSYMBOLS) + currsymbol = softdecode(); + else + currsymbol = harddecode(); + + currmag = abs(pipe_pipeptr_vector[currsymbol]); + eval_s2n(); + + if (progdefaults.THOR_SOFTBITS) + softdecodesymbol(); + else + decodesymbol(); + + synchronize(); + prev2symbol = prev1symbol; + prev1symbol = currsymbol; + prev2mag = prev1mag; + prev1mag = currmag; + } + pipeptr++; + if (pipeptr >= twosym) + pipeptr = 0; } - if (--synccounter <= 0) { - synccounter = symlen; - - if (progdefaults.THOR_SOFTSYMBOLS) - currsymbol = softdecode(); - else - currsymbol = harddecode(); - - currmag = abs(pipe_pipeptr_vector[currsymbol]); - eval_s2n(); - - if (progdefaults.THOR_SOFTBITS) - softdecodesymbol(); - else - decodesymbol(); - - synchronize(); - prev2symbol = prev1symbol; - prev1symbol = currsymbol; - prev2mag = prev1mag; - prev1mag = currmag; - } - pipeptr++; - if (pipeptr >= twosym) - pipeptr = 0; } } + buf++; --len; } @@ -1042,16 +1200,24 @@ int thor::tx_process() for (int j = 0; j < 16; j++) sendsymbol(0); - sendidle(); + sendidle(); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r', 0); sendchar(2, 0); // STX sendchar('\r', 0); - txstate = TX_STATE_DATA; + txstate = TX_STATE_DATA; break; case TX_STATE_DATA: + if (imageheader.length()) { + txstate = TX_STATE_IMAGE; + break; + } + if (avatarheader.length()) { + txstate = TX_STATE_AVATAR; + break; + } i = get_tx_char(); if (i == GET_TX_CHAR_NODATA) sendsecondary(); @@ -1059,8 +1225,10 @@ int thor::tx_process() txstate = TX_STATE_END; else sendchar(i, 0); - if (stopflag) + if (stopflag) { txstate = TX_STATE_END; + stopflag = false; + } break; case TX_STATE_END: sendchar('\r', 0); @@ -1071,8 +1239,174 @@ int thor::tx_process() case TX_STATE_FLUSH: flushtx(); cwid(); + txstate = TX_STATE_RECEIVE; return -1; + case TX_STATE_IMAGE: + for (size_t n = 0; n < imageheader.length(); n++) + sendchar(imageheader[n], 0); + flushtx(); + send_image(); + txstate = TX_STATE_DATA; + break; + case TX_STATE_AVATAR: + for (size_t n = 0; n < avatarheader.length(); n++) + sendchar(avatarheader[n], 0); + flushtx(); + send_avatar(); + txstate = TX_STATE_DATA; + break; } return 0; } +// image support + +#define PHASE_CORR 20 + +void thor::send_image() { + int W = 640, H = 480; // grey scale transfer (FAX) + bool color = true; + float freq, phaseincr; + float radians = 2.0 * M_PI / samplerate; + + imageheader.clear(); + + if (!thorpicTxWin || !thorpicTxWin->visible()) { + return; + } + + switch (selthorpicSize->value()) { + case 0 : W = 59; H = 74; break; + case 1 : W = 160; H = 120; break; + case 2 : W = 320; H = 240; break; + case 3 : W = 640; H = 480; color = false; break; + case 4 : W = 640; H = 480; break; + case 5 : W = 240; H = 300; break; + case 6 : W = 240; H = 300; color = false; break; + case 7 : W = 120; H = 150; break; + case 8 : W = 120; H = 150; color = false; break; + } + + REQ(thor_clear_tximage); + + double black[symlen]; + + memset(black, 0, sizeof(*black) * symlen); + for (int i = 0; i < PHASE_CORR; i++) ModulateXmtr(black, symlen); + + freq = frequency - 0.6 * bandwidth; + phaseincr = radians * freq; + for (int i = 0; i < PHASE_CORR; i++) { + for (int n = 0; n < symlen; n++) { + black[n] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + ModulateXmtr(black, symlen); + } + + if (color == false) { // grey scale image + for (int row = 0; row < H; row++) { + memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); + for (int col = 0; col < W; col++) { + if (stopflag) return; + tx_pixelnbr = col + row * W; + tx_pixel = 0.3 * thorpic_TxGetPixel(tx_pixelnbr, 0) + // red + 0.6 * thorpic_TxGetPixel(tx_pixelnbr, 1) + // green + 0.1 * thorpic_TxGetPixel(tx_pixelnbr, 2); // blue + REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + 0); + REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + 1); + REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + 2); + freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; + phaseincr = radians * freq; + for (int n = 0; n < IMAGEspp; n++) { + outbuf[n] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + ModulateXmtr(outbuf, IMAGEspp); + Fl::awake(); + } + } + } else { + for (int row = 0; row < H; row++) { + for (int color = 0; color < 3; color++) { + memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); + for (int col = 0; col < W; col++) { + if (stopflag) return; + tx_pixelnbr = col + row * W; + tx_pixel = thorpic_TxGetPixel(tx_pixelnbr, color); + REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + color); + freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; + phaseincr = radians * freq; + for (int n = 0; n < IMAGEspp; n++) { + outbuf[n] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + ModulateXmtr(outbuf, IMAGEspp); + } + Fl::awake(); + } + } + } + +} + +void thor::thor_send_image() { + if (txstate == TX_STATE_RECEIVE) { + start_tx(); + } +} + +void thor::send_avatar() +{ + int W = 59, H = 74; + float freq, phaseincr; + float radians = 2.0 * M_PI / samplerate; + + avatarheader.clear(); + + double black[symlen]; + + memset(black, 0, sizeof(*black) * symlen); + + freq = frequency - 0.6 * bandwidth; + phaseincr = radians * freq; + for (int i = 0; i < PHASE_CORR; i++) ModulateXmtr(black, symlen); + + for (int i = 0; i < PHASE_CORR; i++) { + for (int n = 0; n < symlen; n++) { + black[n] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + ModulateXmtr(black, symlen); + } + + for (int row = 0; row < H; row++) { + for (int color = 0; color < 3; color++) { + memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); + for (int col = 0; col < W; col++) { + if (stopflag) return; + tx_pixelnbr = col + row * W; + tx_pixel = thor_get_avatar_pixel(tx_pixelnbr, color); + freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; + phaseincr = radians * freq; + for (int n = 0; n < IMAGEspp; n++) { + outbuf[n] = cos(txphase); + txphase -= phaseincr; + if (txphase < 0) txphase += TWOPI; + } + ModulateXmtr(outbuf, IMAGEspp); + } + Fl::awake(); + } + } +} + +void thor::thor_send_avatar() { + if (txstate == TX_STATE_RECEIVE) { + start_tx(); + } +} diff --git a/src/widgets/FTextRXTX.cxx b/src/widgets/FTextRXTX.cxx index a3275b3c..b74d523f 100644 --- a/src/widgets/FTextRXTX.cxx +++ b/src/widgets/FTextRXTX.cxx @@ -1279,11 +1279,16 @@ void FTextTX::menu_cb(size_t item) abort_tx(); break; case TX_MENU_MFSK16_IMG: - if (active_modem->get_mode() == MODE_IFKP) + { + trx_mode md = active_modem->get_mode(); + if (md == MODE_IFKP) ifkp_showTxViewer(); + else if (md >= MODE_THOR_FIRST && md <= MODE_THOR_LAST) + thor_showTxViewer(); else showTxViewer(0, 0); break; + } case TX_MENU_CLEAR: clear(); break; From 2516356278f49b18f5dd85d2e2ca8a9c88bad57c Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 15 Oct 2015 07:31:32 -0500 Subject: [PATCH 035/138] CW filter * Corrected implementation of CW filter bandwidth --- src/cw_rtty/cw.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cw_rtty/cw.cxx b/src/cw_rtty/cw.cxx index 4c627723..f09f2763 100644 --- a/src/cw_rtty/cw.cxx +++ b/src/cw_rtty/cw.cxx @@ -365,11 +365,12 @@ void cw::reset_rx_filter() else bandwidth = progdefaults.CWbandwidth; + double fbw = 0.5 * bandwidth / samplerate; if (use_fft_filter) { // FFT filter - cw_FFT_filter->create_lpf(progdefaults.CWspeed/(1.2 * samplerate)); + cw_FFT_filter->create_lpf(fbw); FFTphase = 0; } else { // FIR filter - cw_FIR_filter->init_lowpass (CW_FIRLEN, DEC_RATIO, progdefaults.CWspeed/(1.2 * samplerate)); + cw_FIR_filter->init_lowpass (CW_FIRLEN, DEC_RATIO, fbw); FIRphase = 0; } REQ(static_cast(&waterfall::Bandwidth), From 082564eec844b73bf320b92fb6e06e41a04f6334 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 15 Oct 2015 08:11:11 -0500 Subject: [PATCH 036/138] Version 3.23.04 * Maintenance release --- ChangeLog | 13 +++++++++++-- configure.ac | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9af7aa12..645a9207 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,18 @@ +=Version 3.23.04= + +2015-10-15 David Freese + + 345e7c0: CW filter + 7f23f3f: Update Check + 4862141: fsq abort + 3bed0e3: log merge + + =Version 3.23.03= -2015-09-28 David Freese - + 004c1e7: thor-image c3b610b: FSQ trigger bug diff --git a/configure.ac b/configure.ac index 045e2384..ebe3cef7 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) m4_define(FLDIGI_MINOR, [23]) -m4_define(FLDIGI_PATCH, [.03]) +m4_define(FLDIGI_PATCH, [.04]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.5]) From 51535ff23696cd85b1279828fd36a72fcc65b5ee Mon Sep 17 00:00:00 2001 From: John Phelps Date: Mon, 19 Oct 2015 15:42:25 -0500 Subject: [PATCH 037/138] Add 8PSK 125FL 250FL * Lowered CPU requirements to allow for use on Android/Netbook devices: - Added modes 125FL and 250FL with constraint length 13 FEC - Adjusted maximum traceback memory for viterbi decoder - Set traceback to an optimally-high value in viterbi.cxx constructor - 8PSK - 500F 1000F & 1200F now use only 1 viterbi decoder without voting - Assigned secondary RsID codes to 125FL and 250FL. * Code cleanups in psk.cxx --- src/dialogs/fl_digi.cxx | 8 +++++ src/filters/viterbi.cxx | 2 +- src/globals/globals.cxx | 2 ++ src/include/globals.h | 2 ++ src/include/modem.h | 2 ++ src/include/viterbi.h | 2 +- src/psk/psk.cxx | 77 ++++++++++++++++++++++++----------------- src/rsid/rsid_defs.cxx | 3 ++ src/trx/modem.cxx | 2 ++ 9 files changed, 67 insertions(+), 33 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index d40f0205..7facfb3c 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -553,8 +553,10 @@ static const Fl_Menu_Item quick_change_8psk[] = { { mode_info[MODE_8PSK250].name, 0, cb_init_mode, (void *)MODE_8PSK250 }, { mode_info[MODE_8PSK500].name, 0, cb_init_mode, (void *)MODE_8PSK500 }, { mode_info[MODE_8PSK1000].name, 0, cb_init_mode, (void *)MODE_8PSK1000 }, + { mode_info[MODE_8PSK125FL].name, 0, cb_init_mode, (void *)MODE_8PSK125FL }, { mode_info[MODE_8PSK125F].name, 0, cb_init_mode, (void *)MODE_8PSK125F }, { mode_info[MODE_8PSK250F].name, 0, cb_init_mode, (void *)MODE_8PSK250F }, + { mode_info[MODE_8PSK250FL].name, 0, cb_init_mode, (void *)MODE_8PSK250FL }, { mode_info[MODE_8PSK500F].name, 0, cb_init_mode, (void *)MODE_8PSK500F }, { mode_info[MODE_8PSK1000F].name, 0, cb_init_mode, (void *)MODE_8PSK1000F }, { mode_info[MODE_8PSK1200F].name, 0, cb_init_mode, (void *)MODE_8PSK1200F }, @@ -1529,7 +1531,9 @@ void init_modem(trx_mode mode, int freq) case MODE_8PSK250: case MODE_8PSK500: case MODE_8PSK1000: + case MODE_8PSK125FL: case MODE_8PSK125F: + case MODE_8PSK250FL: case MODE_8PSK250F: case MODE_8PSK500F: case MODE_8PSK1000F: @@ -4136,7 +4140,9 @@ static Fl_Menu_Item menu_[] = { { mode_info[MODE_8PSK250].name, 0, cb_init_mode, (void *)MODE_8PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500].name, 0, cb_init_mode, (void *)MODE_8PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000].name, 0, cb_init_mode, (void *)MODE_8PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, +{ mode_info[MODE_8PSK125FL].name, 0, cb_init_mode, (void *)MODE_8PSK125FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125F].name, 0, cb_init_mode, (void *)MODE_8PSK125F, 0, FL_NORMAL_LABEL, 0, 14, 0}, +{ mode_info[MODE_8PSK250FL].name, 0, cb_init_mode, (void *)MODE_8PSK250FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250F].name, 0, cb_init_mode, (void *)MODE_8PSK250F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500F].name, 0, cb_init_mode, (void *)MODE_8PSK500F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000F].name, 0, cb_init_mode, (void *)MODE_8PSK1000F, 0, FL_NORMAL_LABEL, 0, 14, 0}, @@ -6903,7 +6909,9 @@ static Fl_Menu_Item alt_menu_[] = { { mode_info[MODE_8PSK250].name, 0, cb_init_mode, (void *)MODE_8PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500].name, 0, cb_init_mode, (void *)MODE_8PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000].name, 0, cb_init_mode, (void *)MODE_8PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, +{ mode_info[MODE_8PSK125FL].name, 0, cb_init_mode, (void *)MODE_8PSK125FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125F].name, 0, cb_init_mode, (void *)MODE_8PSK125F, 0, FL_NORMAL_LABEL, 0, 14, 0}, +{ mode_info[MODE_8PSK250FL].name, 0, cb_init_mode, (void *)MODE_8PSK250FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250F].name, 0, cb_init_mode, (void *)MODE_8PSK250F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500F].name, 0, cb_init_mode, (void *)MODE_8PSK500F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000F].name, 0, cb_init_mode, (void *)MODE_8PSK1000F, 0, FL_NORMAL_LABEL, 0, 14, 0}, diff --git a/src/filters/viterbi.cxx b/src/filters/viterbi.cxx index 6a314026..ac8324e0 100644 --- a/src/filters/viterbi.cxx +++ b/src/filters/viterbi.cxx @@ -63,7 +63,7 @@ viterbi::~viterbi() void viterbi::init(void) { if(output) { - _traceback = PATHMEM - 1; + _traceback = _k * 12; // takes >= 12 constraint lengths to calculate from an arbitrary state, when punctured _chunksize = 8; for (int i = 0; i < outsize; i++) { diff --git a/src/globals/globals.cxx b/src/globals/globals.cxx index 54d99c9d..8ab786cd 100644 --- a/src/globals/globals.cxx +++ b/src/globals/globals.cxx @@ -118,8 +118,10 @@ const struct mode_info_t mode_info[NUM_MODES] = { { MODE_QPSK500, &qpsk500_modem, "QPSK500", "QPSK-500", "QPSK500", "QPSK500", "Q500", ARQ_IO | KISS_IO }, { MODE_8PSK125, &_8psk125_modem, "8PSK125", "8PSK-125", "8PSK125", "8PSK125", "8PSK125", ARQ_IO | KISS_IO }, + { MODE_8PSK125FL, &_8psk125fl_modem, "8PSK125FL", "8PSK-125FL", "8PSK125FL", "8PSK125FL", "8PSK125FL", ARQ_IO | KISS_IO }, { MODE_8PSK125F, &_8psk125f_modem, "8PSK125F", "8PSK-125F", "8PSK125F", "8PSK125F", "8PSK125F", ARQ_IO | KISS_IO }, { MODE_8PSK250, &_8psk250_modem, "8PSK250", "8PSK-250", "8PSK250", "8PSK250", "8PSK250", ARQ_IO | KISS_IO }, + { MODE_8PSK250FL, &_8psk250fl_modem, "8PSK250FL", "8PSK-250FL", "8PSK250FL", "8PSK250FL", "8PSK250FL", ARQ_IO | KISS_IO }, { MODE_8PSK250F, &_8psk250f_modem, "8PSK250F", "8PSK-250F", "8PSK250F", "8PSK250F", "8PSK250F", ARQ_IO | KISS_IO }, { MODE_8PSK500, &_8psk500_modem, "8PSK500", "8PSK-500", "8PSK500", "8PSK500", "8PSK500", ARQ_IO | KISS_IO }, { MODE_8PSK500F, &_8psk500f_modem, "8PSK500F", "8PSK-500F", "8PSK500F", "8PSK500F", "8PSK500F", ARQ_IO | KISS_IO }, diff --git a/src/include/globals.h b/src/include/globals.h index d830c4f2..dd73c48d 100644 --- a/src/include/globals.h +++ b/src/include/globals.h @@ -137,8 +137,10 @@ enum { MODE_QPSK_LAST = MODE_QPSK500, MODE_8PSK125, + MODE_8PSK125FL, MODE_8PSK125F, MODE_8PSK250, + MODE_8PSK250FL, MODE_8PSK250F, MODE_8PSK500, MODE_8PSK500F, diff --git a/src/include/modem.h b/src/include/modem.h index ac1a4d1b..7cb592ea 100644 --- a/src/include/modem.h +++ b/src/include/modem.h @@ -323,7 +323,9 @@ extern modem *_8psk1000_modem; extern modem *_8psk1200_modem; extern modem *_8psk1333_modem; +extern modem *_8psk125fl_modem; extern modem *_8psk125f_modem; +extern modem *_8psk250fl_modem; extern modem *_8psk250f_modem; extern modem *_8psk500f_modem; extern modem *_8psk1000f_modem; diff --git a/src/include/viterbi.h b/src/include/viterbi.h index 21ed1cad..6a5d6580 100644 --- a/src/include/viterbi.h +++ b/src/include/viterbi.h @@ -25,7 +25,7 @@ #ifndef VITERBI_H #define VITERBI_H -#define PATHMEM 128 +#define PATHMEM 256 class viterbi { private: diff --git a/src/psk/psk.cxx b/src/psk/psk.cxx index 5ab3b50d..af1270bf 100644 --- a/src/psk/psk.cxx +++ b/src/psk/psk.cxx @@ -80,17 +80,6 @@ extern waterfall *wf; #define K13_POLY1 016461 // 7473 #define K13_POLY2 012767 // 5623 -// Poorly performing code: Do not use -#define K9 9 -#define K9_POLY1 0677 // 447 -#define K9_POLY2 0515 // 333 - -// df=18 : correct up to 8 bits -#define K15 15 -#define K15_POLY1 044735 // 18909 -#define K15_POLY2 063057 // 26159 - - // df=19 : correct up to 9 bits #define K16 16 #define K16_POLY1 0152711 // 54729 @@ -101,7 +90,7 @@ extern waterfall *wf; // - One of the bits is still known with 100% certianty. // - Only up to 1 bit can be in error static cmplx graymapped_8psk_pos[] = { - // Degrees Bits In Mapped Soft-Symbol + // Degrees Bits In Mapped Soft-Symbol cmplx (1.0, 0.0), // 0 | 0b000 | 025,000,025 cmplx (0.7071, 0.7071), // 45 | 0b001 | 000,025,230 cmplx (-0.7071, 0.7071), // 135 | 0b010 | 025,255,025 @@ -365,6 +354,26 @@ psk::psk(trx_mode pskmode) : modem() break; // 8psk modes with FEC + case MODE_8PSK125FL: + symbollen = 128; + idepth = 384; // 1024 milliseconds + flushlength = 38; + samplerate = 16000; + _8psk = true; + dcdbits = 128; + vestigial = true; + cap |= CAP_REV; + break; + case MODE_8PSK250FL: // 250 baud | 375 bits/sec @ 1/2 Rate FEC + symbollen = 64; + idepth = 512; // 682 milliseconds + flushlength = 47; + samplerate = 16000; + _8psk = true; + dcdbits = 256; + vestigial = true; + cap |= CAP_REV; + break; case MODE_8PSK125F: symbollen = 128; idepth = 384; // 1024 milliseconds @@ -732,7 +741,7 @@ psk::psk(trx_mode pskmode) : modem() enc = new encoder(K, POLY1, POLY2); dec = new viterbi(K, POLY1, POLY2); - } else if (_pskr || mode == MODE_8PSK1200F || PSKviterbi) { + } else if (_pskr || PSKviterbi) { // FEC for BPSK. Use a 2nd Viterbi decoder for comparison. // Set decode size to 4 since some characters can be as small // as 3 bits long. This minimises intercharacters decoding @@ -743,27 +752,26 @@ psk::psk(trx_mode pskmode) : modem() dec2 = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); dec2->setchunksize(4); - } else if (_puncturing) { - // Use the FEC code best suited for puncturing - enc = new encoder(K13, K13_POLY1, K13_POLY2); - dec = new viterbi(K13, K13_POLY1, K13_POLY2); - // long constraint length codes require long traceback - dec->settraceback (PATHMEM); - dec->setchunksize(4); - dec2 = new viterbi(K13, K13_POLY1, K13_POLY2); - dec2->settraceback (PATHMEM); - dec2->setchunksize(4); - - } else if (_xpsk || _8psk || _16psk) { - // Use the code with the best FEC capabilities + } else if (mode == MODE_8PSK125F || mode == MODE_8PSK250F) { enc = new encoder(K16, K16_POLY1, K16_POLY2); dec = new viterbi(K16, K16_POLY1, K16_POLY2); - // long constraint length codes require long traceback - dec->settraceback (PATHMEM); dec->setchunksize(4); - dec2 = new viterbi(K16, K16_POLY1, K16_POLY2); - dec2->settraceback (PATHMEM); + dec2 = new viterbi(K13, K16_POLY1, K16_POLY2); dec2->setchunksize(4); + + } else if (_xpsk || _8psk || _16psk) { + enc = new encoder(K13, K13_POLY1, K13_POLY2); + dec = new viterbi(K13, K13_POLY1, K13_POLY2); + dec->setchunksize(4); + // Second viterbi decoder is only needed when modem has an odd number of bits/symbol. + if ( _8psk && !_puncturing ) { // (punctured 8psk has 3-real bits + 1-punctured bit per transmitted symbol) + dec2 = new viterbi(K13, K13_POLY1, K13_POLY2); + dec2->setchunksize(4); + } + if (_puncturing) { // punctured codes benefit from a longer traceback + dec->settraceback(K13 * 16); + if (dec2) dec2->settraceback(K13 * 16); + } } // Interleaver. For PSKR to maintain constant time delay between bits, @@ -773,7 +781,7 @@ psk::psk(trx_mode pskmode) : modem() Txinlv = new interleave (isize, idepth, INTERLEAVE_FWD); Rxinlv = new interleave (isize, idepth, INTERLEAVE_REV); - Rxinlv2 = new interleave (isize, idepth, INTERLEAVE_REV); + if (dec2) Rxinlv2 = new interleave (isize, idepth, INTERLEAVE_REV); bitshreg = 0; rxbitstate = 0; @@ -962,6 +970,13 @@ void psk::rx_pskr(unsigned char symbol) // fecmet2 = -9999.0; // return; // } + // XPSK and 16PSK have even number of bits/symbol + // Punctured 8PSK has even number of bits/symbol (3 real + 1 punctured) + // so bit order known: can use only one decoder to reduce CPU usage + if ( _xpsk || _16psk || (_8psk && _puncturing) ) { + fecmet2 = -9999.0; + return; + } // copy to avoid scrambling symbolpair for the next bit twosym[0] = symbolpair[0]; twosym[1] = symbolpair[1]; diff --git a/src/rsid/rsid_defs.cxx b/src/rsid/rsid_defs.cxx index f4eaa324..f15dd9a3 100644 --- a/src/rsid/rsid_defs.cxx +++ b/src/rsid/rsid_defs.cxx @@ -288,6 +288,9 @@ const int cRsId::rsid_ids_size1 = sizeof(rsid_ids_1)/sizeof(*rsid_ids_1) - 1; ELEM2_(1078, PSK8P1000F, MODE_8PSK1000F) \ ELEM2_(1058, PSK8P1200F, MODE_8PSK1200F) \ \ + ELEM2_(1239, PSK8P125FL, MODE_8PSK125FL) \ + ELEM2_(2052, PSK8P250FL, MODE_8PSK250FL) \ + \ ELEM2_(1171, IFKP, MODE_IFKP) \ \ ELEM2_(0, NONE2, NUM_MODES) diff --git a/src/trx/modem.cxx b/src/trx/modem.cxx index e3f9a318..200def01 100644 --- a/src/trx/modem.cxx +++ b/src/trx/modem.cxx @@ -102,7 +102,9 @@ modem *_8psk1000_modem = 0; modem *_8psk1200_modem = 0; modem *_8psk1333_modem = 0; +modem *_8psk125fl_modem = 0; modem *_8psk125f_modem = 0; +modem *_8psk250fl_modem = 0; modem *_8psk250f_modem = 0; modem *_8psk500f_modem = 0; modem *_8psk1000f_modem = 0; From d6a34a40f1575bdaf9be61499fec63378a8b1991 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 28 Oct 2015 09:37:43 -0500 Subject: [PATCH 038/138] NAVTEX/SYNOP/KML * suppress info messages during prog start - prodigiuous use of LOG_INFO increases difficulty of debugging other aspects of fldigi - enable the INFO messages for debugging or to observe program flow by setting command line flag -more-info ; case is significant --- src/include/fl_digi.h | 2 + src/main.cxx | 12 +- src/misc/kmlserver.cxx | 204 ++++++++++++++++++++------------ src/misc/record_loader.cxx | 20 +++- src/synop-src/synop.cxx | 234 ++++++++++++++++++++----------------- 5 files changed, 285 insertions(+), 187 deletions(-) diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index bd9934f1..92d590ea 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -57,6 +57,8 @@ extern Fl_Double_Window *dlgRecordLoader; extern bool first_use; +extern bool bMOREINFO; + extern FTextRX *ReceiveText; extern FTextTX *TransmitText; extern pskBrowser *mainViewer; diff --git a/src/main.cxx b/src/main.cxx index 0aead6ac..385afcf7 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -179,6 +179,7 @@ FILE *client; bool mailserver = false, mailclient = false, arqmode = false; static bool show_cpucheck = false; static bool iconified = false; +bool bMOREINFO = false; string option_help, version_text, build_text; @@ -308,7 +309,7 @@ static void auto_start() // reset those default values that have been overriden by a command line parameter void check_overrides() { - if (xmlrpc_address_override_flag) + if (xmlrpc_address_override_flag) progdefaults.xmlrpc_address = override_xmlrpc_address; if (xmlrpc_port_override_flag) progdefaults.xmlrpc_port = override_xmlrpc_port; @@ -1020,6 +1021,7 @@ int parse_args(int argc, char **argv, int& idx) #if USE_PORTAUDIO OPT_FRAMES_PER_BUFFER, #endif + OPT_MORE_INFO, OPT_NOISE, OPT_DEBUG_LEVEL, OPT_DEBUG_PSKMAIL, OPT_DEBUG_AUDIO, OPT_EXIT_AFTER, OPT_DEPRECATED, OPT_HELP, OPT_VERSION, OPT_BUILD_INFO }; @@ -1078,6 +1080,7 @@ int parse_args(int argc, char **argv, int& idx) #if USE_PORTAUDIO { "frames-per-buffer",1, 0, OPT_FRAMES_PER_BUFFER }, #endif + { "more-info", 1, 0, OPT_MORE_INFO }, { "exit-after", 1, 0, OPT_EXIT_AFTER }, { "noise", 0, 0, OPT_NOISE }, @@ -1295,6 +1298,10 @@ int parse_args(int argc, char **argv, int& idx) break; #endif // USE_PORTAUDIO + case OPT_MORE_INFO: + bMOREINFO = true; + break; + case OPT_EXIT_AFTER: Fl::add_timeout(strtod(optarg, 0), exit_cb); break; @@ -1737,7 +1744,8 @@ void kml_init(bool load_files) custData ); } catch( const std::exception & exc ) { - LOG_WARN("Cannot publish user position:%s", exc.what() ); + +;// LOG_WARN("Cannot publish user position:%s", exc.what() ); } } diff --git a/src/misc/kmlserver.cxx b/src/misc/kmlserver.cxx index 5623050c..3ea3bc37 100644 --- a/src/misc/kmlserver.cxx +++ b/src/misc/kmlserver.cxx @@ -45,6 +45,7 @@ #include "threads.h" #include "strutil.h" #include "configuration.h" +#include "fl_digi.h" #include "irrXML.h" @@ -100,7 +101,7 @@ static time_t KmlFromTimestamp( const char * ts ) { /// So all fields are initialised with correct default values. time_t timNow = time(NULL); - tm objTm = *gmtime( &timNow ); + tm objTm = *gmtime( &timNow ); int r = sscanf( ts, "%4d-%02d-%02dT%02d:%02dZ", &objTm.tm_year, @@ -203,7 +204,7 @@ static void KmlHeader( std::ostream & ostrm, const std::string & title ) { } /// Appended at the end of each KML document. -static const char KmlFooter[] = +static const char KmlFooter[] = "\n" "\n" ; @@ -260,7 +261,7 @@ class KmlSrvImpl : public KmlServer { ostrm << "<" FLDIGI_TAG_ITM " " FLDIGI_TAG_KEY "=\"" << it->first << "\" " FLDIGI_TAG_VAL "=\""; StripHtmlTags(ostrm,it->second); - ostrm << "\" />"; + ostrm << "\" />"; } ostrm << "\n" ; } @@ -320,7 +321,8 @@ class KmlSrvImpl : public KmlServer { if( ( 0 == strncmp( str, namStyles.c_str(), sz ) ) && ( str[sz] == '#' ) ) { m_styleNam = str + sz + 1; } else { - LOG_INFO("Inconsistent URL style:%s",str ); + if (bMOREINFO) + LOG_INFO("Inconsistent URL style:%s",str ); m_styleNam = str ; } } @@ -410,7 +412,8 @@ class KmlSrvImpl : public KmlServer { // There should be at least one event. if( beEvt == enEvt ) { - LOG_WARN("Inconsistency: No event kmlId=%s",m_kmlId.c_str() ); + if (bMOREINFO) + LOG_WARN("Inconsistency: No event kmlId=%s",m_kmlId.c_str() ); return ; } @@ -611,7 +614,8 @@ class KmlSrvImpl : public KmlServer { /// this key, and this iterator is forward_iterator only. iterator it = find( refVL.first ), en = end() ; if( it == en ) { - // LOG_INFO("Cannot find '%s'", refVL.first.c_str() ); + if (bMOREINFO) + LOG_INFO("Cannot find '%s'", refVL.first.c_str() ); it = insert( end(), refVL ); return; } @@ -639,7 +643,8 @@ class KmlSrvImpl : public KmlServer { return ; } - // LOG_INFO("Inserted '%s' merge_dist=%lf", refVL.first.c_str(), dist ); + if (bMOREINFO) + LOG_INFO("Inserted '%s' merge_dist=%lf", refVL.first.c_str(), dist ); /// The object is inserted at the end of all elements with the same key. iterator ret = insert( next, refVL ); @@ -677,7 +682,8 @@ class KmlSrvImpl : public KmlServer { /// Called by the subthread. It can merge data of placemarks with the same name /// and different positions due to a move. This has to be very fast because under lock protection. void FlushQueue(double merge_dist) { - // LOG_INFO("FlushQueue nbelts %d sz=%d", m_queue_to_insert.size(), size() ); + if (bMOREINFO) + LOG_INFO("FlushQueue nbelts %d sz=%d", m_queue_to_insert.size(), size() ); if( m_queue_to_insert.empty() ) return ; @@ -685,7 +691,8 @@ class KmlSrvImpl : public KmlServer { { DirectInsert( *itPL, merge_dist ); } - // LOG_INFO("Flushed into sz=%d", size() ); + if (bMOREINFO) + LOG_INFO("Flushed into sz=%d", size() ); // TODO: If lock contention problems, we might swap this list with another one owned by this // objet. This would later be merged into the container before saving data to disk. @@ -715,8 +722,10 @@ class KmlSrvImpl : public KmlServer { /// Cleanup all data older than this. time_t limit_time = now - retention_delay * seconds_per_hour ; - LOG_INFO("sz=%d retention=%d hours now=%s limit=%s", - (int)size(), retention_delay, KmlTimestamp(now).c_str(), KmlTimestamp(limit_time).c_str() ); + if (bMOREINFO) + LOG_INFO("sz=%d retention=%d hours now=%s limit=%s", + (int)size(), retention_delay, + KmlTimestamp(now).c_str(), KmlTimestamp(limit_time).c_str() ); size_t nbFullErased = 0 ; size_t nbPartErased = 0 ; @@ -737,8 +746,9 @@ class KmlSrvImpl : public KmlServer { // Maybe the container only lost data because of data expiration, so it must be saved. bool must_save_now = m_must_save || ( nbFullErased > 0 ) || ( nbPartErased > 0 ) ; - LOG_INFO("Sz=%d FullyErased=%d PartialErased=%d m_must_save=%d must_save_now=%d", - (int)size(), (int)nbFullErased, (int)nbPartErased, m_must_save, must_save_now ); + if (bMOREINFO) + LOG_INFO("Sz=%d FullyErased=%d PartialErased=%d m_must_save=%d must_save_now=%d", + (int)size(), (int)nbFullErased, (int)nbPartErased, m_must_save, must_save_now ); m_must_save = must_save_now ; } @@ -758,7 +768,8 @@ class KmlSrvImpl : public KmlServer { /// For safety purpose, we do not empty the file. It might be an error. if( empty() ) { - LOG_INFO("Should empty KML file %s. Grace period.", kmlFilNam.c_str() ); + if (bMOREINFO) + LOG_INFO("Should empty KML file %s. Grace period.", kmlFilNam.c_str() ); return false ; } @@ -822,7 +833,9 @@ class KmlSrvImpl : public KmlServer { ar << KmlFooter ; - LOG_INFO("Saved %s: %d placemarks to %s", category.c_str(), nbPlacemarks, kmlFilNam.c_str() ); + if (bMOREINFO) + LOG_INFO("Saved %s: %d placemarks to %s", + category.c_str(), nbPlacemarks, kmlFilNam.c_str() ); return true ; } // KmlSrvImpl::PlacesMapT::RewriteKmlFileOneCategory @@ -855,7 +868,7 @@ class KmlSrvImpl : public KmlServer { /// This points to the specific KML file of the category. void CategoryNetworkLink( std::ostream & strm, const std::string & category ) const { - strm << + strm << "\n" " " << category << "\n" " \n" @@ -880,17 +893,20 @@ class KmlSrvImpl : public KmlServer { /// If the file is there, leave as it is because it is maybe customize. if( filDst ) { - LOG_INFO("Style file %s not altered", namDst.c_str() ); + if (bMOREINFO) + LOG_INFO("Style file %s not altered", namDst.c_str() ); goto close_and_quit ; } filDst = fopen( namDst.c_str(), "w" ); if( filDst == NULL ) { - LOG_INFO("Cannot open destination style file %s", namDst.c_str() ); + if (bMOREINFO) + LOG_INFO("Cannot open destination style file %s", namDst.c_str() ); goto close_and_quit ; } filSrc = fopen( namSrc.c_str(), "r" ); if( filSrc == NULL ) { - LOG_INFO("Cannot open source style file %s", namSrc.c_str() ); + if (bMOREINFO) + LOG_INFO("Cannot open source style file %s", namSrc.c_str() ); goto close_and_quit ; } @@ -905,7 +921,8 @@ class KmlSrvImpl : public KmlServer { goto close_and_quit ; } } - LOG_INFO("Style file %s copied to %s", namSrc.c_str(), namDst.c_str() ); + if (bMOREINFO) + LOG_INFO("Style file %s copied to %s", namSrc.c_str(), namDst.c_str() ); close_and_quit: if( filDst ) fclose(filDst); if( filSrc ) fclose(filSrc); @@ -916,7 +933,8 @@ class KmlSrvImpl : public KmlServer { // This is the file, that the user must click on. std::string baseFil = m_kml_dir + "fldigi.kml" ; - LOG_INFO("Creating baseFil=%s", baseFil.c_str() ); + if (bMOREINFO) + LOG_INFO("Creating baseFil=%s", baseFil.c_str() ); /// We do not need to make this file atomic because it is read once only. AtomicRenamer ar( baseFil ); @@ -947,7 +965,7 @@ class KmlSrvImpl : public KmlServer { "\n"; double dist = 0.0 ; int nbStops = 0 ; - // "135.2, 35.4, 0. + // "135.2, 35.4, 0. for(;;) { beg->second.WriteCooSub( ostrm ); ostrm << "\n"; @@ -980,7 +998,8 @@ class KmlSrvImpl : public KmlServer { : m_filnam( filnam ) , m_filtmp( filnam + ".tmp" ) { - // LOG_INFO("AtomicRenamer opening tmp %s", filnam.c_str() ); + if (bMOREINFO) + LOG_INFO("AtomicRenamer opening tmp %s", filnam.c_str() ); open( m_filtmp.c_str() ); if( bad() ) { LOG_WARN("Cannot open %s", m_filtmp.c_str() ); @@ -1069,7 +1088,8 @@ class KmlSrvImpl : public KmlServer { void ReloadSingleKmlFile( const std::string & category ) { std::string kmlFilNam = CategFile( category ); - LOG_INFO("kmlFilNam=%s m_merge_dist=%lf", kmlFilNam.c_str(), m_merge_dist ); + if (bMOREINFO) + LOG_INFO("kmlFilNam=%s m_merge_dist=%lf", kmlFilNam.c_str(), m_merge_dist ); PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); @@ -1124,19 +1144,19 @@ class KmlSrvImpl : public KmlServer { const char * msgTxt = xml->getNodeData(); LOG_DEBUG( "getNodeData=%s currState=%s", msgTxt, KmlRdToStr(currState) ); switch(currState) { - case KMLRD_FOLDER_NAME : + case KMLRD_FOLDER_NAME : currFolderName = msgTxt ? msgTxt : "NullFolder"; break; - case KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES : + case KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES : currPM.SetCoordinates(msgTxt); break; - case KMLRD_FOLDER_PLACEMARK_NAME : + case KMLRD_FOLDER_PLACEMARK_NAME : currPlcmrkName = msgTxt ? msgTxt : "NullPlacemarkName"; break; - case KMLRD_FOLDER_PLACEMARK_SNIPPET : + case KMLRD_FOLDER_PLACEMARK_SNIPPET : currPlacemarkDescr = msgTxt ? msgTxt : "NullSnippet"; break; - case KMLRD_FOLDER_PLACEMARK_STYLEURL : + case KMLRD_FOLDER_PLACEMARK_STYLEURL : currPM.SetStyle(msgTxt); break; default: @@ -1148,7 +1168,8 @@ class KmlSrvImpl : public KmlServer { if( ! avoidNode.empty() ) break ; const char *nodeName = xml->getNodeName(); - // LOG_INFO( "getNodeName=%s currState=%s", nodeName, KmlRdToStr(currState) ); + if (bMOREINFO) + LOG_INFO( "getNodeName=%s currState=%s", nodeName, KmlRdToStr(currState) ); // TODO: Have a hashmap for each case. switch(currState) { case KMLRD_NONE : @@ -1160,12 +1181,13 @@ class KmlSrvImpl : public KmlServer { strcmp( "Document", nodeName ) && strcmp( "name", nodeName ) ) { + if (bMOREINFO) LOG_INFO("Unexpected %s in document %s. currState=%s", - nodeName, category.c_str(), KmlRdToStr(currState) ); + nodeName, category.c_str(), KmlRdToStr(currState) ); } } break; - case KMLRD_FOLDER : + case KMLRD_FOLDER : if (!strcmp("name", nodeName)) { currState = KMLRD_FOLDER_NAME ; } @@ -1178,11 +1200,12 @@ class KmlSrvImpl : public KmlServer { else { avoidNode = nodeName ; currState = KMLRD_FOLDER_UNDEFINED ; - LOG_INFO("Unexpected %s in folder %s. currState=%s", - nodeName, currFolderName.c_str(), KmlRdToStr(currState) ); + if (bMOREINFO) + LOG_INFO("Unexpected %s in folder %s. currState=%s", + nodeName, currFolderName.c_str(), KmlRdToStr(currState) ); } break; - case KMLRD_FOLDER_PLACEMARK : + case KMLRD_FOLDER_PLACEMARK : // There are different sorts of Placemark such as Point or LineString. if (!strcmp("Point", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_POINT ; @@ -1214,18 +1237,20 @@ class KmlSrvImpl : public KmlServer { // Other occurences of the same nodes will not be signaled. if( pr.second ) { - LOG_INFO("Unexpected %s in placemark id=%s name=%s. currState=%s", + if (bMOREINFO) + LOG_INFO("Unexpected %s in placemark id=%s name=%s. currState=%s", nodeName, currPM.KmlId().c_str(), currPlcmrkName.c_str(), KmlRdToStr(currState) ); } } break; - case KMLRD_FOLDER_PLACEMARK_POINT : + case KMLRD_FOLDER_PLACEMARK_POINT : if (!strcmp("coordinates", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES ; } else { - LOG_INFO("Unexpected %s in coordinates. currState=%s", + if (bMOREINFO) + LOG_INFO("Unexpected %s in coordinates. currState=%s", nodeName, KmlRdToStr(currState) ); } break; @@ -1235,7 +1260,10 @@ class KmlSrvImpl : public KmlServer { currTimestamp = KmlFromTimestamp( xml->getAttributeValue(FLDIGI_TIMESTAMP) ); currCustData.clear(); } - else LOG_INFO("Unexpected %s in extended data. currState=%s", nodeName, KmlRdToStr(currState) ); + else + if (bMOREINFO) + LOG_INFO("Unexpected %s in extended data. currState=%s", + nodeName, KmlRdToStr(currState) ); break; case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT: // http://irrlicht.sourceforge.net/forum/viewtopic.php?t=10532 @@ -1246,17 +1274,22 @@ class KmlSrvImpl : public KmlServer { assert( xml->isEmptyElement() ); const char * strKey = xml->getAttributeValue(FLDIGI_TAG_KEY); if(strKey == NULL ) { - LOG_INFO("Null item key"); + if (bMOREINFO) + LOG_INFO("Null item key"); break ; } const char * strVal = xml->getAttributeValue(FLDIGI_TAG_VAL); if(strVal == NULL ) { - LOG_INFO("Null item value"); + if (bMOREINFO) + LOG_INFO("Null item value"); break ; } currCustData.Push( strKey, strVal ); } - else LOG_INFO("Unexpected %s in event. currState=%s", nodeName, KmlRdToStr(currState) ); + else + if (bMOREINFO) + LOG_INFO("Unexpected %s in event. currState=%s", + nodeName, KmlRdToStr(currState) ); break; default: break; @@ -1267,19 +1300,23 @@ class KmlSrvImpl : public KmlServer { if( ! avoidNode.empty() ) { const char * msgTxt = xml->getNodeData(); if( avoidNode == msgTxt ) { - // LOG_INFO("Leaving forbidden element %s. currState=%s", avoidNode.c_str(), KmlRdToStr(currState) ); + if (bMOREINFO) + LOG_INFO("Leaving forbidden element %s. currState=%s", avoidNode.c_str(), KmlRdToStr(currState) ); // We can leave the quarantine. avoidNode.clear(); } else { - // LOG_INFO("Still in forbidden element %s, leaving %s. currState=%s", - // avoidNode.c_str(), msgTxt, KmlRdToStr(currState) ); + if (bMOREINFO) + LOG_INFO("Still in forbidden element %s, leaving %s. currState=%s", + avoidNode.c_str(), msgTxt, KmlRdToStr(currState) ); break ; } } // We should check that this string matches wuth the state expects, but this is much // faster to use only integers. - // LOG_INFO("End of %s currState=%s", xml->getNodeData(), KmlRdToStr(currState) ); + if (bMOREINFO) + LOG_INFO("End of %s currState=%s", + xml->getNodeData(), KmlRdToStr(currState) ); switch(currState) { case KMLRD_FOLDER : currState = KMLRD_NONE ; @@ -1323,7 +1360,8 @@ class KmlSrvImpl : public KmlServer { LOG_ERROR("Should not happen %s", KmlRdToStr(currState)); break; } - // LOG_INFO("currState=%s", KmlRdToStr(currState) ); + if (bMOREINFO) + LOG_INFO("currState=%s", KmlRdToStr(currState) ); break; } case EXN_NONE: @@ -1337,18 +1375,22 @@ class KmlSrvImpl : public KmlServer { } } - LOG_INFO("kmlFilNam=%s loaded sz=%d", kmlFilNam.c_str(), (int)ptrMap->size() ); + if (bMOREINFO) + LOG_INFO("kmlFilNam=%s loaded sz=%d", + kmlFilNam.c_str(), (int)ptrMap->size() ); } // KmlSrvImpl::ReloadSingleKmlFile /// Rewrites only the categories which have changed. bool RewriteKmlFileFull(void) { bool wasSaved = false ; - // LOG_INFO("nb_categories=%d", nb_categories ); + if (bMOREINFO) + LOG_INFO("nb_categories=%d", nb_categories ); for( size_t i = 0; i < nb_categories; ++i ) { const char * category = categories[i]; PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); if( ptrMap == NULL ) { - LOG_INFO("Category %s undefined", category ); + if (bMOREINFO) + LOG_INFO("Category %s undefined", category ); continue; } ptrMap->PruneKmlFile( m_retention_delay ); @@ -1403,7 +1445,7 @@ class KmlSrvImpl : public KmlServer { tmp_tim.tv_sec = time(NULL) + refresh_delay; tmp_tim.tv_nsec = 0 ; - // LOG_INFO("About to wait %d seconds", refresh ); + //LOG_INFO("About to wait %d seconds", refresh ); r = pthread_cond_timedwait( &m_cond_queue, &m_mutex_write, &tmp_tim ); if( ( r != ETIMEDOUT ) && ( r != 0 ) ) { LOG_ERROR("pthread_cond_timedwait %s d=%d", strerror(errno), m_refresh_interval ); @@ -1417,7 +1459,8 @@ class KmlSrvImpl : public KmlServer { MilliSleep( 1000 ); if( m_kml_must_leave ) { - LOG_INFO("Exit flag detected. Leaving"); + if (bMOREINFO) + LOG_INFO("Exit flag detected. Leaving"); return (void *)"Exit flag detected"; } } @@ -1436,7 +1479,8 @@ class KmlSrvImpl : public KmlServer { return (void *)error_message ; } --nb_retries ; - LOG_INFO("KML server not ready yet. Cnt=%d. Restarting.",nb_retries); + if (bMOREINFO) + LOG_INFO("KML server not ready yet. Cnt=%d. Restarting.",nb_retries); MilliSleep(1000); // Give time to load data. continue ; } @@ -1446,18 +1490,20 @@ class KmlSrvImpl : public KmlServer { { PlacesMapT *ptrMap = m_placemarks.FindCategory( categories[i] ); if( ptrMap == NULL ) { - LOG_INFO("Category %s undefined", categories[i] ); + if (bMOREINFO) + LOG_INFO("Category %s undefined", categories[i] ); continue; } // TODO: If there are contention problems, internally swap the queue // with a fresh empty one. ptrMap->FlushQueue( m_merge_dist ); } - // LOG_INFO("Releasing lock" ); + if (bMOREINFO) + LOG_INFO("Releasing lock" ); } if( r == ETIMEDOUT ) { - // LOG_INFO("Saving after wait=%d", refresh ); + //LOG_INFO("Saving after wait=%d", refresh ); bool wasSaved = RewriteKmlFileFull(); // Maybe a user process must be created to process these KML files. @@ -1471,7 +1517,7 @@ class KmlSrvImpl : public KmlServer { } else { refresh_delay = tmp_tim.tv_sec - time(NULL); if( refresh_delay <= 0 ) refresh_delay = 1 ; - // LOG_INFO("Interrupted when waiting. Restart with wait=%d", refresh ); + //LOG_INFO("Interrupted when waiting. Restart with wait=%d", refresh ); #endif } } // Endless loop. @@ -1512,8 +1558,10 @@ public: m_refresh_interval = kml_refresh_interval ; m_balloon_style = kml_balloon_style ; - LOG_INFO("dir=%s merge_distance=%lf retention_delay=%d refresh_interval=%d balloon_style=%d", - kml_dir.c_str(), kml_merge_distance, kml_retention_delay, kml_refresh_interval, kml_balloon_style ); + if (bMOREINFO) + LOG_INFO("dir=%s merge_distance=%lf retention_delay=%d refresh_interval=%d balloon_style=%d", + kml_dir.c_str(), kml_merge_distance, + kml_retention_delay, kml_refresh_interval, kml_balloon_style ); m_kml_dir = kml_dir ; @@ -1544,14 +1592,14 @@ public: try { ReloadSingleKmlFile( categories[i] ); } catch( const std::exception & exc ) { - LOG_INFO("Category %s. Caught %s", categories[i], exc.what() ); + LOG_ERROR("Category %s. Caught %s", categories[i], exc.what() ); } } // Now the object is usable. Theoretically should be protected by a mutex. LOG_DEBUG("Object ready"); - /// Even if an exception was thrown when loading the previous file, it does not + /// Even if an exception was thrown when loading the previous file, it does not /// prevent to overwrite the old files with new and clean ones. m_loaded = true ; } @@ -1618,32 +1666,38 @@ public: #else m_bool_queue = true; #endif - LOG_INFO("'%s' sz=%d time=%s nb_broad=%d m_merge_dist=%lf", - descrTxt.c_str(), (int)ptrMap->size(), - KmlTimestamp(evtTim).c_str(), - KmlServer::m_nb_broadcasts,m_merge_dist ); + if (bMOREINFO) + LOG_INFO("'%s' sz=%d time=%s nb_broad=%d m_merge_dist=%lf", + descrTxt.c_str(), (int)ptrMap->size(), + KmlTimestamp(evtTim).c_str(), + KmlServer::m_nb_broadcasts,m_merge_dist ); } /// It flushes the content to disk. ~KmlSrvImpl() { { /// This will not be killed in the middle of the writing. - LOG_INFO("Cancelling writer thread"); + if (bMOREINFO) + LOG_INFO("Cancelling writer thread"); guard_lock myGuard( &m_mutex_write ); #ifdef FLDIGI_KML_CONDITION_VARIABLE - LOG_INFO("Cancelling subthread"); + if (bMOREINFO) + LOG_INFO("Cancelling subthread"); int r = pthread_cancel( m_writer_thread ); if( r ) { - LOG_ERROR("pthread_cancel %s", strerror(errno) ); + if (bMOREINFO) + LOG_ERROR("pthread_cancel %s", strerror(errno) ); return ; } #else - LOG_INFO("Setting exit flag."); + if (bMOREINFO) + LOG_INFO("Setting exit flag."); m_kml_must_leave = true ; #endif } - // LOG_INFO("Joining subthread"); + if (bMOREINFO) + LOG_INFO("Joining subthread"); void * retPtr; int r = pthread_join( m_writer_thread, &retPtr ); if( r ) { @@ -1656,7 +1710,8 @@ public: : (retPtr == PTHREAD_CANCELED) ? "Canceled thread" : static_cast(retPtr); - LOG_INFO("Thread stopped. Message:%s", msg ); + if (bMOREINFO) + LOG_INFO("Thread stopped. Message:%s", msg ); /// Here we are sure that the subthread is stopped. The subprocess is not called. RewriteKmlFileFull(); @@ -1687,7 +1742,9 @@ public: if( is_proc_still_running == -1 ) return ; if( ( m_pid_command <= 0 ) || ( is_proc_still_running == 0 ) ) { m_pid_command = fork_process( m_command.c_str() ); - LOG_INFO("%s: Pid=%d Command=%s", __FUNCTION__, m_pid_command, m_command.c_str() ); + if (bMOREINFO) + LOG_INFO("%s: Pid=%d Command=%s", + __FUNCTION__, m_pid_command, m_command.c_str() ); } } @@ -1741,7 +1798,8 @@ void KmlServer::SpawnProcess() { /// Called by thr main program, clean exit. void KmlServer::Exit(void) { // We assume that the calling program has no try/catch handler. - // LOG_INFO("Exiting"); + if (bMOREINFO) + LOG_INFO("Exiting"); try { KmlServer * pKml = Pointer(); if( pKml ) { diff --git a/src/misc/record_loader.cxx b/src/misc/record_loader.cxx index fd777622..3344e566 100644 --- a/src/misc/record_loader.cxx +++ b/src/misc/record_loader.cxx @@ -60,7 +60,8 @@ int RecordLoaderInterface::LoadAndRegister() std::string filnam = storage_filename().first; time_t cntTim = time(NULL); - LOG_INFO("Opening:%s", filnam.c_str()); + if (bMOREINFO) + LOG_INFO("Opening:%s", filnam.c_str()); std::ifstream ifs( filnam.c_str() ); @@ -93,8 +94,10 @@ int RecordLoaderInterface::LoadAndRegister() } } ifs.close(); - LOG_INFO( "Read:%s with %d records in %d seconds", - filnam.c_str(), static_cast(nbRec), static_cast( time(NULL) - cntTim ) ); + if (bMOREINFO) + LOG_INFO( "Read:%s with %d records in %d seconds", + filnam.c_str(), static_cast(nbRec), + static_cast( time(NULL) - cntTim ) ); return nbRec ; } @@ -219,7 +222,9 @@ std::pair< std::string, bool > RecordLoaderInterface::storage_filename(bool crea // Second try with a file maybe installed by "make install". std::string filnam_inst = PKGDATADIR "/" + base_filename(); - LOG_INFO("Errno=%s with %s. Trying %s", strerror(errno), filnam_data.c_str(), filnam_inst.c_str() ); + if (bMOREINFO) + LOG_INFO("Errno=%s with %s. Trying %s", + strerror(errno), filnam_data.c_str(), filnam_inst.c_str() ); ifs.open( filnam_inst.c_str() ); if( ifs ) { @@ -449,7 +454,9 @@ void DerivedRecordLst::cbGuiUpdate() double timeout=600.0; // Consider truncating the HTTP header. int res = fetch_http_gui(url, reply, timeout ); - LOG_INFO("Loaded %s : %d chars. res=%d", url.c_str(), (int)reply.size(), res ); + if (bMOREINFO) + LOG_INFO("Loaded %s : %d chars. res=%d", + url.c_str(), (int)reply.size(), res ); if( ! res ) { int ok = fl_choice2( @@ -526,7 +533,8 @@ void DerivedRecordLst::cbGuiReset() fl_alert("Cannot erase installed data file %s", stofil ); continue ; } else { - LOG_INFO("Erasing %s", stofil ); + if (bMOREINFO) + LOG_INFO("Erasing %s", stofil ); int res = ::remove( stofil ); if( ( res != 0 ) && ( res != ENOENT ) ) { fl_alert("Error erasing data file %s:%s", stofil, strerror(errno) ); diff --git a/src/synop-src/synop.cxx b/src/synop-src/synop.cxx index 346836be..8b89d7bb 100644 --- a/src/synop-src/synop.cxx +++ b/src/synop-src/synop.cxx @@ -113,7 +113,7 @@ static int diffTm( time_t tim1, time_t tim2 ) static std::string Tm2SynopTime( time_t tim ) { return KmlServer::Tm2Time( tim ); } - + // ---------------------------------------------------------------------------- /// Base class for displaying the key-value pairs read from Synop broadcast. @@ -219,7 +219,7 @@ class RecordWmoStation // WMO Region :digits 1 through 6 representing the corresponding WMO region, 7 stands for the WMO Antarctic region. - // Station Latitude or Latitude :DD-MM-SSH where DD is degrees, MM is minutes, SS is seconds + // Station Latitude or Latitude :DD-MM-SSH where DD is degrees, MM is minutes, SS is seconds // and H is N for northern hemisphere or S for southern hemisphere or // E for eastern hemisphere or W for western hemisphere. // The seconds value is omitted for those stations where the seconds value is unknown. @@ -253,7 +253,8 @@ public: /// This garantees an unique name. const std::string & station_name() const { return m_name; } void rename_station( const std::string & nam ) { - // LOG_INFO("Renaming %s to %s", m_name.c_str(), nam.c_str() ); + if (bMOREINFO) + LOG_INFO("Renaming %s to %s", m_name.c_str(), nam.c_str() ); m_name = nam; } @@ -280,7 +281,7 @@ public: && ( rec.m_station_coordinates.latitude().is_lon() == false ) && ( rec.m_station_coordinates.longitude().is_lon() == true ) - ) + ) { strtrim( rec.m_name ); return istrm ; @@ -362,7 +363,7 @@ public: && read_until_delim( m_delim, istrm, rec.m_timezone ) && read_until_delim( m_delim, istrm, rec.m_forecast ) && read_until_delim( m_delim, istrm, rec.m_note ) - ) + ) { // std::cout << "id=" << rec.m_id << " name=" << rec.m_name << "\n"; return istrm ; @@ -403,7 +404,7 @@ public: && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) - ) + ) { strtrim( rec.m_country ); strtrim( rec.m_callsign ); @@ -478,7 +479,7 @@ public: && read_until_delim( m_delim, istrm /* Alloc Date */ ) && read_until_delim( m_delim, istrm /* Dealloc Date */ ) && read_until_delim( m_delim, istrm /* Argos Prog */ ) - ) + ) { return istrm ; } @@ -537,7 +538,8 @@ protected: return false ; } else { - LOG_INFO("record=%s nb_recs=%d", typeid(Record).name(), nbRec ); + if (bMOREINFO) + LOG_INFO("record=%s nb_recs=%d", typeid(Record).name(), nbRec ); return true ; } } @@ -587,8 +589,9 @@ public: typedef std::multimap< std::string, IteratorType > HashT ; HashT allNames ; - // First take the names - // LOG_INFO("Eliminating duplicates out of %d elements",m_catalog.size()); + // First take the names + if (bMOREINFO) + LOG_INFO("Eliminating duplicates out of %d elements",m_catalog.size()); for( IteratorType it = m_catalog.begin(), en = m_catalog.end(); it != en; ++it ) { RecordWmoStation & refWmo = it->second ; @@ -600,7 +603,8 @@ public: // Iterates on all names, take only the duplicates. for( HashT::iterator itH = allNames.begin(), itNextH = itH, enH = allNames.end(); itH != enH; itH = itNextH ) { - // LOG_INFO("Name=%s", itH->first.c_str() ); + if (bMOREINFO) + LOG_INFO("Name=%s", itH->first.c_str() ); size_t nbKeys = 1 ; for(;;) { ++itNextH; @@ -608,13 +612,15 @@ public: if( itNextH->first != itH->first ) break ; ++nbKeys; } - // LOG_INFO("Name=%s nb=%d", itH->first.c_str(), nbKeys ); + if (bMOREINFO) + LOG_INFO("Name=%s nb=%d", itH->first.c_str(), nbKeys ); // If no duplicates, then try next one. if( nbKeys == 1 ) continue ; ++nbDupl ; - // LOG_INFO("%d: Name %s %d occurrences", nbDupl, itH->first.c_str(), nbKeys ); + if (bMOREINFO) + LOG_INFO("%d: Name %s %d occurrences", nbDupl, itH->first.c_str(), nbKeys ); // There should not be many elements, two or three duplicates, maximum five apparently. typedef std::set< std::string > DiffNamesT ; @@ -622,7 +628,8 @@ public: // Check that all countries are different. for( HashT::iterator itSubH = itH; itSubH != itNextH; ++itSubH ) { RecordWmoStation & refWmo = itSubH->second->second ; - // LOG_INFO("Trying %s", refWmo.station_name().c_str() ); + if (bMOREINFO) + LOG_INFO("Trying %s", refWmo.station_name().c_str() ); // Appends the country. refWmo.rename_station( refWmo.station_name() + "," + refWmo.country() ); std::pair< DiffNamesT::iterator, bool > tmpPair = differentNames.insert( refWmo.station_name() ); @@ -637,7 +644,9 @@ public: } if(nbDupl) { - LOG_INFO("Eliminated %d duplicates out of %d elements", (int)nbDupl, (int)m_catalog.size()); + if (bMOREINFO) + LOG_INFO("Eliminated %d duplicates out of %d elements", + (int)nbDupl, (int)m_catalog.size()); } return true ; } @@ -668,9 +677,10 @@ public: typedef std::multimap< std::string, IteratorType > HashT ; HashT allNames ; - // LOG_INFO("Eliminating duplicates out of %d elements",m_catalog.size()); + if (bMOREINFO) + LOG_INFO("Eliminating duplicates out of %d elements",m_catalog.size()); - /// First take the names + /// First take the names for( IteratorType it = m_catalog.begin(), en = m_catalog.end(); it != en; ++it ) { RecordBuoy & refWmo = it->second ; @@ -682,7 +692,8 @@ public: /// Iterates on all names, take only the duplicates. for( HashT::iterator itH = allNames.begin(), itNextH = itH, enH = allNames.end(); itH != enH; itH = itNextH ) { - // LOG_INFO("Name=%s", itH->first.c_str() ); + if (bMOREINFO) + LOG_INFO("Name=%s", itH->first.c_str() ); size_t nbKeys = 1 ; for(;;) { ++itNextH; @@ -690,13 +701,16 @@ public: if( itNextH->first != itH->first ) break ; ++nbKeys; } - // LOG_INFO("Name=%s nb=%d", itH->first.c_str(), nbKeys ); + if (bMOREINFO) + LOG_INFO("Name=%s nb=%d", itH->first.c_str(), nbKeys ); // If no duplicates, then try next one. if( nbKeys == 1 ) continue ; ++nbDupl ; - // LOG_INFO("%d: Buoy name %s %d occurrences", nbDupl, itH->first.c_str(), nbKeys ); + if (bMOREINFO) + LOG_INFO("%d: Buoy name %s %d occurrences", + nbDupl, itH->first.c_str(), nbKeys ); // There should not be many elements, two or three duplicates, maximum five apparently. typedef std::set< std::string > DiffNamesT ; @@ -710,7 +724,8 @@ public: else refBuoy.rename_buoy( strformat( "%s-%s", refBuoy.buoy_name().c_str(), refBuoy.id().c_str() ) ); std::pair< DiffNamesT::iterator, bool > tmpPair = differentNames.insert( refBuoy.buoy_name() ); - // LOG_INFO("Buoy set to %s", refBuoy.buoy_name().c_str() ); + if (bMOREINFO) + LOG_INFO("Buoy set to %s", refBuoy.buoy_name().c_str() ); if( tmpPair.second ) continue ; LOG_ERROR("This should never happen because buoy id is unique"); return false ; @@ -718,7 +733,9 @@ public: } if(nbDupl) { - LOG_INFO("Eliminated %d duplicates out of %d elements", (int)nbDupl, (int)m_catalog.size()); + if (bMOREINFO) + LOG_INFO("Eliminated %d duplicates out of %d elements", + (int)nbDupl, (int)m_catalog.size()); } return true ; } @@ -1098,7 +1115,7 @@ public: strm << val ; ItemAdd( key, strm.str().c_str(), unit ); } - + void Append( const char * key, const std::string & val, const char * unit = NULL ) const { ItemAdd( key, val.c_str(), unit ); @@ -1108,14 +1125,14 @@ public: { ItemAdd( key, val, unit ); } - + void Append( const char * key, double val, const char * unit = NULL ) const { char buf[20]; sprintf( buf, "%.1lf", val ); ItemAdd( key, buf, unit ); } - + void Append( const char * key, int val, const char * unit = NULL ) const { char buf[12]; @@ -1193,7 +1210,7 @@ public: } /// Returns the regular expression given its index. - static const RegexT * Find(size_t idx ) { + static const RegexT * Find(size_t idx ) { assert( idx < Nb() ); return storage()[ idx ]; } @@ -1230,7 +1247,7 @@ public: // If two different tokens, with different regular expressions, match for the // same word, the priority tells which one to take. Default value is one. - static priority_t Priority( size_t idx ) { + static priority_t Priority( size_t idx ) { assert( idx < Nb() ); return storage()[ idx ]->m_priority; } @@ -1278,7 +1295,7 @@ public: /// Loops in the tokens held by the container, for a precise type. template< class TokenDerived > -const TokenDerived * TokenProxy::get_ptr(bool previous_chains) const +const TokenDerived * TokenProxy::get_ptr(bool previous_chains) const { for( TokVec::Ptr curr_container = m_container ; @@ -1571,7 +1588,7 @@ public: /// http://weather.unisys.com/wxp/Appendices/Formats/SYNOP.html /// 000 Group - Identification and Location -/// +/// /// IIiii The WMO number of the station. HEADTK(IIiii) { int m_wmo_indicator ; @@ -1612,7 +1629,7 @@ public: { // std::cout << "wmo=" << str << "\n"; - /* Station index numbers consisting of one figure repeated five times, e.g. 55555, 77777, etc., + /* Station index numbers consisting of one figure repeated five times, e.g. 55555, 77777, etc., or ending with 0000 or 9999, or duplicating special code indicators, e.g. 10001, 77744, 19191, 89998, etc., are not assigned to meteorological stations. We might check if the code exists or not. */ if( 1 != sscanf( str, "%d", &m_wmo_indicator ) ) return false ; @@ -1895,7 +1912,7 @@ public: } /// Due to parsing error, we might take the next group header (333 or 555) as a ship name. - bool resu = + bool resu = ( 1 == sscanf( str, "%9s", m_ship_buoy_identifier ) ) && ( strcmp( m_ship_buoy_identifier, "333" ) ) && ( strcmp( m_ship_buoy_identifier, "555" ) ); @@ -1926,7 +1943,7 @@ public: const char * ShipIdentifier(void) const { return m_ship_buoy_identifier; } }; -/// ff -- wind speed in units determined by wind type indicator (see above) +/// ff -- wind speed in units determined by wind type indicator (see above) static const choice< char > wind_speed_units[] = { { '0',_("m/s (Estimated)") }, { '1',_("m/s (Anemometer)") }, @@ -1977,7 +1994,7 @@ public: // No need to display it twice because it will appear after the speed value. if( tstDisp ) { - Append( _("Wind type indicator"), + Append( _("Wind type indicator"), choice_map( wind_speed_units, G_N_ELEMENTS( wind_speed_units ), m_wind_type_indicator, _("Unknown speed unit type") ) ); } @@ -2021,7 +2038,7 @@ public: friend class CLASSTK(QLLLL); }; -/// LLLL -- Longitude of observation to .1 degrees +/// LLLL -- Longitude of observation to .1 degrees HEADTK(QLLLL) { char m_quadrant ; int m_longit_10deg ; @@ -2246,13 +2263,13 @@ public: const char * wind_speed_title = _("Wind speed"); if( ptr_YYGGi ) { - Append( wind_speed_title, m_wind_speed, + Append( wind_speed_title, m_wind_speed, choice_map( wind_speed_units, G_N_ELEMENTS( wind_speed_units ), ptr_YYGGi->m_wind_type_indicator, _("Unknown speed unit type") ) ); } else { - Append( wind_speed_title, m_wind_speed, _("No unit (YYGGi missing)") ); + Append( wind_speed_title, m_wind_speed, _("No unit (YYGGi missing)") ); } - + } bool CanComeFirst(void) const { return false ; } @@ -2272,7 +2289,7 @@ public: void Print() const { // fff -- wind speed if value greater than 100 - Append( _("Wind speed"), m_wind_speed ); + Append( _("Wind speed"), m_wind_speed ); } }; @@ -2293,14 +2310,14 @@ static void AppCelsius( const TokenProxy * ptrTok, const char * title, char sign if( title == NULL ) title = "No title"; switch( sign ) { - case '1' : temperature_tenth = -temperature_tenth ; - case '0' : ptrTok->Append( title, temperature_tenth * 0.10, Unit_Celsius ); + case '1' : temperature_tenth = -temperature_tenth ; + case '0' : ptrTok->Append( title, temperature_tenth * 0.10, Unit_Celsius ); break; case '9' : ptrTok->Append( _("Relative humidity"), (double)temperature_tenth * 0.10 , "%" ); break; - case '/' : ptrTok->Append( title, _("Undefined") ); + case '/' : ptrTok->Append( title, _("Undefined") ); break; - default : ptrTok->Append( title, _("Unexpected case") ); + default : ptrTok->Append( title, _("Unexpected case") ); break; } } @@ -2367,7 +2384,7 @@ static void thousands_omitted( const TokenProxy * ptrTok, const char * pressure, double tmpPres ; // Checks reasonable values for a pressure. if( ( 1 != sscanf( buf, "%lf", &tmpPres ) ) - || ( tmpPres > 12000 ) + || ( tmpPres > 12000 ) || ( tmpPres < 7000 ) ) { ptrTok->Append( title, _("Inconsistent:") + std::string(pressure) ); } else { @@ -2392,7 +2409,7 @@ public: }; /** 4PPPP -- Sea level pressure in 0.1 mb (thousandths digit omitted, last digit can be slash, then pressure in full mb) -Can be as well 4ahhh http://metaf2xml.sourceforge.net/parser.pm.html : +Can be as well 4ahhh http://metaf2xml.sourceforge.net/parser.pm.html : a3 Isobaric surface (CT 0264), hhh Geopotential of isobaric surface */ HEADTK(4PPPP) { @@ -2965,7 +2982,7 @@ public: } }; -/// 9GGgg -- Time of observation in hours and minutes +/// 9GGgg -- Time of observation in hours and minutes HEADTK(9GGgg) { int m_hours; int m_minutes; @@ -2983,7 +3000,7 @@ public: }; /// 222 Group - Sea Surface Observations -/// +/// /// 222Dv HEADTK(222Dv) { char m_ship_direction; @@ -3088,9 +3105,9 @@ public: Append( _("Sea surface temperature"), _("Unspecified") ); if( m_temperature_type == NULL ) - Append( _("Temperature type"), _("Unspecified") ); + Append( _("Temperature type"), _("Unspecified") ); else - Append( _("Temperature type"), m_temperature_type ); + Append( _("Temperature type"), m_temperature_type ); } }; @@ -3194,7 +3211,7 @@ public: m_swell_waves_period = -1; m_swell_waves_height = -1; if( 0 == strcmp( str, "4////") ) return true; - return ( 2 == sscanf( str, "4%2d%2d", &m_swell_waves_period, &m_swell_waves_height ) ) + return ( 2 == sscanf( str, "4%2d%2d", &m_swell_waves_period, &m_swell_waves_height ) ) || ( 1 == sscanf( str, "4%2d//", &m_swell_waves_period ) ); } @@ -3300,7 +3317,7 @@ public: } }; -/// 8aTTT -- Wet bulb temperature +/// 8aTTT -- Wet bulb temperature HEADTK(8aTTT) { char m_wet_bulb_sign_type ; char m_temperature_sign ; @@ -3362,7 +3379,7 @@ public: } }; -/// Separator for ice detection. +/// Separator for ice detection. HEADTK(ICE) { public: // TODO: It is possible to have free text after the string ICE. @@ -3394,7 +3411,7 @@ public: bool Parse( const char * str ) { - return ( 5 == sscanf( str, "%c%c%c%c%c", + return ( 5 == sscanf( str, "%c%c%c%c%c", &m_sea_ice_arrangement, &m_sea_ice_development_stage, &m_ice_of_land_origin, @@ -3419,7 +3436,7 @@ public: _("Concentration or arrangement of Sea Ice") ); /// Si = Sea Ice Stage of Development - static const char * sea_ice_development_stages[] = { + static const char * sea_ice_development_stages[] = { _("New ice only (frail ice, grease ice, slush ice, shuga)"), _("Nilas or ice rind, less than 10 cm thick"), _("Young ice (grey ice, grey-white ice), 10-30 cm thick"), @@ -3669,19 +3686,19 @@ public: /// sss -- snow depth in cm: Code table 3889 sss : Total depth of snow switch( m_snow_depth ) { - case 0 : + case 0 : Append( _("Snow depth"), _("Not used") ); break; default : Append( _("Snow depth"), m_snow_depth, Unit_centimeters ); break; - case 997 : + case 997 : Append( _("Snow depth"), _("Less than 0.5 cm") ); break; - case 998 : + case 998 : Append( _("Snow depth"), _("Snow cover, not continuous") ); break; - case 999 : + case 999 : Append( _("Snow depth"), _("Measurement impossible or inaccurate") ); break; } @@ -3880,7 +3897,7 @@ public: m_cloud_base_height = 0 ; return ( 3 == sscanf( str, "8%c%c%2d", &m_cloud_cover, &m_cloud_genus, &m_cloud_base_height ) ) || ( 2 == sscanf( str, "8%c%c//", &m_cloud_cover, &m_cloud_genus ) ) - || ( 0 == strncmp( str, "80///", 5 ) ); + || ( 0 == strncmp( str, "80///", 5 ) ); } void Print() const { @@ -3896,9 +3913,9 @@ public: switch( m_cloud_base_height ) { case 0 : Append( title, _("Less than 30 meters") ); break; case 1 ... 50 : Append( title, m_cloud_base_height * 30, Unit_meters ); break; - case 51 ... 56 : Append( title, 1500 + ( m_cloud_base_height - 50 ) * 50, Unit_meters ); break; - case 57 ... 80 : Append( title, 1800 + ( m_cloud_base_height - 56 ) * 300, Unit_meters ); break; - case 81 ... 88 : Append( title, 9000 + ( m_cloud_base_height - 80 ) * 1500, Unit_meters ); break; + case 51 ... 56 : Append( title, 1500 + ( m_cloud_base_height - 50 ) * 50, Unit_meters ); break; + case 57 ... 80 : Append( title, 1800 + ( m_cloud_base_height - 56 ) * 300, Unit_meters ); break; + case 81 ... 88 : Append( title, 9000 + ( m_cloud_base_height - 80 ) * 1500, Unit_meters ); break; case 89 : Append( title, _("Greater than 21000 m") ); break; case 90 ... 99 : disp_arr(cloud_bases,G_N_ELEMENTS(cloud_bases),m_cloud_base_height,90,title ); break; @@ -3907,7 +3924,7 @@ public: } }; -/// 9SSss -- Supplementary information +/// 9SSss -- Supplementary information /// http://www.met.fu-berlin.de/~stefan/fm12.html#32 /// 9SPSPspsp -- Besondere Wettererscheinungen und zusätzliche Informationen (Gruppe kann mehrmals verschlüsselt werden) HEADTK(9SSss) { @@ -4454,7 +4471,7 @@ public: * 9snTgTgTgsTg -- Minimumtemperatur des Vortags (00 - 24 UTC) 5 cm über dem Erdboden bzw. der Schneedecke (wird um 06 UTC gemeldet) sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) Tg Tg Tg -- Erdbodenminimumtemperatur in 1/10 Grad Celsius - sTg -- Bedeckung des Temperaturmeßfühlers 5 cm über dem Erdboden mit Schnee oder Eis am Vortag (0 = nein, 1 = ja, / = Angabe nicht möglich) + sTg -- Bedeckung des Temperaturmeßfühlers 5 cm über dem Erdboden mit Schnee oder Eis am Vortag (0 = nein, 1 = ja, / = Angabe nicht möglich) */ /// Abschnitt 6 - Automatisch erzeugte Daten @@ -4923,43 +4940,43 @@ static const void init_patterns(void) // http://metaf2xml.sourceforge.net/parser.pm.html // AT: 1snTxTxTx 6RRR/ - // 1snTxTxTx : maximum temperature on the previous day from 06:00 to 18:00 UTC - // 6RRR/ : amount of precipitation on the previous day from 06:00 to 18:00 UTC + // 1snTxTxTx : maximum temperature on the previous day from 06:00 to 18:00 UTC + // 6RRR/ : amount of precipitation on the previous day from 06:00 to 18:00 UTC // BE: 1snTxTxTx 2snTnTnTn - // 1snTxTxTx : maximum temperature on the next day from 00:00 to 24:00 UTC - // 2snTnTnTn : minimum temperature on the next day from 00:00 to 24:00 UTC + // 1snTxTxTx : maximum temperature on the next day from 00:00 to 24:00 UTC + // 2snTnTnTn : minimum temperature on the next day from 00:00 to 24:00 UTC // CA: 1ssss 2swswswsw 3dmdmfmfm 4fhftftfi - // 1ssss : amount of snowfall, in tenths of a centimeter, for the 24-hour period ending at 06:00 UTC - // 2swswswsw : amount of water equivalent, in tenths of a millimeter, for the 24-hour snowfall ending at 06:00 UTC - // 3dmdmfmfm : maximum (mean or gust) wind speed, in knots, for the 24-hour period ending at 06:00 UTC and its direction + // 1ssss : amount of snowfall, in tenths of a centimeter, for the 24-hour period ending at 06:00 UTC + // 2swswswsw : amount of water equivalent, in tenths of a millimeter, for the 24-hour snowfall ending at 06:00 UTC + // 3dmdmfmfm : maximum (mean or gust) wind speed, in knots, for the 24-hour period ending at 06:00 UTC and its direction // 4fhftftfi : together with the previous group, the hundreds digit of the maximum wind speed (in knots), // the time of occurrence of the maximum wind speed, and the speed range - // of the maximum two-minute mean wind speed, for the 24-hour period ending at 06:00 UTC and its direction + // of the maximum two-minute mean wind speed, for the 24-hour period ending at 06:00 UTC and its direction // US land: RECORD* 0ittDtDtD 1snTT snTxTxsnTnTn RECORD* 2R24R24R24R24 44snTwTw 9YYGG - // RECORD : indicator for temperature record(s) - // 0ittDtDtD : tide data + // RECORD : indicator for temperature record(s) + // 0ittDtDtD : tide data // 1snTT snTxTxsnTnTn RECORD* 2R24R24R24R24 : city data: temperature, maximum and minimum temperature, - // indicator for temperature record(s), precipitation last 24 hours - // 44snTwTw : water temperature - // 9YYGG : additional day and hour of observation (repeated from Section 0) + // indicator for temperature record(s), precipitation last 24 hours + // 44snTwTw : water temperature + // 9YYGG : additional day and hour of observation (repeated from Section 0) // US sea: 11fff 22fff 3GGgg 4ddfmfm 6GGgg dddfff dddfff dddfff dddfff dddfff dddfff 8ddfmfm 9GGgg - // 11fff 22fff : equivalent wind speeds at 10 and 20 meters - // 3GGgg 4ddfmfm : maximum wind speed since the last observation and the time when it occurred - // 6GGgg : end time of the latest 10-minute continuous wind measurements - // 6 x dddfff : 6 10-minute continuous wind measurements - // 8ddfmfm 9GGgg : highest 1-minute wind speed and the time when it occurred + // 11fff 22fff : equivalent wind speeds at 10 and 20 meters + // 3GGgg 4ddfmfm : maximum wind speed since the last observation and the time when it occurred + // 6GGgg : end time of the latest 10-minute continuous wind measurements + // 6 x dddfff : 6 10-minute continuous wind measurements + // 8ddfmfm 9GGgg : highest 1-minute wind speed and the time when it occurred // CZ: 1dsdsfsfs 2fsmfsmfsxfsx 3UU// 5snT5T5T5 6snT10T10T10 7snT20T20T20 8snT50T50T50 9snT100T100T100 - // 1dsdsfsfs : wind direction and speed from tower measurement - // 2fsmfsmfsxfsx : maximum wind gust speed over 10 minute period and the period W1W2 - // 3UU// : relative humidity - // 5snT5T5T5 6snT10T10T10 7snT20T20T20 8snT50T50T50 9snT100T100T100 : soil temperature at the depths of 5, 10, 20, 50, and 100 cm + // 1dsdsfsfs : wind direction and speed from tower measurement + // 2fsmfsmfsxfsx : maximum wind gust speed over 10 minute period and the period W1W2 + // 3UU// : relative humidity + // 5snT5T5T5 6snT10T10T10 7snT20T20T20 8snT50T50T50 9snT100T100T100 : soil temperature at the depths of 5, 10, 20, 50, and 100 cm // RU: 1EsnT'gT'g 2snTnTnTn 3EsnTgTg 4E'sss 52snT2T2 6RRRtR 7R24R24R24/ 88R24R24R24 - // 1EsnT'gT'g : state of the ground without snow or measurable ice cover, temperature of the ground surface - // 2snTnTnTn : minimum temperature last night - // 3EsnTgTg : state of the ground without snow or measurable ice cover, minimum temperature of the ground surface last night - // 4E'sss : state of the ground if covered with snow or ice, snow depth - // 6RRRtR : amount of precipitation for given period - // 7R24R24R24/ : amount of daily precipitation + // 1EsnT'gT'g : state of the ground without snow or measurable ice cover, temperature of the ground surface + // 2snTnTnTn : minimum temperature last night + // 3EsnTgTg : state of the ground without snow or measurable ice cover, minimum temperature of the ground surface last night + // 4E'sss : state of the ground if covered with snow or ice, snow depth + // 6RRRtR : amount of precipitation for given period + // 7R24R24R24/ : amount of daily precipitation // 88R24R24R24 : amount of daily precipitation if 30 mm or more @@ -5070,7 +5087,7 @@ class synop_impl std::cout << "DEBUG:" << __FUNCTION__ << " m_idxGroup=" << m_idxGroup << " m_idxTok=" << m_idxTok << " reg=" << reg.Name() << " str=" << str - << " m_nxtTok=" << m_nxtTok + << " m_nxtTok=" << m_nxtTok << " priority=" << m_sum_prios << "\n" ; */ return tp ; @@ -5093,8 +5110,8 @@ class synop_impl std::cout << "DEBUG:" << __FUNCTION__ << " REPET m_idxGroup=" << m_idxGroup << " m_idxTok=" << m_idxTok << " reg=" << reg.Name() << " str=" << str - << " m_nxtTok=" << m_nxtTok - << " m_idxTok=" << m_idxTok + << " m_nxtTok=" << m_nxtTok + << " m_idxTok=" << m_idxTok << " maxTks=" << ptrSynopGroup->m_nb_toks << " priority=" << m_sum_prios << "\n" ; */ @@ -5200,7 +5217,7 @@ class synop_impl LOG_DEBUG("No publish0 empty message"); return; } - + // Quick check if the message is very short. Beware, it it the total // number of tokens, not the number of sections. if(m_nbTokens <= 2 ) { @@ -5211,7 +5228,7 @@ class synop_impl // We eliminate this kind of message which is not SYNOP although the beginning is similar. // Other simple combinations might be eliminated but they are rarer. - // ZCZC 603 + // ZCZC 603 // WWXX60 EDZW 201700 const_iterator it1 = it0; ++it1 ; @@ -5220,7 +5237,8 @@ class synop_impl && ( it1 != end() ) && ( it1->section() == SECTION_IDENTLOC ) ) { if( m_nbTokens <= 3 ) { - LOG_INFO("No publish3 %s", TstToStr().c_str() ); + if (bMOREINFO) + LOG_INFO("No publish3 %s", TstToStr().c_str() ); return ; } // TODO: Store these for next run if their are missing. @@ -5230,7 +5248,8 @@ class synop_impl // For example, receiving only the following line makes no sense: // Climatological data=6RRRt#69907+8NChh#81822+9SSss#91113+9SSss#96480;+; if( it0->section() != SECTION_LAND_OBS ) { - LOG_INFO("No publish2 %s", TstToStr().c_str() ); + if (bMOREINFO) + LOG_INFO("No publish2 %s", TstToStr().c_str() ); return ; } // TODO: We should use the header SECTION_IDENTLOC of the previous message: @@ -5307,7 +5326,8 @@ class synop_impl << " IIiii:" << newCoo << " Against:" << tmpCoo << " Dist:" << dist ; - LOG_INFO("%s", strm.str().c_str() ); + if (bMOREINFO) + LOG_INFO("%s", strm.str().c_str() ); } } else { foundCoo = true ; @@ -5344,7 +5364,8 @@ class synop_impl << " IIiii:" << newCoo << " Against:" << tmpCoo << " Dist:" << dist ; - LOG_INFO("%s", strm.str().c_str() ); + if (bMOREINFO) + LOG_INFO("%s", strm.str().c_str() ); } } else { foundCoo = true ; @@ -5359,7 +5380,8 @@ class synop_impl ptrJComm_Tok->SetJCommFields( kmlNam, iconNam ); if( stationCountry.empty() ) stationCountry = ptrJComm_Tok->country(); } else { - LOG_INFO("Cannot find WMO station:%s", wmoIndicStr.c_str() ); + if (bMOREINFO) + LOG_INFO("Cannot find WMO station:%s", wmoIndicStr.c_str() ); kmlNam = "WMO:" + wmoIndicStr ; } } @@ -5711,7 +5733,7 @@ private: const size_t buf_sz = m_buf.size(); // The same list can appear in several chains, this is intended. - for( int i = 0, nbSynGrp = arrSynopGroups.size(); i < nbSynGrp; ++i ) + for( int i = 0, nbSynGrp = arrSynopGroups.size(); i < nbSynGrp; ++i ) { for( size_t j = 0, nbToks = arrSynopGroups[i].m_nb_toks; j < nbToks; ++j ) { @@ -5800,7 +5822,7 @@ private: /// What happens if it matches the beginning if a chain // NOTE: We suppose that the beginning is never multiple ("Many"). - for( int idxGrp = 0, nbSynGrp = arrSynopGroups.size(); idxGrp < nbSynGrp; ++idxGrp ) + for( int idxGrp = 0, nbSynGrp = arrSynopGroups.size(); idxGrp < nbSynGrp; ++idxGrp ) { const synop_group * ptrSynopGroup = &arrSynopGroups[idxGrp]; assert( ptrSynopGroup->m_nb_toks > 0 ); @@ -5839,7 +5861,7 @@ private: if( nbInserts != 0 ) { /// Removes the chains which cannot possibly match the current suite of tokens. - for( ChainsNoInsrtsT::iterator it = chainsNoInsrts.begin(), en = chainsNoInsrts.end(); it != en; ++it ) + for( ChainsNoInsrtsT::iterator it = chainsNoInsrts.begin(), en = chainsNoInsrts.end(); it != en; ++it ) { m_chains.erase( *it ); } @@ -5954,7 +5976,7 @@ public: { // -1, no display of '=', whose length is one. decode_then_flush(-1); - } else if( nbInserts == 0 ) + } else if( nbInserts == 0 ) { if( noChains ) { /// There was no chains before. @@ -6022,7 +6044,7 @@ void synop::regex_usage(void) { if( ptrSynopGroup-> m_usage_counter > 0 ) continue ; std::cout << "DEBUG:" << "Unused:" - << " idxGrp=" << idxGrp + << " idxGrp=" << idxGrp << ' ' << *ptrSynopGroup << '\n' ; } From 93342e4dd73cc95f05dc799d0802f3e866e41813 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 11 Nov 2015 06:31:06 -0600 Subject: [PATCH 039/138] gpio ptt * Added gpio support for PTT. - used primarily by Pi experimenters - submitted by Lior, KK6KWA --- src/dialogs/confdialog.cxx | 60 +++++++++++++++++++++++++++++++++---- src/dialogs/confdialog.fl | 38 ++++++++++++++++++----- src/include/confdialog.h | 2 ++ src/include/configuration.h | 7 +++++ src/include/ptt.h | 6 +++- src/misc/configuration.cxx | 6 ++++ src/rigcontrol/ptt.cxx | 43 ++++++++++++++++++++++++++ 7 files changed, 148 insertions(+), 14 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index b9a899c2..b332d12c 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -3799,6 +3799,31 @@ btnInitHWPTT->redraw(); progdefaults.changed = true; } +Fl_Round_Button *btnUseGPIOPTT=(Fl_Round_Button *)0; + +static void cb_btnUseGPIOPTT(Fl_Round_Button* o, void*) { + btnTTYptt->value(false); +btnUsePPortPTT->value(false); +btnUseUHrouterPTT->value(false); + +progdefaults.TTYptt = false; +progdefaults.UsePPortPTT = false; +progdefaults.UseUHrouterPTT = false; +progdefaults.UseGPIOPTT = o->value(); + +btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_Counter2 *inpGPIOPort=(Fl_Counter2 *)0; + +static void cb_inpGPIOPort(Fl_Counter2*, void*) { + btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + Fl_Group *grpPTTdelays=(Fl_Group *)0; Fl_Counter *cntPTT_on_delay=(Fl_Counter *)0; @@ -9355,7 +9380,7 @@ le Earth)")); } // Fl_Check_Button* btnPTTrightchannel o->end(); } // Fl_Group* o - { grpHWPTT = new Fl_Group(55, 97, 490, 171, _("h/w ptt device-pin")); + { grpHWPTT = new Fl_Group(55, 97, 490, 184, _("h/w ptt device-pin")); grpHWPTT->box(FL_ENGRAVED_FRAME); grpHWPTT->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnTTYptt = new Fl_Round_Button(74, 121, 220, 20, _("Use separate serial port PTT")); @@ -9401,22 +9426,45 @@ le Earth)")); btnInitHWPTT->tooltip(_("Initialize the H/W PTT interface")); btnInitHWPTT->callback((Fl_Callback*)cb_btnInitHWPTT); } // Fl_Button* btnInitHWPTT - { btnUsePPortPTT = new Fl_Round_Button(74, 197, 170, 20, _("Use parallel port PTT")); + { btnUsePPortPTT = new Fl_Round_Button(74, 191, 170, 20, _("Use parallel port PTT")); btnUsePPortPTT->down_box(FL_DOWN_BOX); btnUsePPortPTT->selection_color((Fl_Color)1); btnUsePPortPTT->callback((Fl_Callback*)cb_btnUsePPortPTT); } // Fl_Round_Button* btnUsePPortPTT - { btnUseUHrouterPTT = new Fl_Round_Button(74, 227, 170, 20, _("Use uHRouter PTT")); + { btnUseUHrouterPTT = new Fl_Round_Button(74, 221, 170, 20, _("Use uHRouter PTT")); btnUseUHrouterPTT->down_box(FL_DOWN_BOX); btnUseUHrouterPTT->selection_color((Fl_Color)1); btnUseUHrouterPTT->callback((Fl_Callback*)cb_btnUseUHrouterPTT); } // Fl_Round_Button* btnUseUHrouterPTT + { btnUseGPIOPTT = new Fl_Round_Button(74, 252, 170, 20, _("Use GPIO PTT")); + btnUseGPIOPTT->down_box(FL_DOWN_BOX); + btnUseGPIOPTT->selection_color((Fl_Color)1); + btnUseGPIOPTT->callback((Fl_Callback*)cb_btnUseGPIOPTT); + } // Fl_Round_Button* btnUseGPIOPTT + { inpGPIOPort = new Fl_Counter2(286, 252, 65, 20, _("GPIO:")); + inpGPIOPort->tooltip(_("Select GPIO port")); + inpGPIOPort->type(1); + inpGPIOPort->box(FL_UP_BOX); + inpGPIOPort->color(FL_BACKGROUND_COLOR); + inpGPIOPort->selection_color(FL_INACTIVE_COLOR); + inpGPIOPort->labeltype(FL_NORMAL_LABEL); + inpGPIOPort->labelfont(0); + inpGPIOPort->labelsize(14); + inpGPIOPort->labelcolor(FL_FOREGROUND_COLOR); + inpGPIOPort->minimum(0); + inpGPIOPort->maximum(31); + inpGPIOPort->step(1); + inpGPIOPort->value(17); + inpGPIOPort->callback((Fl_Callback*)cb_inpGPIOPort); + inpGPIOPort->align(Fl_Align(FL_ALIGN_LEFT)); + inpGPIOPort->when(FL_WHEN_CHANGED); + } // Fl_Counter2* inpGPIOPort grpHWPTT->end(); } // Fl_Group* grpHWPTT - { grpPTTdelays = new Fl_Group(55, 270, 490, 91, _("PTT delays valid for all CAT/PTT types")); + { grpPTTdelays = new Fl_Group(55, 284, 490, 91, _("PTT delays valid for all CAT/PTT types")); grpPTTdelays->box(FL_ENGRAVED_FRAME); grpPTTdelays->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { Fl_Counter* o = cntPTT_on_delay = new Fl_Counter(74, 297, 100, 21, _("Start of transmit PTT delay")); + { Fl_Counter* o = cntPTT_on_delay = new Fl_Counter(74, 311, 100, 21, _("Start of transmit PTT delay")); cntPTT_on_delay->tooltip(_("Delay NN msec before starting audio")); cntPTT_on_delay->minimum(0); cntPTT_on_delay->maximum(500); @@ -9426,7 +9474,7 @@ le Earth)")); o->value(progdefaults.PTT_on_delay); o->lstep(10); } // Fl_Counter* cntPTT_on_delay - { Fl_Counter* o = cntPTT_off_delay = new Fl_Counter(74, 327, 100, 21, _("PTT end of transmit delay")); + { Fl_Counter* o = cntPTT_off_delay = new Fl_Counter(74, 341, 100, 21, _("PTT end of transmit delay")); cntPTT_off_delay->tooltip(_("Delay NN msec before releasing PTT")); cntPTT_off_delay->minimum(0); cntPTT_off_delay->maximum(500); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 9032192f..fdb746eb 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -359,7 +359,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} Fl_Window {} { label {Fldigi configuration} open - xywh {434 227 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible + xywh {610 168 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible } { Fl_Tabs tabsConfigure {open xywh {0 0 600 380} color 50 selection_color 50 @@ -4634,7 +4634,7 @@ progdefaults.changed = true;} } Fl_Group grpHWPTT { label {h/w ptt device-pin} open - xywh {55 97 490 171} box ENGRAVED_FRAME align 21 + xywh {55 97 490 184} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnTTYptt { label {Use separate serial port PTT} @@ -4704,7 +4704,7 @@ progdefaults.UseUHrouterPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} - xywh {74 197 170 20} down_box DOWN_BOX selection_color 1 + xywh {74 191 170 20} down_box DOWN_BOX selection_color 1 } Fl_Round_Button btnUseUHrouterPTT { label {Use uHRouter PTT} @@ -4717,18 +4717,42 @@ progdefaults.UseUHrouterPTT = o->value(); btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} - xywh {74 227 170 20} down_box DOWN_BOX selection_color 1 + xywh {74 221 170 20} down_box DOWN_BOX selection_color 1 + } + Fl_Round_Button btnUseGPIOPTT { + label {Use GPIO PTT} + callback {btnTTYptt->value(false); +btnUsePPortPTT->value(false); +btnUseUHrouterPTT->value(false); + +progdefaults.TTYptt = false; +progdefaults.UsePPortPTT = false; +progdefaults.UseUHrouterPTT = false; +progdefaults.UseGPIOPTT = o->value(); + +btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + xywh {74 252 170 20} down_box DOWN_BOX selection_color 1 + } + Fl_Counter inpGPIOPort { + label {GPIO:} + callback {btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + tooltip {Select GPIO port} xywh {286 252 65 20} type Simple align 4 minimum 0 maximum 31 step 1 value 17 + class Fl_Counter2 } } Fl_Group grpPTTdelays { label {PTT delays valid for all CAT/PTT types} - xywh {55 270 490 91} box ENGRAVED_FRAME align 21 + xywh {55 284 490 91} box ENGRAVED_FRAME align 21 } { Fl_Counter cntPTT_on_delay { label {Start of transmit PTT delay} callback {progdefaults.PTT_on_delay = o->value(); progdefaults.changed = true;} - tooltip {Delay NN msec before starting audio} xywh {74 297 100 21} align 8 minimum 0 maximum 500 step 1 + tooltip {Delay NN msec before starting audio} xywh {74 311 100 21} align 8 minimum 0 maximum 500 step 1 code0 {o->value(progdefaults.PTT_on_delay);} code1 {o->lstep(10);} } @@ -4736,7 +4760,7 @@ progdefaults.changed = true;} label {PTT end of transmit delay} callback {progdefaults.PTT_off_delay = o->value(); progdefaults.changed = true;} - tooltip {Delay NN msec before releasing PTT} xywh {74 327 100 21} align 8 minimum 0 maximum 500 step 1 + tooltip {Delay NN msec before releasing PTT} xywh {74 341 100 21} align 8 minimum 0 maximum 500 step 1 code0 {o->value(progdefaults.PTT_off_delay);} code1 {o->lstep(10);} } diff --git a/src/include/confdialog.h b/src/include/confdialog.h index 6553cdf8..d2bb90e0 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -438,6 +438,8 @@ extern Fl_Round_Button *btnDTRplusV; extern Fl_Button *btnInitHWPTT; extern Fl_Round_Button *btnUsePPortPTT; extern Fl_Round_Button *btnUseUHrouterPTT; +extern Fl_Round_Button *btnUseGPIOPTT; +extern Fl_Counter2 *inpGPIOPort; extern Fl_Group *grpPTTdelays; extern Fl_Counter *cntPTT_on_delay; extern Fl_Counter *cntPTT_off_delay; diff --git a/src/include/configuration.h b/src/include/configuration.h index 630c2ee1..557d7bec 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -59,6 +59,7 @@ # define DEFAULT_HAMRIGDEVICE "/dev/rig" #endif +#define DEFAULT_GPIO_PORT 17 // Format: ELEM_(TYPE, VARIABLE-NAME, TAG-STRING, DOC-STRING, DEFAULT-VALUE) // Variables that are not saved to the xml file have empty TAG-STRINGs and DOC-STRINGs @@ -961,6 +962,9 @@ ELEM_(std::string, PTTdev, "PTTDEV", \ "PTT device", \ DEFAULT_PTTDEV) \ + ELEM_(int, GPIOPort, "GPIOPORT", \ + "PTT GPIO Port", \ + DEFAULT_GPIO_PORT) \ ELEM_(std::string, CWFSKport, "", "", DEFAULT_CWFSKPORT) \ ELEM_(std::string, HamRigDevice, "HAMRIGDEVICE", \ "Hamlib rig device", \ @@ -1009,6 +1013,9 @@ ELEM_(bool, UsePPortPTT, "USEPPORTPTT", \ "Use parallel port PTT", \ false) \ + ELEM_(bool, UseGPIOPTT, "USEGPIOPTT", \ + "Use parallel port PTT", \ + false) \ /* RigCAT parameters */ \ ELEM_(bool, RigCatRTSplus, "RIGCATRTSPLUS", \ "Initial state of RTS", \ diff --git a/src/include/ptt.h b/src/include/ptt.h index 56afca2b..70bf1ff7 100644 --- a/src/include/ptt.h +++ b/src/include/ptt.h @@ -66,7 +66,7 @@ public: // code is not compiled. New tags go to the end of the list. enum ptt_t { PTT_INVALID = -1, PTT_NONE, PTT_HAMLIB, - PTT_RIGCAT, PTT_TTY, PTT_PARPORT, PTT_UHROUTER + PTT_RIGCAT, PTT_TTY, PTT_PARPORT, PTT_UHROUTER, PTT_GPIO }; PTT(ptt_t dev = PTT_NONE); @@ -96,6 +96,10 @@ private: void set_tty(bool ptt); void close_tty(void); + void open_gpio(void); + void set_gpio(bool ptt); + void close_gpio(void); + #if HAVE_PARPORT void open_parport(void); void set_parport(bool ptt); diff --git a/src/misc/configuration.cxx b/src/misc/configuration.cxx index 70834ecf..089223a7 100644 --- a/src/misc/configuration.cxx +++ b/src/misc/configuration.cxx @@ -526,6 +526,8 @@ int configuration::setDefaults() inpTTYdev->value(PTTdev.c_str()); + inpGPIOPort->value(GPIOPort); + chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); chkUSEXMLRPC->value(0); @@ -729,6 +731,8 @@ void configuration::initInterface() PTTdev = inpTTYdev->value(); + GPIOPort = static_cast(inpGPIOPort->value()); + #if USE_HAMLIB chkUSEHAMLIBis = chkUSEHAMLIB->value(); HamlibCMDptt = btnHamlibCMDptt->value(); @@ -789,6 +793,8 @@ void configuration::initInterface() push2talk->reset(PTT::PTT_TTY); else if (UsePPortPTT) push2talk->reset(PTT::PTT_PARPORT); + else if (UseGPIOPTT) + push2talk->reset(PTT::PTT_GPIO); else if (UseUHrouterPTT) push2talk->reset(PTT::PTT_UHROUTER); else diff --git a/src/rigcontrol/ptt.cxx b/src/rigcontrol/ptt.cxx index 2dda9749..f1b79594 100644 --- a/src/rigcontrol/ptt.cxx +++ b/src/rigcontrol/ptt.cxx @@ -9,6 +9,8 @@ // Copyright (C) 2009 // Diane Bruce, VA3DB // +// Added gpio for PTT (Lior KK6BWA) +// // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 @@ -104,6 +106,9 @@ void PTT::reset(ptt_t dev) case PTT_TTY: open_tty(); break; + case PTT_GPIO: + open_gpio(); + break; default: break; // nothing to open } @@ -136,6 +141,9 @@ void PTT::set(bool ptt) case PTT_TTY: set_tty(ptt); break; + case PTT_GPIO: + set_gpio(ptt); + break; #if HAVE_PARPORT case PTT_PARPORT: set_parport(ptt); @@ -157,6 +165,9 @@ void PTT::close_all(void) case PTT_TTY: close_tty(); break; + case PTT_GPIO: + close_gpio(); + break; #if HAVE_PARPORT case PTT_PARPORT: close_parport(); @@ -173,6 +184,38 @@ void PTT::close_all(void) pttfd = -1; } +//-------------------- gpio port PTT --------------------// +void PTT::open_gpio(void) +{ +} + +void PTT::close_gpio(void) +{ +} + +void PTT::set_gpio(bool ptt) +{ +#define VALUE_MAX 30 + static const char s_values_str[] = "01"; + + char path[VALUE_MAX]; + + snprintf(path, VALUE_MAX, "/sys/class/gpio/gpio%d/value", progdefaults.GPIOPort); + int fd = open(path, O_WRONLY); + if (-1 == fd) { + LOG_ERROR("Failed to open gpio (%s) value for writing!\n", path); + return; + } + + if (1 != write(fd, &s_values_str[ ptt ? 1 : 0], 1)) { + LOG_ERROR("Failed to write value!\n"); + return; + } + + close(fd); + +} + //-------------------- serial port PTT --------------------// void PTT::open_tty(void) From 2e2c9e90f926074cd16c75a46ac17d02db94ea26 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 12 Nov 2015 06:25:32 -0600 Subject: [PATCH 040/138] ADIF record repairs * Add code to allow on the fly correction of corrupt ADIF records during file read. --- src/include/adif_def.h | 1 + src/include/adif_io.h | 2 +- src/logbook/adif_io.cxx | 191 ++++++++++++++++++++++--------------- src/logbook/logsupport.cxx | 4 +- 4 files changed, 116 insertions(+), 82 deletions(-) diff --git a/src/include/adif_def.h b/src/include/adif_def.h index 4c412c46..cbaf4d45 100644 --- a/src/include/adif_def.h +++ b/src/include/adif_def.h @@ -32,6 +32,7 @@ using namespace std; struct FIELD { int type; + int fsize; const char *name; Fl_Check_Button **btn; }; diff --git a/src/include/adif_io.h b/src/include/adif_io.h index e168368f..aabb28ae 100644 --- a/src/include/adif_io.h +++ b/src/include/adif_io.h @@ -33,7 +33,7 @@ private: bool write_all; cQsoRec *adifqso; FILE *adiFile; - char *fillfield(int, char *); + char *fillfield(int, int, char *); static int instances; public: cAdifIO (); diff --git a/src/logbook/adif_io.cxx b/src/logbook/adif_io.cxx index fc01b0fa..e09d1bd1 100644 --- a/src/logbook/adif_io.cxx +++ b/src/logbook/adif_io.cxx @@ -54,70 +54,78 @@ static const char *szEOR = ""; // These ADIF fields define the ADIF database FIELD fields[] = { -// TYPE, NAME, WIDGET - {FREQ, "FREQ", &btnSelectFreq}, // QSO frequency in Mhz - {CALL, "CALL", &btnSelectCall}, // contacted stations CALLSIGN - {MODE, "MODE", &btnSelectMode}, // QSO mode - {NAME, "NAME", &btnSelectName}, // contacted operators NAME - {QSO_DATE, "QSO_DATE", &btnSelectQSOdateOn}, // QSO data - {QSO_DATE_OFF, "QSO_DATE_OFF", &btnSelectQSOdateOff},// QSO data OFF, according to ADIF 2.2.6 - {TIME_OFF, "TIME_OFF", &btnSelectTimeOFF}, // HHMM or HHMMSS in UTC - {TIME_ON, "TIME_ON", &btnSelectTimeON}, // HHMM or HHMMSS in UTC - {QTH, "QTH", &btnSelectQth}, // contacted stations city - {RST_RCVD, "RST_RCVD", &btnSelectRSTrcvd}, // received signal report - {RST_SENT, "RST_SENT", &btnSelectRSTsent}, // sent signal report - {STATE, "STATE", &btnSelectState}, // contacted stations STATE - {VE_PROV, "VE_PROV", &btnSelectProvince}, // 2 letter abbreviation for Canadian Province - {NOTES, "NOTES", &btnSelectNotes}, // QSO notes - {QSLRDATE, "QSLRDATE", &btnSelectQSLrcvd}, // QSL received date - {QSLSDATE, "QSLSDATE", &btnSelectQSLsent}, // QSL sent date - {GRIDSQUARE, "GRIDSQUARE", &btnSelectLOC}, // contacted stations Maidenhead Grid Square - {BAND, "BAND", &btnSelectBand}, // QSO band - {CNTY, "CNTY", &btnSelectCNTY}, // secondary political subdivision, ie: county - {COUNTRY, "COUNTRY", &btnSelectCountry}, // contacted stations DXCC entity name - {CQZ, "CQZ", &btnSelectCQZ}, // contacted stations CQ Zone - {DXCC, "DXCC", &btnSelectDXCC}, // contacted stations Country Code - {QSL_VIA, "QSL_VIA", &btnSelectQSL_VIA}, // contacted stations path - {IOTA, "IOTA", &btnSelectIOTA}, // Islands on the air - {ITUZ, "ITUZ", &btnSelectITUZ}, // ITU zone - {CONT, "CONT", &btnSelectCONT}, // contacted stations continent +// TYPE, FSIZE, NAME, WIDGET + {FREQ, 12, "FREQ", &btnSelectFreq}, // QSO frequency in Mhz + {CALL, 15, "CALL", &btnSelectCall}, // contacted stations CALLSIGN + {MODE, 10, "MODE", &btnSelectMode}, // QSO mode + {NAME, 80, "NAME", &btnSelectName}, // contacted operators NAME + {QSO_DATE, 8, "QSO_DATE", &btnSelectQSOdateOn}, // QSO data + {QSO_DATE_OFF, 8, "QSO_DATE_OFF", &btnSelectQSOdateOff},// QSO data OFF, according to ADIF 2.2.6 + {TIME_OFF, 6, "TIME_OFF", &btnSelectTimeOFF}, // HHMM or HHMMSS in UTC + {TIME_ON, 6, "TIME_ON", &btnSelectTimeON}, // HHMM or HHMMSS in UTC + {QTH, 100, "QTH", &btnSelectQth}, // contacted stations city + {RST_RCVD, 3, "RST_RCVD", &btnSelectRSTrcvd}, // received signal report + {RST_SENT, 3, "RST_SENT", &btnSelectRSTsent}, // sent signal report + {STATE, 4, "STATE", &btnSelectState}, // contacted stations STATE + {VE_PROV, 4, "VE_PROV", &btnSelectProvince}, // 2 letter abbreviation for Canadian Province + {NOTES, 256, "NOTES", &btnSelectNotes}, // QSO notes + {QSLRDATE, 8, "QSLRDATE", &btnSelectQSLrcvd}, // QSL received date + {QSLSDATE, 8, "QSLSDATE", &btnSelectQSLsent}, // QSL sent date + {GRIDSQUARE, 8, "GRIDSQUARE", &btnSelectLOC}, // contacted stations Maidenhead Grid Square + {BAND, 8, "BAND", &btnSelectBand}, // QSO band + {CNTY, 20, "CNTY", &btnSelectCNTY}, // secondary political subdivision, ie: county + {COUNTRY, 40, "COUNTRY", &btnSelectCountry}, // contacted stations DXCC entity name + {CQZ, 8, "CQZ", &btnSelectCQZ}, // contacted stations CQ Zone + {DXCC, 8, "DXCC", &btnSelectDXCC}, // contacted stations Country Code + {QSL_VIA, 50, "QSL_VIA", &btnSelectQSL_VIA}, // contacted stations path + {IOTA, 20, "IOTA", &btnSelectIOTA}, // Islands on the air + {ITUZ, 20, "ITUZ", &btnSelectITUZ}, // ITU zone + {CONT, 20, "CONT", &btnSelectCONT}, // contacted stations continent - {SRX, "SRX", &btnSelectSerialIN}, // received serial number for a contest QSO - {STX, "STX", &btnSelectSerialOUT}, // QSO transmitted serial number + {SRX, 50, "SRX", &btnSelectSerialIN}, // received serial number for a contest QSO + {STX, 50, "STX", &btnSelectSerialOUT}, // QSO transmitted serial number - {XCHG1, "SRX_STRING", &btnSelectXchgIn}, // contest exchange #1 / free1 in xlog - {MYXCHG, "STX_STRING", &btnSelectMyXchg}, // contest exchange sent + {XCHG1, 100, "SRX_STRING", &btnSelectXchgIn}, // contest exchange #1 / free1 in xlog + {MYXCHG, 100, "STX_STRING", &btnSelectMyXchg}, // contest exchange sent - {TX_PWR, "TX_PWR", &btnSelectTX_pwr}, // power transmitted by this station - {NUMFIELDS, "", NULL} + {TX_PWR, 8, "TX_PWR", &btnSelectTX_pwr}, // power transmitted by this station + {NUMFIELDS, 0, "", NULL} }; // This ADIF fields is in the fldigi QSO database, but not saved in the ADIF file /* - {EXPORT, "EXPORT", NULL}, // used to indicate record is to be exported + {EXPORT, 0, "EXPORT", NULL}, // used to indicate record is to be exported */ // These ADIF fields are not in the fldigi QSO database /* - {COMMENT, "COMMENT", NULL}, // comment field for QSO - {ADDRESS, "ADDRESS", NULL}, // contacted stations mailing address - {AGE, "AGE", NULL}, // contacted operators age in years - {ARRL_SECT, "ARRL_SECT", NULL}, // contacted stations ARRL section - {CONTEST_ID, "CONTEST_ID", NULL}, // QSO contest identifier - {OPERATOR, "OPERATOR", NULL}, // Callsign of person logging the QSO - {PFX, "PFX", NULL}, // WPA prefix - {PROP_MODE, "PROP_MODE", NULL}, // propogation mode - {QSL_MSG, "QSL_MSG", NULL}, // personal message to appear on qsl card - {QSL_RCVD, "QSL_RCVD", NULL}, // QSL received status - {QSL_SENT, "QSL_SENT", NULL}, // QSL sent status - {QSL_VIA, "QSL_VIA", NULL}, // QSL via this person - {RX_PWR, "RX_PWR", NULL}, // power of other station in watts - {SAT_MODE, "SAT_MODE", NULL}, // satellite mode - {SAT_NAME, "SAT_NAME", NULL}, // satellite name - {TEN_TEN, "TEN_TEN", NULL} // ten ten # of other station + {COMMENT, 256, "COMMENT", NULL}, // comment field for QSO + {ADDRESS, 256, "ADDRESS", NULL}, // contacted stations mailing address + {AGE, 2, "AGE", NULL}, // contacted operators age in years + {ARRL_SECT, 20, "ARRL_SECT", NULL}, // contacted stations ARRL section + {CONTEST_ID, 20, "CONTEST_ID", NULL}, // QSO contest identifier + {OPERATOR, 20, "OPERATOR", NULL}, // Callsign of person logging the QSO + {PFX, 20, "PFX", NULL}, // WPA prefix + {PROP_MODE, 100, "PROP_MODE", NULL}, // propogation mode + {QSL_MSG, 256, "QSL_MSG", NULL}, // personal message to appear on qsl card + {QSL_RCVD, 4, "QSL_RCVD", NULL}, // QSL received status + {QSL_SENT, 4, "QSL_SENT", NULL}, // QSL sent status + {QSL_VIA, 20, "QSL_VIA", NULL}, // QSL via this person + {RX_PWR, 8, "RX_PWR", NULL}, // power of other station in watts + {SAT_MODE, 20, "SAT_MODE", NULL}, // satellite mode + {SAT_NAME, 20, "SAT_NAME", NULL}, // satellite name + {TEN_TEN, 10, "TEN_TEN", NULL} // ten ten # of other station }; */ +static string read_errors; +static int num_read_errors; + +static void write_rxtext(const char *s) +{ + ReceiveText->addstr(s); +} + static char *fastlookup = 0; static unsigned int maxlen = 0; @@ -181,7 +189,7 @@ cAdifIO::~cAdifIO() } } -char * cAdifIO::fillfield (int fieldnum, char *buff) +char * cAdifIO::fillfield (int recnbr, int fieldnum, char *buff) { char *p1 = strchr(buff, ':'); char *p2 = strchr(buff, '>'); @@ -197,20 +205,30 @@ char * cAdifIO::fillfield (int fieldnum, char *buff) } p1++; } + string tmp = ""; tmp.assign(p2+1, fldsize); - if ((fieldnum == TIME_ON || fieldnum == TIME_OFF) && fldsize < 6) { - while (tmp.length() < 6) tmp += '0'; - adifqso->putField(fieldnum, tmp.c_str(), 6); - } else { - adifqso->putField (fieldnum, p2+1, fldsize); - } - return p2 + fldsize + 1; -} -static void write_rxtext(const char *s) -{ - ReceiveText->addstr(s); +// added to disallow very large corrupted adif fields + if (fldsize > fields[fieldnum].fsize) { + string bfr = buff; + tmp.erase(fields[fieldnum].fsize); + static char szmsg[1000]; + snprintf(szmsg, sizeof(szmsg), + "In record # %d, <%s, too large, saving first %d characters\n", + recnbr+1, + bfr.substr(0, (int)(p2+1 - buff)).c_str(), + fields[fieldnum].fsize ); + read_errors.append(szmsg); + num_read_errors++; + } + + if ((fieldnum == TIME_ON || fieldnum == TIME_OFF) && fldsize < 6) + while (tmp.length() < 6) tmp += '0'; + + adifqso->putField( fieldnum, tmp.c_str(), tmp.length() ); + + return p2 + fldsize + 1; } void cAdifIO::do_readfile(const char *fname, cQsoDb *db) @@ -218,6 +236,9 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) int found; static char szmsg[200]; + read_errors.clear(); + num_read_errors = 0; + // open the adif file FILE *adiFile = fopen (fname, "rb"); @@ -233,13 +254,13 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) clock_gettime(CLOCK_REALTIME, &t0); #endif - char buff[8192]; + char buff[16384]; string sbuff; - memset(buff, 0, 8192); - int retnbr = fread(buff, 1, 8192, adiFile); + memset(buff, 0, 16384); + int retnbr = fread(buff, 1, 16384, adiFile); if (retnbr) sbuff.assign(buff, retnbr); - size_t p = sbuff.find(""); + size_t p = sbuff.find(""); if (p == std::string::npos) p = sbuff.find(""); if (p == std::string::npos) { return; @@ -249,12 +270,18 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) // skip over cr/lf pairs while (sbuff.length() && (sbuff[0] == '\r' || sbuff[0] == '\n')) sbuff.erase(0,1); - retnbr = fread(buff, 1, 8192, adiFile); - if (retnbr) sbuff.append(buff, retnbr); p = sbuff.find(""); if (p == std::string::npos) p = sbuff.find(""); + while (!feof(adiFile) && (p == std::string::npos)) { + retnbr = fread(buff, 1, 16384, adiFile); + if (retnbr) sbuff.append(buff, retnbr); + p = sbuff.find(""); + if (p == std::string::npos) p = sbuff.find(""); + } + if (p == std::string::npos) return; + char *ptr = 0, *ptr2 = 0; int recnbr = 0; @@ -267,7 +294,7 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) found = findfield(ptr+1); if (found > -1) { if (!adifqso) adifqso = db->newrec(); // need new record in db - ptr2 = fillfield (found, ptr+1); + ptr2 = fillfield (recnbr, found, ptr+1); } else if (found == -1) { // reached; break; } else { @@ -286,9 +313,9 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) p = sbuff.find(""); if (p == std::string::npos) p = sbuff.find(""); - if (p == std::string::npos) { - memset(buff, 0, 8192); - retnbr = fread(buff, 1, 8192, adiFile); + + while (!feof(adiFile) && (p == std::string::npos)) { + retnbr = fread(buff, 1, 16384, adiFile); if (retnbr) sbuff.append(buff, retnbr); p = sbuff.find(""); if (p == std::string::npos) p = sbuff.find(""); @@ -308,15 +335,21 @@ void cAdifIO::do_readfile(const char *fname, cQsoDb *db) snprintf(szmsg, sizeof(szmsg), "\ ERROR reading logbook %s\n\ read %d records in %4.2f seconds", fname, db->nbrRecs(), t); - else + else { snprintf(szmsg, sizeof(szmsg), "\ Loaded logbook %s\n\ - read %d records in %4.2f seconds", fname, db->nbrRecs(), t); - - REQ(write_rxtext, "\n"); - REQ(write_rxtext, szmsg); - REQ(write_rxtext, "\n"); - LOG_INFO("%s", szmsg); + read %d records in %4.2f seconds\n", fname, db->nbrRecs(), t); + LOG_INFO("%s", szmsg); + if (num_read_errors) { + read_errors.insert(0, szmsg); + snprintf(szmsg, sizeof(szmsg), + "Corrected %d errors\nSave logbook and then reload", + num_read_errors); + read_errors.append(szmsg); + REQ(write_rxtext, read_errors.c_str()); + } else + REQ(write_rxtext, szmsg); + } if (db == &qsodb) REQ(adif_read_OK); diff --git a/src/logbook/logsupport.cxx b/src/logbook/logsupport.cxx index 0134168c..8fddee7f 100644 --- a/src/logbook/logsupport.cxx +++ b/src/logbook/logsupport.cxx @@ -276,7 +276,7 @@ void cb_mnuOpenLogbook(Fl_Menu_* m, void* d) { string title = _("Open logbook file"); string filter; - filter.assign("ADIF file\t*.").append(ADIF_SUFFIX); + filter.assign("ADIF file\t*.{adi,adif}"); #ifdef __APPLE__ filter.append("\n"); #endif @@ -503,7 +503,7 @@ void merge_recs( cQsoDb *db, cQsoDb *mrgdb ) // (haystack, needle) } void cb_mnuMergeADIF_log(Fl_Menu_* m, void* d) { - const char* p = FSEL::select(_("Merge ADIF file"), "ADIF\t*." ADIF_SUFFIX, LogsDir.c_str()); + const char* p = FSEL::select(_("Merge ADIF file"), "ADIF\t*.{adi,adif}", LogsDir.c_str()); Fl::wait(); fl_digi_main->redraw(); Fl::awake(); From c86ec80332ac575d940606b57b40cf017a38c9d3 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 19 Nov 2015 05:31:01 -0600 Subject: [PATCH 041/138] dock macros * add dockable macros in a 4x12 matrix - provides access to all 48 macros. - group of 48 can be dragged to/from it's default position just below the main menu bar * change vertical raster height to 20 vice 60 - decreased minimum vertical main dialog dimension for small netbook screens * update to documentation --- fldigi_doxygen/images/macro-matrix.png | Bin 0 -> 34699 bytes fldigi_doxygen/images/macro-scheme-4.png | Bin 0 -> 16047 bytes fldigi_doxygen/images/view-hide-48.png | Bin 0 -> 8153 bytes .../user_src_docs/ConfigUI-macros.txt | 32 +- fldigi_doxygen/user_src_docs/Macros.txt | 32 +- src/Makefile.am | 11 + src/dialogs/fl_digi.cxx | 429 +++++++++++++----- src/feld/feld.cxx | 3 + src/include/dock_events.h | 9 + src/include/dock_gp.h | 31 ++ src/include/drag_btn.h | 27 ++ src/include/dropwin.h | 39 ++ src/include/feld.h | 14 +- src/include/fl_digi.h | 5 +- src/include/raster.h | 1 + src/include/status.h | 2 + src/include/toolgrp.h | 72 +++ src/include/toolwin.h | 37 ++ src/misc/status.cxx | 7 + src/waterfall/raster.cxx | 2 +- src/widgets/dock_gp.cxx | 59 +++ src/widgets/drag_btn.cxx | 144 ++++++ src/widgets/dropwin.cxx | 67 +++ src/widgets/toolgrp.cxx | 204 +++++++++ src/widgets/toolwin.cxx | 101 +++++ 25 files changed, 1203 insertions(+), 125 deletions(-) create mode 100644 fldigi_doxygen/images/macro-matrix.png create mode 100644 fldigi_doxygen/images/macro-scheme-4.png create mode 100644 fldigi_doxygen/images/view-hide-48.png create mode 100644 src/include/dock_events.h create mode 100644 src/include/dock_gp.h create mode 100644 src/include/drag_btn.h create mode 100644 src/include/dropwin.h create mode 100644 src/include/toolgrp.h create mode 100644 src/include/toolwin.h create mode 100644 src/widgets/dock_gp.cxx create mode 100644 src/widgets/drag_btn.cxx create mode 100644 src/widgets/dropwin.cxx create mode 100644 src/widgets/toolgrp.cxx create mode 100644 src/widgets/toolwin.cxx diff --git a/fldigi_doxygen/images/macro-matrix.png b/fldigi_doxygen/images/macro-matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..05d92de537b8b8681bd2fce600524685a9373dc8 GIT binary patch literal 34699 zcmZ^~18^nL_qN-yC&t7xv2EL#*qGS1ZQHgd)+CuE6Wi9rwoY{O`{UmFs=m9b>zwX7 zXYa;dy?d?oyd9w+FM$M)3l9JQl9Z&V5&%F%f3ADLf`5L#5pni?enB`1OR2!Z!mjQ7 z*#6waaTe2XR<<*Bb~A7^0c;GMP3WAA98FAYoy_f=hf}Yl0e~2g5*1Q$&pyjB)4^C; z8k({;!`AS`7J>v*?4>u9z+l7mVo)?X8?1%%lR?8{%3QXhT~@6BOK%8)A*K>}x0yQG z;NxbRiyZ~qAd{f$x|4A^gnj06F!{XUbvT}}2Hop`Z;6Wj(e3&j?0+p_)WONME+?E4 zQR#3z&*9{0WjQ!*0Ueouvygu7^WZ=2ov6|MxUaHDIZ>I_T*?K1l}F{RhL1_`zTtay zCEj@}JaBX4G?~}w4*J`^Dxrj%zFPnx(PF(a>pb?~9l&-Qj-}GwP`F7uMpji-l}=QU z($mWmmRYJIDyXUjtKJvxt1ZX`1*){OSIDliR{c*a3`T?5ClQ!fL_Gfag#}Dy*1ihV zY8z{%L}kKtzhYG;|KHVs|F25Drj^RjzZFR5QcysF{=5i`kT7Xn-T3W1`= zhJW5vX^V?mJlaGKO+ox0Gq0i4p(%7|Vu2>Ew&Yy3P~BjqmbAI*%%SvL3%?&05bEJ1 zS9_m{c&A&mz%Go_9;z)m>wdP9s6iu<>g;gX$sN*kAHw`NwSNXw$7DJyZOj`JRAGx= zL+#l4JzYvzN$g(?k6rC!A4xpQ^z*Njh6 zK71XTaa+8Z3>Wsst%48|?Fg4$_7SrlHQ9?&eZz*8Z_TbTGAMM^NC+r*R<-8Zu=cJ>87X=$ZheiN*lVou?LQ(P^cPA(ip z+{4pf4Q<#n;a>XKuKk2X0D$8DtaYDUD1t%l^vGg{pzb1`x9B6DuT#`g}dcxA3oA+=?=V7G?!`e97ee(S|S008kO z+3Bno?{}T*gIQyV4>8%!zw?(`!otL}k^uh~`_1^C7oB#lEy53KGzj~xhqFG|qSTK) zWvObx(}vr{k)6<+S>ic!|LIOY0eC>LIP$EASW2MP`h@U$kD$yI$y$ca+igEi|6qy| z^mqgBwh^iZHCB4}a2}m8wl)V8XFS^3)80#EdYYva!_ek5W$~Q&b=rM#VHc7{(}&FI zdTyC_3f3f94{0KmF=t)Wf&nAOQ^)dB{$q?2F&lnL6Ku@>(=$!CGw5HM?b&#|nfA>| zA09zoP|nIAw;V^JzrTNeb5csmo2tra{%QDM;peTkCSr1Gg67Ao29r4lrn;u|HI<
    %V*hN6||#p{P*Z;$G{m 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 k-V!Z07*qoM6N<$f^$nduK)l5 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/macro-scheme-4.png b/fldigi_doxygen/images/macro-scheme-4.png new file mode 100644 index 0000000000000000000000000000000000000000..ab945e7d896555accb50218e26b4b6242e480be7 GIT binary patch literal 16047 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 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/view-hide-48.png b/fldigi_doxygen/images/view-hide-48.png new file mode 100644 index 0000000000000000000000000000000000000000..6e866f2e6cbf2f050d50a66f39cc51b6cbc503f0 GIT binary patch literal 8153 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 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/user_src_docs/ConfigUI-macros.txt b/fldigi_doxygen/user_src_docs/ConfigUI-macros.txt index 44fb270c..212c5c12 100644 --- a/fldigi_doxygen/user_src_docs/ConfigUI-macros.txt +++ b/fldigi_doxygen/user_src_docs/ConfigUI-macros.txt @@ -30,9 +30,16 @@ fldigi macro bar positions will change immediately so you can see the selection.
    -With 2 rows shown you obtain access to the primary set with normal -Function key press. The secondary set is accessed by a -SHIFT-Function-key press. +
    +\image html macrobuttons.png "Macro Buttons" +\image latex macrobuttons.png "Macro Buttons" width=6.0in +
    +
    + +
    +\image html macro-scheme-4.png "Macro Buttons - Scheme 4" +\image latex macro-scheme-4.png "Macro Buttons - Scheme 4" width=6.0in +

    You edit any macro definition by using a mouse right-click on it's button. @@ -43,6 +50,25 @@ sub-sets. When checked you simply hover the mouse over the macro bar and roll the mouse wheel.
    +All 48 macro buttons can be displayed in a matrix. + +\image html macro-matrix.png "Macro Buttons Matrix" +\image latex macro-matrix.png "Macro Buttons Matrix" width=6.0in +
    + +The matrix display is toggled on and off using the menu item +
    +\image html view-hide-48.png "" +\image latex view-hide-48.png "" width=1.0in +
    +
    + +The matrix display can be dragged off and restored to it's position below +the main menu. The drag button is the knurled vertical button on the left +edge of the matrix. Left click on the drag button and drag the matrix with +the mouse. +
    + Fldigi manages multiple files that contain macro definitions. You may want to have the last used macro file be the one available the next time you start fldigi. If so, simply enable the "load last used Macro file on diff --git a/fldigi_doxygen/user_src_docs/Macros.txt b/fldigi_doxygen/user_src_docs/Macros.txt index bbbdf193..32990359 100644 --- a/fldigi_doxygen/user_src_docs/Macros.txt +++ b/fldigi_doxygen/user_src_docs/Macros.txt @@ -4,9 +4,17 @@ \tableofcontents Macros are short text statements that contain imbedded references to text -data used by the program fldigi. Macro definition files(s) are located -in the $HOME/.fldigi/macros/ directory and all have the extention ".mdf". The -default set of macros are contained in the +data used by the program fldigi. A macro is accessed via the macro button +bar or function key. + +
    +\image html macrobuttons.png "Macro Buttons" +\image latex macrobuttons.png "Macro Buttons" width=6.0in +
    +
    + +Macro definition files(s) are located in the $HOME/.fldigi/macros/ directory +and all have the extention ".mdf". The default set of macros are contained in the file $HOME/.fldigi/macros/macros.mdf. Fldigi will create this file with a set of default macros on its first @@ -15,7 +23,23 @@ execution. Fldigi supports up to 48 macro definitions in sets of 12. Macro definitions are not recursive, that is; a macro cannot reference -another macro or itself. +another macro or itself. All 48 macro buttons can be displayed in a matrix. + +\image html macro-matrix.png "Macro Buttons Matrix" +\image latex macro-matrix.png "Macro Buttons Matrix" width=6.0in +
    + +The matrix display is toggled on and off using the menu item +
    +\image html view-hide-48.png "" +\image latex view-hide-48.png "" width=1.0in +
    +
    + +The matrix display can be dragged off and restored to it's position below +the main menu. The drag button is the knurled vertical button on the left +edge of the matrix. Left click on the drag button and drag the matrix with +the mouse.
    The imbedded references are similar to those used by DigiPan and other diff --git a/src/Makefile.am b/src/Makefile.am index 8a39ab87..7d2b0e48 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -493,6 +493,12 @@ fldigi_SOURCES += \ include/psk_browser.h \ include/utf8file_io.h \ include/weather.h \ + include/dock_events.h \ + include/dock_gp.h \ + include/drag_btn.h \ + include/dropwin.h \ + include/toolgrp.h \ + include/toolwin.h \ irrxml/CXMLReaderImpl.h \ irrxml/fast_atof.h \ irrxml/heapsort.h \ @@ -605,6 +611,11 @@ fldigi_SOURCES += \ widgets/psk_browser.cxx \ widgets/smeter.cxx \ widgets/pwrmeter.cxx \ + widgets/dock_gp.cxx \ + widgets/drag_btn.cxx \ + widgets/dropwin.cxx \ + widgets/toolgrp.cxx \ + widgets/toolwin.cxx \ fsq/fsq.cxx \ ifkp/ifkp.cxx \ ifkp/tux.cxx \ diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 7facfb3c..492c57ae 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -163,6 +163,10 @@ #include "record_loader.h" #include "record_browse.h" +#include "toolgrp.h" +#include "dropwin.h" +#include "dock_events.h" + #define CB_WHEN FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED | FL_WHEN_ENTER_KEY | FL_WHEN_RELEASE #define LOG_TO_FILE_MLABEL _("Log all RX/TX text") @@ -216,7 +220,14 @@ fre_t seek_re("CQ", REG_EXTENDED | REG_ICASE | REG_NOSUB); bool bWF_only = false; bool withnoise = false; -Fl_Double_Window *fl_digi_main = (Fl_Double_Window *)0; +//Fl_Double_Window *fl_digi_main = (Fl_Double_Window *)0; +dropwin *fl_digi_main; + +dockgroup *dock; // the macro buttons dock + +Fl_Button *btnDockMacro[48]; +toolgrp *tgroup; + Fl_Help_Dialog *help_dialog = (Fl_Help_Dialog *)0; Fl_Double_Window *scopeview = (Fl_Double_Window *)0; @@ -230,6 +241,7 @@ Fl_Light_Button *btnTxRSID = (Fl_Light_Button *)0; static Fl_Button *btnMacroTimer = (Fl_Button *)0; Fl_Group *center_group = (Fl_Group *)0; +Fl_Group *text_group; Fl_Group *wefax_group = 0; Fl_Group *mvgroup = 0; @@ -412,8 +424,10 @@ static const int Wbtn = Hentry; static int x_qsoframe = Wbtn; int Hmenu = 22; static const int Hqsoframe = pad + 3 * (Hentry + pad); -int Hstatus = 22; -int Hmacros = 22; +int Hstatus = 22; +int Hmacros = 22; + +#define TB_HEIGHT (20*4 + 6) static const int sw = 22; static const int wf1 = 395; @@ -424,7 +438,9 @@ static const int w_inpRstIn2 = 30; static const int w_inpRstOut2 = 30; // minimum height for raster display, FeldHell, is 66 pixels -static const int minhtext = 66*2+4; // 66 : raster min height x 2 : min panel box, 4 : frame +// )FELD-HELL raster min height) + frame width * 2 +static const int minhtext = FELD_RX_COLUMN_LEN * 2 + 6; +static const int mintxtext = 80; static int main_hmin = HMIN; @@ -1116,25 +1132,32 @@ void startup_modem(modem* m, int f) if (!bWF_only) { if (id >= MODE_WEFAX_FIRST && id <= MODE_WEFAX_LAST) { - center_group->hide(); +// center_group->hide(); + text_group->hide(); fsq_group->hide(); ifkp_group->hide(); wefax_group->show(); - wefax_group->redraw(); +// wefax_group->redraw(); + center_group->redraw(); } else if (id == MODE_FSQ) { - center_group->hide(); +// center_group->hide(); + text_group->hide(); wefax_group->hide(); ifkp_group->hide(); fsq_group->show(); - fsq_group->redraw(); +// fsq_group->redraw(); + center_group->redraw(); } else if (id == MODE_IFKP) { - center_group->hide(); +// center_group->hide(); + text_group->hide(); wefax_group->hide(); fsq_group->hide(); ifkp_group->show(); - ifkp_group->redraw(); +// ifkp_group->redraw(); + center_group->redraw(); } else { - center_group->show(); +// center_group->show(); + text_group->show(); wefax_group->hide(); fsq_group->hide(); ifkp_group->hide(); @@ -1321,6 +1344,7 @@ void remove_windows() fsqMonitor->hide(); delete fsqMonitor; } + tgroup->hide_all(); // if (fsqDebug) { // fsqDebug->hide(); @@ -1825,6 +1849,41 @@ void macro_cb(Fl_Widget *w, void *v) restoreFocus(5); } +void colorize_docked_macros(int i) +{ + if (progdefaults.useGroupColors == true) { + int k = i / 4; + if (k == 0 || k == 3 || k == 6 || k == 9) + btnDockMacro[i]->color(fl_rgb_color( + progdefaults.btnGroup1.R, + progdefaults.btnGroup1.G, + progdefaults.btnGroup1.B)); + else if (k == 1 || k == 4 || k == 7 || k == 10) + btnDockMacro[i]->color(fl_rgb_color( + progdefaults.btnGroup2.R, + progdefaults.btnGroup2.G, + progdefaults.btnGroup2.B)); + else + btnDockMacro[i]->color(fl_rgb_color( + progdefaults.btnGroup3.R, + progdefaults.btnGroup3.G, + progdefaults.btnGroup3.B)); + btnDockMacro[i]->labelcolor( + fl_rgb_color( + progdefaults.btnFkeyTextColor.R, + progdefaults.btnFkeyTextColor.G, + progdefaults.btnFkeyTextColor.B )); + btnDockMacro[i]->labelcolor(progdefaults.MacroBtnFontcolor); + btnDockMacro[i]->labelfont(progdefaults.MacroBtnFontnbr); + btnDockMacro[i]->labelsize(progdefaults.MacroBtnFontsize); + } else { + btnDockMacro[i]->color(FL_BACKGROUND_COLOR); + btnDockMacro[i]->labelcolor(FL_FOREGROUND_COLOR); + btnDockMacro[i]->labelfont(progdefaults.MacroBtnFontnbr); + btnDockMacro[i]->labelsize(progdefaults.MacroBtnFontsize); + } +} + void colorize_macro(int i) { int j = i % NUMMACKEYS; @@ -1865,10 +1924,8 @@ void colorize_macro(int i) void colorize_macros() { FL_LOCK_D(); - for (int i = 0; i < NUMMACKEYS * NUMKEYROWS; i++) { - colorize_macro(i); - btnMacro[i]->redraw_label(); - } + for (int i = 0; i < NUMMACKEYS * NUMKEYROWS; i++) colorize_macro(i); + for (int i = 0; i < 48; i++) colorize_docked_macros(i); btnAltMacros1->labelsize(progdefaults.MacroBtnFontsize); btnAltMacros1->redraw_label(); btnAltMacros2->labelsize(progdefaults.MacroBtnFontsize); @@ -2104,8 +2161,13 @@ void cb_view_hide_channels(Fl_Menu_ *w, void *d) progStatus.tile_x = save_mvx; } - if (progdefaults.rxtx_swap) progStatus.tile_y = TransmitText->h(); - else progStatus.tile_y = ReceiveText->h(); + if (progdefaults.rxtx_swap) { + progStatus.tile_y = TransmitText->h(); + progStatus.tile_y_ratio = 1.0 * TransmitText->h() / text_panel->h(); + } else { + progStatus.tile_y = ReceiveText->h(); + progStatus.tile_y_ratio = 1.0 * ReceiveText->h() / text_panel->h(); + } UI_select(); return; @@ -2311,7 +2373,7 @@ void cb_mnuCheckUpdate(Fl_Widget *, void *) if (is_ok) fl_message2(_("You are running the latest version")); else { - int choice = + int choice = fl_choice2(_("Version %s is available at Source Forge\n\nWhat would you like to do?"), _("Close"), _("Visit URL"), _("Copy URL"), version_str.c_str()); @@ -2577,6 +2639,10 @@ void set_macroLabels() btnMacro[i]->redraw_label(); } } + for (int i = 0; i < 48; i++) { + btnDockMacro[i]->label(macros.name[i].c_str()); + btnDockMacro[i]->redraw_label(); + } } void cb_mnuPicViewer(Fl_Menu_ *, void *) { @@ -2837,7 +2903,7 @@ if (bWF_only) return; if (active_modem->get_mode() == MODE_IFKP) ifkp_load_avatar(inpCall->value()); - if (active_modem->get_mode() >= MODE_THOR11 && + if (active_modem->get_mode() >= MODE_THOR11 && active_modem->get_mode() <= MODE_THOR22) thor_load_avatar(inpCall->value()); @@ -3419,6 +3485,7 @@ void UI_check_swap() text_panel->add(minbox); text_panel->resizable(minbox); progStatus.tile_y = TransmitText->h(); + progStatus.tile_y_ratio = 1.0 * TransmitText->h() / text_panel->h(); } if (!progdefaults.rxtx_swap && ReceiveText->y() > TransmitText->y()) { rx_y = TransmitText->y(); @@ -3452,6 +3519,7 @@ void UI_check_swap() text_panel->add(minbox); text_panel->resizable(minbox); progStatus.tile_y = ReceiveText->h(); + progStatus.tile_y_ratio = 1.0 * ReceiveText->h() / text_panel->h(); } // resize fsq UI @@ -3521,12 +3589,14 @@ void resize_macroframe1(int x, int y, int w, int h) { macroFrame1->resize(x, y, w, h); macroFrame1->init_sizes(); + macroFrame1->redraw(); } void resize_macroframe2(int x, int y, int w, int h) { macroFrame2->resize(x, y, w, h); macroFrame2->init_sizes(); + macroFrame2->redraw(); } int UI_position_macros(int x, int y1, int w, int HTh) @@ -3534,18 +3604,41 @@ int UI_position_macros(int x, int y1, int w, int HTh) int mh = progdefaults.macro_height; int mh2 = progdefaults.macro_height / 2; +// docked macro's + + if (progStatus.tbar_is_docked) { + resize_macroframe2(x,y1,w,mh2); + macroFrame2->hide(); + btnAltMacros2->deactivate(); + resize_macroframe1(x,y1,w,mh2); + macroFrame1->hide(); + HTh += mh; + center_group->resize(x, y1, w, HTh); + wefax_group->resize(x, y1, w, HTh); + fsq_group->resize(x, y1, w, HTh); + ifkp_group->resize(x, y1, w, HTh); + UI_select_central_frame(y1, HTh); + y1 += HTh; + wfpack->position(x, y1); + y1 += wfpack->h(); + hpack->position(x, y1); + fl_digi_main->workspace->init_sizes(); + return y1; + } + switch (progdefaults.mbar_scheme) { // 0, 1, 2 one bar schema case 0: - macroFrame2->size(macroFrame2->w(), 0); + resize_macroframe2(x,y1,w,mh); macroFrame2->hide(); btnAltMacros2->deactivate(); - resize_macroframe1(0, y1, w, mh); + resize_macroframe1(x, y1, w, mh); + macroFrame1->show(); btnAltMacros1->activate(); y1 += mh; - center_group->resize(0, y1, w, HTh); - wefax_group->resize(0, y1, w, HTh); - fsq_group->resize(0, y1, w, HTh); - ifkp_group->resize(0, y1, w, HTh); + center_group->resize(x, y1, w, HTh); + wefax_group->resize(x, y1, w, HTh); + fsq_group->resize(x, y1, w, HTh); + ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wfpack->position(x, y1); @@ -3554,7 +3647,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) break; default: case 1: - macroFrame2->size(macroFrame2->w(), 0); + resize_macroframe2(x,y1,w,mh); macroFrame2->hide(); btnAltMacros2->deactivate(); center_group->resize(0, y1, w, HTh); @@ -3564,6 +3657,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe1(0, y1, w, mh); + macroFrame1->show(); btnAltMacros1->activate(); y1 += mh; wfpack->position(x, y1); @@ -3571,7 +3665,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) hpack->position(x, y1); break; case 2: - macroFrame2->size(macroFrame2->w(), 0); + resize_macroframe2(x,y1,w,mh); macroFrame2->hide(); btnAltMacros2->deactivate(); center_group->resize(0, y1, w, HTh); @@ -3583,12 +3677,14 @@ int UI_position_macros(int x, int y1, int w, int HTh) wfpack->position(x, y1); y1 += wfpack->h(); resize_macroframe1(0, y1, w, mh); + macroFrame1->show(); btnAltMacros1->activate(); y1 += mh; hpack->position(x, y1); break; case 3: resize_macroframe1(0, y1, w, mh2); + macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh2; resize_macroframe2(0, y1, w, mh2); @@ -3611,6 +3707,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) btnAltMacros2->activate(); y1 += mh2; resize_macroframe1(0, y1, w, mh2); + macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh2; center_group->resize(0, y1, w, HTh); @@ -3631,6 +3728,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe1(0, y1, w, mh2); + macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh2; resize_macroframe2(0, y1, w, mh2); @@ -3652,6 +3750,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) btnAltMacros2->activate(); y1 += mh2; resize_macroframe1(0, y1, w, mh2); + macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh2; wfpack->position(x, y1); @@ -3666,6 +3765,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe1(0, y1, w, mh2); + macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh2; wfpack->position(x, y1); @@ -3687,6 +3787,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) wfpack->position(x, y1); y1 += wfpack->h(); resize_macroframe1(0, y1, w, mh2); + macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh2; hpack->position(x, y1); @@ -3701,6 +3802,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) wfpack->position(x, y1); y1 += wfpack->h(); resize_macroframe1(0, y1, w, mh2); + macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh2; resize_macroframe2(0, y1, w, mh2); @@ -3723,6 +3825,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) btnAltMacros2->activate(); y1 += mh2; resize_macroframe1(0, y1, w, mh2); + macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh2; hpack->position(x, y1); @@ -3739,6 +3842,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe1(0, y1, w, mh2); + macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh2; wfpack->position(x, y1); @@ -3747,6 +3851,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) break; case 12: resize_macroframe1(0, y1, w, mh2); + macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh2; center_group->resize(0, y1, w, HTh); @@ -3764,6 +3869,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) hpack->position(x, y1); break; } + fl_digi_main->workspace->init_sizes(); return y1; } @@ -3785,10 +3891,10 @@ void UI_select() getMenuItem(RIGLOG_FULL_MLABEL)->setonly(); } - int x = macroFrame1->x(); - int y1 = TopFrame1->y(); - int w = fl_digi_main->w(); - int HTh; + int x = fl_digi_main->workspace->x();//macroFrame1->x(); + int y1 = fl_digi_main->workspace->y();//TopFrame1->y(); + int w = fl_digi_main->workspace->w();//fl_digi_main->w(); + int HTh = fl_digi_main->workspace->h(); if (cnt_macro_height) { if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { // 2 bars @@ -3803,10 +3909,8 @@ void UI_select() cnt_macro_height->value(progdefaults.macro_height); } - HTh = fl_digi_main->h(); HTh -= wfpack->h(); HTh -= hpack->h(); - HTh -= Hstatus; HTh -= progdefaults.macro_height; if (progStatus.NO_RIGLOG && !restore_minimize) { @@ -3882,7 +3986,7 @@ UI_return: int orgx = text_panel->orgx(); int orgy = text_panel->orgy(); int nux = text_panel->x() + progStatus.tile_x; - int nuy = text_panel->y() + progStatus.tile_y; + int nuy = text_panel->y() + progStatus.tile_y_ratio * text_group->h(); text_panel->position( orgx, orgy, nux, nuy); @@ -3900,6 +4004,11 @@ UI_return: } +void cb_docked(Fl_Widget*, void*) +{ + UI_select(); +} + void cb_mnu_wf_all(Fl_Menu_* w, void *d) { wf->UI_select(progStatus.WF_UI = w->mvalue()->value()); @@ -3983,6 +4092,14 @@ void cb_menu_make_default_scripts(Fl_Widget*, void*) cb_create_default_script(); } +void cb_view_hide_macros(Fl_Widget*, void*) +{ + progStatus.tile_y = progdefaults.rxtx_swap ? TransmitText->h() : ReceiveText->h(); + progStatus.tile_y_ratio = 1.0 * progStatus.tile_y / text_group->h(); + + progStatus.tbar_is_docked = progStatus.tbar_is_docked ? 0 : 1; + tgroup->hide_show(); +} static void cb_opmode_show(Fl_Widget* w, void*); @@ -4257,6 +4374,7 @@ _FL_MULTI_LABEL, 0, 14, 0}, { VIEW_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("View/Hide Channels")), 'v', (Fl_Callback*)cb_view_hide_channels, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, +{ icons::make_icon_label(_("View/Hide 48 macros")), 0, (Fl_Callback*)cb_view_hide_macros, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Floating scope"), utilities_system_monitor_icon), 'd', (Fl_Callback*)cb_mnuDigiscope, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(MFSK_IMAGE_MLABEL, image_icon), 'm', (Fl_Callback*)cb_mnuPicViewer, 0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, @@ -5290,6 +5408,38 @@ inline int next_to(Fl_Widget* w) return w->x() + w->w() + pad; } +static void add_docked(dockgroup *dock) +{ + // Create a docked toolgroup + int w = dock->w(); + int h = dock->h(); + int Wbtn = (w-18) / 12; + int Hbtn = (h-4) / 4; + int xpos = 16; + int ypos = 2; + + tgroup = new toolgrp(dock, 0, w, h); + + for (int i = 0; i < 48; i++) { + btnDockMacro[i] = new Fl_Button( + xpos, ypos, + ((i % 12) == 11) ? w - xpos - 4 : Wbtn, Hbtn, ""); + btnDockMacro[i]->box(FL_THIN_UP_BOX); + btnDockMacro[i]->tooltip(_("Left Click - execute\nRight Click - edit")); + btnDockMacro[i]->callback(macro_cb, reinterpret_cast(i)); + + xpos += Wbtn; + if (i == 11 || i == 23 || i == 35) { + xpos = 16; + ypos += Hbtn; + if (i == 35) Hbtn = tgroup->h() - ypos - 2; + } + } + + tgroup->end(); + tgroup->box(FL_FLAT_BOX);//ENGRAVED_BOX);//NO_BOX);//BORDER_BOX); +} + void create_fl_digi_main_primary() { // bx used as a temporary spacer Fl_Box *bx; @@ -5317,16 +5467,27 @@ void create_fl_digi_main_primary() { Wwfall = progStatus.mainW - 2 * DEFAULT_SW; - main_hmin = minhtext + Hwfall + Hmenu + Hstatus + Hmacros*3 + Hqsoframe + 3; + int fixed_height = + Hmenu + + TB_HEIGHT + + Hqsoframe + + Hmacros*3 + + Hwfall + + Hstatus + + 16; // inter group spacings + + main_hmin = minhtext + mintxtext + 5 + fixed_height; + if (progStatus.mainH < main_hmin) progStatus.mainH = main_hmin; - int Htext = progStatus.mainH - Hwfall - Hmenu - Hstatus - Hmacros*NUMKEYROWS - Hqsoframe - 3; + int Htext = main_hmin - fixed_height; + if (progStatus.tile_y > Htext) progStatus.tile_y = Htext / 2; - fl_digi_main = new Fl_Double_Window(progStatus.mainW, progStatus.mainH); + fl_digi_main = new dropwin(progStatus.mainW, main_hmin);//progStatus.mainH); mnuFrame = new Fl_Group(0,0,progStatus.mainW, Hmenu); - mnu = new Fl_Menu_Bar(0, 0, progStatus.mainW - 250 - pad, Hmenu); + mnu = new Fl_Menu_Bar(pad, 0, progStatus.mainW - 250 - 2*pad, Hmenu); // do some more work on the menu for (size_t i = 0; i < sizeof(menu_)/sizeof(menu_[0]); i++) { // FL_NORMAL_SIZE may have changed; update the menu items @@ -5367,6 +5528,26 @@ void create_fl_digi_main_primary() { mnuFrame->resizable(mnu); mnuFrame->end(); +// add draggable toolbar with 4 rows of 12 macros each + dock = new dockgroup(pad, mnu->h() + 2, fl_digi_main->w() - 2*pad, TB_HEIGHT); + dock->box(FL_THIN_DOWN_BOX); + dock->end(); + dock->set_window(fl_digi_main); + + // Create a toolgroup already docked in this dock + add_docked(dock); + dock->redraw(); + + // Record in the dropwin which dock to use + fl_digi_main->set_dock(dock); + + fl_digi_main->begin(); + +// docked window workspace + fl_digi_main->workspace = new Fl_Group( + pad, dock->y() + dock->h(), + dock->w(), fl_digi_main->h() - dock->h() - dock->y() - pad); + // reset the message dialog font fl_message_font(FL_HELVETICA, FL_NORMAL_SIZE); @@ -5375,7 +5556,9 @@ void create_fl_digi_main_primary() { Fl_Tooltip::size(FL_NORMAL_SIZE); Fl_Tooltip::enable(progdefaults.tooltips); - TopFrame1 = new Fl_Group(0, Hmenu, progStatus.mainW, Hqsoframe); + TopFrame1 = new Fl_Group( + 0, fl_digi_main->workspace->y(), + fl_digi_main->workspace->w(), Hqsoframe); int fnt1 = progdefaults.FreqControlFontnbr; int freqheight1 = 2 * Hentry + pad; @@ -5387,12 +5570,14 @@ void create_fl_digi_main_primary() { int rig_control_frame_width = freqwidth1 + 3 * pad; RigControlFrame = new Fl_Group( - 0, Hmenu, rig_control_frame_width, Hqsoframe); + 0, fl_digi_main->workspace->y(), + rig_control_frame_width, Hqsoframe); RigControlFrame->box(FL_FLAT_BOX); qsoFreqDisp1 = new cFreqControl( - pad, Hmenu + pad, freqwidth1, freqheight1, "10"); + pad, RigControlFrame->y() + pad, + freqwidth1, freqheight1, "10"); qsoFreqDisp1->box(FL_DOWN_BOX); qsoFreqDisp1->color(FL_BACKGROUND_COLOR); qsoFreqDisp1->selection_color(FL_BACKGROUND_COLOR); @@ -5444,8 +5629,8 @@ void create_fl_digi_main_primary() { qso_opMODE->end(); qso_opBW = new Fl_ComboBox( - qso_opMODE->x() + mode_cbo_w + pad, - smeter->y(), + qso_opMODE->x() + mode_cbo_w + pad, + smeter->y(), bw_cbo_w, Hentry); qso_opBW->box(FL_DOWN_BOX); qso_opBW->color(FL_BACKGROUND2_COLOR); @@ -5460,8 +5645,8 @@ void create_fl_digi_main_primary() { qso_opBW->end(); qso_opGROUP = new Fl_Group( - qso_opMODE->x() + mode_cbo_w + pad, - smeter->y(), + qso_opMODE->x() + mode_cbo_w + pad, + smeter->y(), bw_cbo_w, Hentry); qso_opGROUP->box(FL_FLAT_BOX); @@ -5533,53 +5718,53 @@ void create_fl_digi_main_primary() { int opB_w = wf1 - 2 * (Wbtn + pad) + pad; RigViewerFrame = new Fl_Group( - rightof(RigControlFrame) + pad, Hmenu, + rightof(RigControlFrame) + pad, RigControlFrame->y(), wf1, Hqsoframe); qso_btnSelFreq = new Fl_Button( - RigViewerFrame->x(), Hmenu + pad, + RigViewerFrame->x(), RigViewerFrame->y() + pad, Wbtn, Hentry); qso_btnSelFreq->image(new Fl_Pixmap(left_arrow_icon)); qso_btnSelFreq->tooltip(_("Select")); qso_btnSelFreq->callback((Fl_Callback*)cb_qso_btnSelFreq); qso_btnAddFreq = new Fl_Button( - rightof(qso_btnSelFreq) + pad, Hmenu + pad, + rightof(qso_btnSelFreq) + pad, RigViewerFrame->y() + pad, Wbtn, Hentry); qso_btnAddFreq->image(new Fl_Pixmap(plus_icon)); qso_btnAddFreq->tooltip(_("Add current frequency")); qso_btnAddFreq->callback((Fl_Callback*)cb_qso_btnAddFreq); qso_btnClearList = new Fl_Button( - RigViewerFrame->x(), Hmenu + Hentry + 2 * pad, + RigViewerFrame->x(), RigViewerFrame->y() + Hentry + 2 * pad, Wbtn, Hentry); qso_btnClearList->image(new Fl_Pixmap(trash_icon)); qso_btnClearList->tooltip(_("Clear list")); qso_btnClearList->callback((Fl_Callback*)cb_qso_btnClearList); qso_btnDelFreq = new Fl_Button( - rightof(qso_btnClearList) + pad, Hmenu + Hentry + 2 * pad, + rightof(qso_btnClearList) + pad, RigViewerFrame->y() + Hentry + 2 * pad, Wbtn, Hentry); qso_btnDelFreq->image(new Fl_Pixmap(minus_icon)); qso_btnDelFreq->tooltip(_("Delete from list")); qso_btnDelFreq->callback((Fl_Callback*)cb_qso_btnDelFreq); qso_btnAct = new Fl_Button( - RigViewerFrame->x(), Hmenu + 2*(Hentry + pad) + pad, + RigViewerFrame->x(), RigViewerFrame->y() + 2*(Hentry + pad) + pad, Wbtn, Hentry); qso_btnAct->image(new Fl_Pixmap(chat_icon)); qso_btnAct->callback(cb_qso_inpAct); qso_btnAct->tooltip("Show active frequencies"); qso_inpAct = new Fl_Input2( - rightof(qso_btnAct) + pad, Hmenu + 2*(Hentry + pad) + pad, + rightof(qso_btnAct) + pad, RigViewerFrame->y() + 2*(Hentry + pad) + pad, Wbtn, Hentry); qso_inpAct->when(FL_WHEN_ENTER_KEY | FL_WHEN_NOT_CHANGED); qso_inpAct->callback(cb_qso_inpAct); qso_inpAct->tooltip("Grid prefix for activity list"); qso_opBrowser = new Fl_Browser( - rightof(qso_btnDelFreq) + pad, Hmenu + pad, + rightof(qso_btnDelFreq) + pad, RigViewerFrame->y() + pad, opB_w, Hqsoframe - 2 * pad ); // use fixed column widths of 28%, 20%, 30% ... remainder is 4th column static int opB_widths[] = {28*opB_w/100, 20*opB_w/100, 30*opB_w/100, 0}; @@ -5603,13 +5788,13 @@ void create_fl_digi_main_primary() { RigViewerFrame->end(); RigViewerFrame->hide(); - int y2 = Hmenu + Hentry + 2 * pad; - int y3 = Hmenu + 2 * (Hentry + pad) + pad; + int y2 = fl_digi_main->workspace->y() + Hentry + 2 * pad; + int y3 = fl_digi_main->workspace->y() + 2 * (Hentry + pad) + pad; x_qsoframe = RigViewerFrame->x(); QsoInfoFrame = new Fl_Group( - x_qsoframe, Hmenu, + x_qsoframe, fl_digi_main->workspace->y(), progStatus.mainW - x_qsoframe - pad, Hqsoframe); btnQRZ = new Fl_Button( @@ -5632,40 +5817,41 @@ void create_fl_digi_main_primary() { QsoInfoFrame1 = new Fl_Group( rightof(btnQRZ) + pad, - Hmenu, wf1, Hqsoframe); + fl_digi_main->workspace->y(), wf1, Hqsoframe); inpFreq1 = new Fl_Input2( QsoInfoFrame1->x() + 25, - Hmenu + pad, 90, Hentry, _("Frq")); + fl_digi_main->workspace->y() + pad, 90, Hentry, _("Frq")); inpFreq1->type(FL_NORMAL_OUTPUT); inpFreq1->tooltip(_("frequency kHz")); inpFreq1->align(FL_ALIGN_LEFT); btnTimeOn = new Fl_Button( - next_to(inpFreq1), Hmenu + pad, Hentry, Hentry, _("On")); + next_to(inpFreq1), fl_digi_main->workspace->y() + pad, + Hentry, Hentry, _("On")); btnTimeOn->tooltip(_("Press to update QSO start time")); btnTimeOn->callback(cb_btnTimeOn); inpTimeOn1 = new Fl_Input2( - next_to(btnTimeOn), Hmenu + pad, + next_to(btnTimeOn), fl_digi_main->workspace->y() + pad, 40, Hentry, ""); inpTimeOn1->tooltip(_("QSO start time")); inpTimeOn1->align(FL_ALIGN_LEFT); inpTimeOn1->type(FL_INT_INPUT); inpTimeOff1 = new Fl_Input2( - next_to(inpTimeOn1) + 20, Hmenu + pad, 40, Hentry, _("Off")); + next_to(inpTimeOn1) + 20, fl_digi_main->workspace->y() + pad, 40, Hentry, _("Off")); inpTimeOff1->tooltip(_("QSO end time")); inpTimeOff1->align(FL_ALIGN_LEFT); inpTimeOff1->type(FL_NORMAL_OUTPUT); inpRstIn1 = new Fl_Input2( - next_to(inpTimeOff1) + 40, Hmenu + pad, 40, Hentry, _("In")); + next_to(inpTimeOff1) + 40, fl_digi_main->workspace->y() + pad, 40, Hentry, _("In")); inpRstIn1->tooltip("RST in"); inpRstIn1->align(FL_ALIGN_LEFT); inpRstOut1 = new Fl_Input2( - next_to(inpRstIn1) + 30, Hmenu + pad, 40, Hentry, _("Out")); + next_to(inpRstIn1) + 30, fl_digi_main->workspace->y() + pad, 40, Hentry, _("Out")); inpRstOut1->tooltip("RST out"); inpRstOut1->align(FL_ALIGN_LEFT); @@ -5740,11 +5926,11 @@ void create_fl_digi_main_primary() { QsoInfoFrame1->end(); QsoInfoFrame2 = new Fl_Group( - rightof(QsoInfoFrame1) + pad, Hmenu, + rightof(QsoInfoFrame1) + pad, fl_digi_main->workspace->y(), progStatus.mainW - rightof(QsoInfoFrame1) - 2*pad, Hqsoframe); inpCountry = new Fl_Input2( - rightof(QsoInfoFrame1) + pad, Hmenu + pad, + rightof(QsoInfoFrame1) + pad, fl_digi_main->workspace->y() + pad, QsoInfoFrame2->w(), Hentry, ""); inpCountry->tooltip(_("Country")); @@ -5759,7 +5945,7 @@ void create_fl_digi_main_primary() { QsoInfoFrame->resizable(QsoInfoFrame2); ifkp_avatar = new picture( - QsoInfoFrame2->x() + QsoInfoFrame2->w() - 59, Hmenu + pad, 59, 74); + QsoInfoFrame2->x() + QsoInfoFrame2->w() - 59, fl_digi_main->workspace->y() + pad, 59, 74); ifkp_avatar->box(FL_FLAT_BOX); ifkp_avatar->noslant(); ifkp_avatar->callback(cb_ifkp_send_avatar); @@ -5768,7 +5954,7 @@ void create_fl_digi_main_primary() { ifkp_avatar->hide(); thor_avatar = new picture( - QsoInfoFrame2->x() + QsoInfoFrame2->w() - 59, Hmenu + pad, 59, 74); + QsoInfoFrame2->x() + QsoInfoFrame2->w() - 59, fl_digi_main->workspace->y() + pad, 59, 74); thor_avatar->box(FL_FLAT_BOX); thor_avatar->noslant(); thor_avatar->callback(cb_thor_send_avatar); @@ -5782,9 +5968,9 @@ void create_fl_digi_main_primary() { TopFrame1->end(); - TopFrame2 = new Fl_Group(0, Hmenu, progStatus.mainW, Hentry + 2 * pad); + TopFrame2 = new Fl_Group(0, fl_digi_main->workspace->y(), progStatus.mainW, Hentry + 2 * pad); { - int y = Hmenu + pad; + int y = fl_digi_main->workspace->y() + pad; int h = Hentry; qsoFreqDisp2 = new cFreqControl( pad, y, @@ -5894,9 +6080,9 @@ void create_fl_digi_main_primary() { TopFrame2->end(); TopFrame2->hide(); - TopFrame3 = new Fl_Group(0, Hmenu, progStatus.mainW, Hentry + 2 * pad); + TopFrame3 = new Fl_Group(0, fl_digi_main->workspace->y(), progStatus.mainW, Hentry + 2 * pad); { - int y = Hmenu + pad; + int y = fl_digi_main->workspace->y() + pad; int h = Hentry; qsoFreqDisp3 = new cFreqControl( pad, y, @@ -6035,9 +6221,9 @@ void create_fl_digi_main_primary() { qsoFreqDisp2->set_lsd(progdefaults.sel_lsd); qsoFreqDisp3->set_lsd(progdefaults.sel_lsd); - Y = Hmenu + Hqsoframe + pad; + Y = fl_digi_main->workspace->y() + Hqsoframe + pad; -int alt_btn_width = 2 * DEFAULT_SW; + int alt_btn_width = 2 * DEFAULT_SW; macroFrame2 = new Fl_Group(0, Y, progStatus.mainW, Hmacros); macroFrame2->box(FL_FLAT_BOX); mf_group2 = new Fl_Group(0, Y, progStatus.mainW - alt_btn_width, Hmacros); @@ -6070,12 +6256,12 @@ int alt_btn_width = 2 * DEFAULT_SW; Y += Hmacros; - int Hrcvtxt = Htext / 2; - int Hxmttxt = Htext - Hrcvtxt; - center_group = new Fl_Group(0, Y, progStatus.mainW, Htext); center_group->box(FL_FLAT_BOX); + text_group = new Fl_Group(0, Y, center_group->w(), center_group->h()); + text_group->box(FL_FLAT_BOX); + text_panel = new Panel(0, Y, progStatus.mainW, Htext); text_panel->box(FL_FLAT_BOX); @@ -6147,7 +6333,9 @@ int alt_btn_width = 2 * DEFAULT_SW; mvgroup->end(); save_mvx = mvgroup->w(); - int rh = text_panel->h() / 2 + 0.5; + int rh = progStatus.tile_y_ratio * text_panel->h(); + if (progdefaults.rxtx_swap) rh = text_panel->h() - rh; + ReceiveText = new FTextRX( text_panel->x() + mvgroup->w(), text_panel->y(), text_panel->w() - mvgroup->w(), rh, "" ); @@ -6190,15 +6378,17 @@ int alt_btn_width = 2 * DEFAULT_SW; TransmitText->align(FL_ALIGN_CLIP); minbox = new Fl_Box( - text_panel->x(), text_panel->y() + 66, // fixed by Raster min height - text_panel->w() - 100, text_panel->h() - 2 * 66); // fixed by HMIN & Hwfall max + text_panel->x(), + text_panel->y() + rh, // fixed by Raster min height + text_panel->w() - 100, + text_panel->h() - rh - mintxtext ); // fixed by HMIN & Hwfall max minbox->hide(); text_panel->resizable(minbox); text_panel->end(); - center_group->resizable(text_panel); - center_group->end(); + text_group->end(); + text_group->resizable(text_panel); wefax_group = new Fl_Group(0, Y, progStatus.mainW, Htext); wefax_group->box(FL_FLAT_BOX); @@ -6209,7 +6399,7 @@ int alt_btn_width = 2 * DEFAULT_SW; fsq_group->box(FL_FLAT_BOX); // left, resizable rx/tx widgets fsq_left = new Panel( - 0, Y, + 0, Y, progStatus.mainW - 180, Htext); fsq_left->box(FL_FLAT_BOX); @@ -6235,7 +6425,7 @@ int alt_btn_width = 2 * DEFAULT_SW; fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); fsq_tx_text = new FTextTX( - 0, Y + fsq_rx_text->h(), + 0, Y + fsq_rx_text->h(), fsq_left->w(), fsq_left->h() - fsq_rx_text->h()); fsq_tx_text->color( fl_rgb_color( @@ -6265,9 +6455,9 @@ int alt_btn_width = 2 * DEFAULT_SW; fsq_left->w(), Y, 180, fsq_left->h()); fsq_right->box(FL_FLAT_BOX); - static int heard_widths[] = - { 40*fsq_right->w()/100, - 30*fsq_right->w()/100, + static int heard_widths[] = + { 40*fsq_right->w()/100, + 30*fsq_right->w()/100, 0 }; fsq_heard = new Fl_Browser( fsq_right->x(), fsq_right->y(), @@ -6392,7 +6582,7 @@ int alt_btn_width = 2 * DEFAULT_SW; ifkp_group->box(FL_FLAT_BOX); // upper, receive ifkp widgets ifkp_left = new Panel( - 0, Y, + 0, Y, progStatus.mainW - (image_s2n.w()+4), Htext); // add rx & tx ifkp_rx_text = new FTextRX( @@ -6413,7 +6603,7 @@ int alt_btn_width = 2 * DEFAULT_SW; ifkp_rx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ifkp_tx_text = new FTextTX( - 0, Y + ifkp_rx_text->h(), + 0, Y + ifkp_rx_text->h(), ifkp_rx_text->w(), ifkp_group->h() - ifkp_rx_text->h()); ifkp_tx_text->color( fl_rgb_color( @@ -6439,13 +6629,13 @@ int alt_btn_width = 2 * DEFAULT_SW; ifkp_left->end(); ifkp_right = new Fl_Group( - ifkp_left->w(), Y, + ifkp_left->w(), Y, image_s2n.w()+4, ifkp_group->h()); ifkp_right->box(FL_FLAT_BOX); - static int ifkp_heard_widths[] = - { 40*ifkp_right->w()/100, - 30*ifkp_right->w()/100, + static int ifkp_heard_widths[] = + { 40*ifkp_right->w()/100, + 30*ifkp_right->w()/100, 0 }; ifkp_heard = new Fl_Browser( ifkp_right->x(), ifkp_right->y(), @@ -6502,13 +6692,14 @@ int alt_btn_width = 2 * DEFAULT_SW; ifkp_group->resizable(ifkp_left); ifkp_group->end(); + center_group->end(); - center_group->show(); + text_group->show(); wefax_group->hide(); fsq_group->hide(); ifkp_group->hide(); - Y += Htext; + Y += center_group->h();//Htext; Fl::add_handler(default_handler); @@ -6574,7 +6765,7 @@ int alt_btn_width = 2 * DEFAULT_SW; hpack = new Fl_Pack(0, Y, progStatus.mainW, Hstatus); hpack->type(1); - MODEstatus = new Fl_Button(0,Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Wmode+30, Hstatus, ""); + MODEstatus = new Fl_Button(0,fl_digi_main->workspace->y()+Htext+Hwfall, Wmode+30, Hstatus, ""); MODEstatus->box(FL_DOWN_BOX); MODEstatus->color(FL_BACKGROUND2_COLOR); MODEstatus->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); @@ -6621,7 +6812,7 @@ int alt_btn_width = 2 * DEFAULT_SW; // see corner_box below // corner_box used to leave room for OS X corner drag handle -#ifdef __APPLE__ +#ifdef __APPLE__ StatusBar = new Fl_Box( rightof(Status2), Y, fl_digi_main->w() @@ -6738,8 +6929,15 @@ int alt_btn_width = 2 * DEFAULT_SW; inpNotes->when(FL_WHEN_RELEASE); + fl_digi_main->workspace->end(); + fl_digi_main->workspace->resizable(center_group); +// end of dockable workspace + fl_digi_main->end(); - fl_digi_main->resizable(center_group); + fl_digi_main->resizable(fl_digi_main->workspace); + + dock->callback(cb_docked); + fl_digi_main->callback(cb_wMain); scopeview = new Fl_Double_Window(0,0,140,140, _("Scope")); @@ -6780,7 +6978,13 @@ int alt_btn_width = 2 * DEFAULT_SW; toggle_smeter(); - UI_select(); + if (progStatus.tbar_is_docked) // do not change interface state + UI_select(); + else { + progStatus.tbar_is_docked = true; // for tbar toggle + cb_view_hide_macros((Fl_Widget *)0, (void *)0); + } + wf->UI_select(progStatus.WF_UI); clearQSO(); @@ -6805,6 +7009,9 @@ int alt_btn_width = 2 * DEFAULT_SW; case 7: btn_scheme_7->setonly(); break; case 8: btn_scheme_8->setonly(); break; case 9: btn_scheme_9->setonly(); break; + case 10: btn_scheme_10->setonly(); break; + case 11: btn_scheme_11->setonly(); break; + case 12: btn_scheme_12->setonly(); break; } colorize_macros(); @@ -7005,6 +7212,9 @@ void noop_controls() // create and then hide all controls not being used for (int i = 0; i < NUMMACKEYS * NUMKEYROWS; i++) { btnMacro[i] = new Fl_Button(defwidget); btnMacro[i]->hide(); } + for (int i = 0; i < 48; i++) { + btnDockMacro[i] = new Fl_Button(defwidget); btnMacro[i]->hide(); + } inpQth = new Fl_Input2(defwidget); inpQth->hide(); inpLoc = new Fl_Input2(defwidget); inpLoc->hide(); @@ -7130,13 +7340,14 @@ void create_fl_digi_main_WF_only() { IMAGE_WIDTH = 4000;//progdefaults.HighFreqCutoff; Hwfall = progdefaults.wfheight; Wwfall = progStatus.mainW - 2 * DEFAULT_SW - 2 * pad; - WF_only_height = Hmenu + Hwfall + Hstatus + 4 * pad; + WF_only_height = fl_digi_main->workspace->y() + Hwfall + Hstatus + 4 * pad; - fl_digi_main = new Fl_Double_Window(progStatus.mainW, WF_only_height); +// fl_digi_main = new Fl_Double_Window(progStatus.mainW, WF_only_height); + fl_digi_main = new dropwin(progStatus.mainW, WF_only_height); - mnuFrame = new Fl_Group(0,0,progStatus.mainW, Hmenu); + mnuFrame = new Fl_Group(0,0,progStatus.mainW, fl_digi_main->workspace->y()); - mnu = new Fl_Menu_Bar(0, 0, progStatus.mainW - 200 - pad, Hmenu); + mnu = new Fl_Menu_Bar(0, 0, progStatus.mainW - 200 - pad, fl_digi_main->workspace->y()); // do some more work on the menu for (size_t i = 0; i < sizeof(alt_menu_)/sizeof(alt_menu_[0]); i++) { // FL_NORMAL_SIZE may have changed; update the menu items @@ -7149,29 +7360,29 @@ void create_fl_digi_main_WF_only() { } mnu->menu(alt_menu_); - btnAutoSpot = new Fl_Light_Button(progStatus.mainW - 200 - pad, 0, 50, Hmenu, "Spot"); + btnAutoSpot = new Fl_Light_Button(progStatus.mainW - 200 - pad, 0, 50, fl_digi_main->workspace->y(), "Spot"); btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->callback(cbAutoSpot, 0); btnAutoSpot->deactivate(); - btnRSID = new Fl_Light_Button(progStatus.mainW - 150 - pad, 0, 50, Hmenu, "RxID"); + btnRSID = new Fl_Light_Button(progStatus.mainW - 150 - pad, 0, 50, fl_digi_main->workspace->y(), "RxID"); btnRSID->selection_color(progdefaults.RxIDColor); btnRSID->tooltip("Receive RSID"); btnRSID->callback(cbRSID, 0); - btnTxRSID = new Fl_Light_Button(progStatus.mainW - 100 - pad, 0, 50, Hmenu, "TxID"); + btnTxRSID = new Fl_Light_Button(progStatus.mainW - 100 - pad, 0, 50, fl_digi_main->workspace->y(), "TxID"); btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->tooltip("Transmit RSID"); btnTxRSID->callback(cbTxRSID, 0); - btnTune = new Fl_Light_Button(progStatus.mainW - 50 - pad, 0, 50, Hmenu, "TUNE"); + btnTune = new Fl_Light_Button(progStatus.mainW - 50 - pad, 0, 50, fl_digi_main->workspace->y(), "TUNE"); btnTune->selection_color(progdefaults.TuneColor); btnTune->callback(cbTune, 0); mnuFrame->resizable(mnu); mnuFrame->end(); - Y = Hmenu + pad; + Y = fl_digi_main->workspace->y() + pad; Fl_Pack *wfpack = new Fl_Pack(0, Y, progStatus.mainW, Hwfall); wfpack->type(1); @@ -7377,7 +7588,7 @@ void create_fl_digi_main(int argc, char** argv) if (bWF_only) fl_digi_main->size_range(WMIN, WF_only_height, 0, WF_only_height); else - fl_digi_main->size_range(WMIN, main_hmin, 0, 0);//HMIN, 0, 0); + fl_digi_main->size_range(WMIN, main_hmin, 0, 0); set_colors(); } @@ -9218,6 +9429,6 @@ void cbFSQCALL(Fl_Widget *w, void *d) btn->label("FSQ-ON"); btn->redraw_label(); } - } + } restoreFocus(); } diff --git a/src/feld/feld.cxx b/src/feld/feld.cxx index edafb5f5..02745476 100644 --- a/src/feld/feld.cxx +++ b/src/feld/feld.cxx @@ -55,6 +55,9 @@ LOG_FILE_SOURCE(debug::LOG_MODEM); char feldmsg[80]; +int feld::RxColumnLen = FELD_RX_COLUMN_LEN; +int feld::TxColumnLen = 14; + void feld::tx_init(SoundBase *sc) { scard = sc; diff --git a/src/include/dock_events.h b/src/include/dock_events.h new file mode 100644 index 00000000..32943258 --- /dev/null +++ b/src/include/dock_events.h @@ -0,0 +1,9 @@ +#ifndef _HAVE_DOCK_EVENTS_HDR_ +#define _HAVE_DOCK_EVENTS_HDR_ + +# define FX_DROP_EVENT (FL_DND_RELEASE + 100) + +# define DROP_REGION_HEIGHT 60 + +#endif + diff --git a/src/include/dock_gp.h b/src/include/dock_gp.h new file mode 100644 index 00000000..f04c82c4 --- /dev/null +++ b/src/include/dock_gp.h @@ -0,0 +1,31 @@ +#ifndef _HAVE_DOCK_GRP_HDR_ +#define _HAVE_DOCK_GRP_HDR_ + +#include +#include + +class dockgroup : public Fl_Group +{ +protected: + Fl_Window *win; + Fl_Pack *pack; + int children; + int vis_h; + +public: + // Normal FLTK constructors + dockgroup(int x, int y, int w, int h, const char *l = 0); + + // point back to our parent + void set_window(Fl_Window *w) {win = w;} + + // methods for adding or removing toolgroups from the dock + void add(Fl_Widget *w); + void remove(Fl_Widget *w); + + // dock diagnostic + char *dock_check(void); +}; + +#endif // _HAVE_DOCK_GRP_HDR_ + diff --git a/src/include/drag_btn.h b/src/include/drag_btn.h new file mode 100644 index 00000000..61c5cc46 --- /dev/null +++ b/src/include/drag_btn.h @@ -0,0 +1,27 @@ +#ifndef _HAVE_DRAG_BTN_HDR_ +#define _HAVE_DRAG_BTN_HDR_ + +#include + +class drag_btn : public Fl_Box +{ +private: + int x1, y1; // click posn., used for dragging and docking checks + int xoff, yoff; // origin used for dragging calcs + int was_docked; // used in handle to note that we have just undocked + +protected: + // override box draw method to do our textured dragger look + void draw(); + // override handle method to catch drag/dock operations + int handle(int event); + +public: + // basic constructor + drag_btn(int x, int y, int w, int h, const char *l = 0); +}; + +#endif // _HAVE_DRAG_BTN_HDR_ + +/* End of File */ + diff --git a/src/include/dropwin.h b/src/include/dropwin.h new file mode 100644 index 00000000..abab7081 --- /dev/null +++ b/src/include/dropwin.h @@ -0,0 +1,39 @@ +#ifndef _HAVE_DROP_WIN_HDR_ +#define _HAVE_DROP_WIN_HDR_ + +#include +#include + +#include "dock_gp.h" + +class dropwin : public Fl_Double_Window +{ +protected: + void init_dropwin(void); + dockgroup *dock; + int Wdrop; + int Hdrop; + +public: + // Normal FLTK constructors + dropwin(int x, int y, int w, int h, const char *l = 0); + dropwin(int w, int h, const char *l = 0); + + // The working area of this window + Fl_Group *workspace; + + // override handle method to capture "drop" events + int handle(int); + + // assign a dock widget to this window + void set_dock(dockgroup *d) {dock = d;} + + // Resize the workspace area if the dock closes/opens + void dock_resize(int h); + + void set_drop(int w, int h) { Wdrop = w; Hdrop = h; } + +}; + +#endif // _HAVE_DROP_WIN_HDR_ + diff --git a/src/include/feld.h b/src/include/feld.h index 4c077fbf..6143f271 100644 --- a/src/include/feld.h +++ b/src/include/feld.h @@ -37,15 +37,15 @@ #define FeldSampleRate 8000 #define FeldMaxSymLen 1024 -#define RxColumnLen 30 -#define TxColumnLen 14 - -#define PIXMAP_W 14 -#define PIXMAP_H (TxColumnLen) #define MAXLEN 512 +#define FELD_RX_COLUMN_LEN 20 + class feld : public modem { enum FELD_STATE {PREAMBLE, POSTAMBLE, DATA}; +public: +static int RxColumnLen; +static int TxColumnLen; protected: //rx double rxphacc; @@ -55,7 +55,7 @@ protected: double peakval; double peakhold; double minhold; - + double rxpixrate; double txpixrate; double downsampleinc; @@ -89,7 +89,7 @@ protected: double OnShape[MAXLEN]; double OffShape[MAXLEN]; - mbuffer col_data; + mbuffer col_data; int col_pointer; int fntnbr; diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index 92d590ea..642b7ab8 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -46,10 +46,13 @@ #include "smeter.h" #include "pwrmeter.h" #include "picture.h" +#include "dropwin.h" extern fre_t seek_re; -extern Fl_Double_Window *fl_digi_main; +//extern Fl_Double_Window *fl_digi_main; +extern dropwin *fl_digi_main; + extern Fl_Double_Window *scopeview; //extern Fl_Double_Window *opBrowserView; diff --git a/src/include/raster.h b/src/include/raster.h index 7098fc4c..c7becf5f 100644 --- a/src/include/raster.h +++ b/src/include/raster.h @@ -24,6 +24,7 @@ #define _RASTER_H #include +#include "feld.h" class Raster : public Fl_Widget { public: diff --git a/src/include/status.h b/src/include/status.h index 14ca7496..f6308bd3 100644 --- a/src/include/status.h +++ b/src/include/status.h @@ -37,6 +37,7 @@ struct status { bool Rig_Log_UI; bool Rig_Contest_UI; bool DOCKEDSCOPE; + bool tbar_is_docked; int RxTextHeight; int tiled_group_x; @@ -71,6 +72,7 @@ struct status { int tile_w; int tile_y; int tile_h; + double tile_y_ratio; double fsq_ratio; double ifkp_ratio; bool LOGenabled; diff --git a/src/include/toolgrp.h b/src/include/toolgrp.h new file mode 100644 index 00000000..580d6de9 --- /dev/null +++ b/src/include/toolgrp.h @@ -0,0 +1,72 @@ +#ifndef _HAVE_TOOL_GROUP_HDR_ +#define _HAVE_TOOL_GROUP_HDR_ + +#include +#include + +#include "dock_gp.h" +#include "drag_btn.h" + +class toolgrp : public Fl_Group +{ +private: + // control variables + short _docked; + dockgroup *dock; + + // constructor helper function + void create_dockable_group(void); + void create_docked(dockgroup *d); + void create_floating(dockgroup *d, int state, int x, int y, int w, int h, const char *l); + +protected: + // Widgets used by the toolbar +// Fl_Button *dismiss; + drag_btn *dragger; + Fl_Group *inner_group; + + // Sets whether window is docked or not. + void docked(short r); + + // Defines which dock the group can dock into + void set_dock(dockgroup *w) {dock = w;} + // get the dock group ID + dockgroup *get_dock(void) {return dock;} + + // generic callback function for the dismiss button +// static void cb_dismiss(Fl_Button*, void* v); + +public: + // Constructors for docked/floating window + toolgrp(dockgroup *d, int f, int w, int h, const char *l = 0); + toolgrp(dockgroup *d, int f, int x, int y, int w, int h, const char *l = 0); + + // methods for hiding/showing *all* the floating windows + static void show_all(void); + static void hide_all(void); + + // Tests whether window is docked, undocked or hidden + short docked() { return _docked; } + + // generic callback function for the dock/undock checkbox + void dock_grp(void* v); + void undock_grp(void* v); + void hide_show(); + + // wrap some basic Fl_Group functions to access the enclosed inner_group + inline void begin() {inner_group->begin(); } + inline void end() {inner_group->end(); Fl_Group::end(); } + inline void resizable(Fl_Widget *box) {inner_group->resizable(box); } + inline void resizable(Fl_Widget &box) {inner_group->resizable(box); } + inline Fl_Widget *resizable() const { return inner_group->resizable(); } + inline void add( Fl_Widget &w ) { inner_group->add( w ); } + inline void add( Fl_Widget *w ) { inner_group->add( w ); } + inline void insert( Fl_Widget &w, int n ) { inner_group->insert( w, n ); } + inline void insert( Fl_Widget &w, Fl_Widget* beforethis ) { inner_group->insert( w, beforethis ); } + inline void remove( Fl_Widget &w ) { inner_group->remove( w ); } + inline void remove( Fl_Widget *w ) { inner_group->remove( w ); } +// inline void add_resizable( Fl_Widget &box ) { inner_group->add_resizable( box ); } +}; + +#endif // _HAVE_TOOL_GROUP_HDR_ + diff --git a/src/include/toolwin.h b/src/include/toolwin.h new file mode 100644 index 00000000..f679524c --- /dev/null +++ b/src/include/toolwin.h @@ -0,0 +1,37 @@ +#ifndef _HAVE_TOOLWIN_HDR_ +#define _HAVE_TOOLWIN_HDR_ + +/* fltk includes */ +#include +#include + +class toolwin : public Fl_Double_Window +{ +#define TW_MAX_FLOATERS 16 + +protected: + void create_dockable_window(void); + short idx; + static toolwin* active_list[TW_MAX_FLOATERS]; + static short active; + void *tool_group; + +public: + // Normal FLTK constructors + toolwin(int w, int h, const char *l = 0); + toolwin(int x, int y, int w, int h, const char *l = 0); + + // destructor + ~toolwin(); + + // methods for hiding/showing *all* the floating windows + static void show_all(void); + static void hide_all(void); + + // set the inner group + void set_inner(void *v) {tool_group = v;} +}; + +#endif // _HAVE_TOOLWIN_HDR_ + +// End of file // diff --git a/src/misc/status.cxx b/src/misc/status.cxx index 25b7d202..a224ff9c 100644 --- a/src/misc/status.cxx +++ b/src/misc/status.cxx @@ -78,6 +78,7 @@ status progStatus = { false, // bool Rig_Log_UI; false, // bool Rig_Contest_UI; false, // bool DOCKEDSCOPE; + false, // bool tbar_is_docked; 50, // int RxTextHeight; WMIN/2, // int tiled_group_x; false, // bool show_channels; @@ -110,6 +111,7 @@ status progStatus = { 200, // int tile_w; 90, // int tile_y; 150, // int tile_h; + 0.5, // double tile_y_ratio; 0.5, // double fsq_ratio; 0.5, // double ifkp_ratio; false, // bool LOGenabled @@ -251,6 +253,7 @@ void status::saveLastState() tile_w = text_panel->w(); tile_y = progdefaults.rxtx_swap ? TransmitText->h() : ReceiveText->h(); tile_h = text_panel->h(); + tile_y_ratio = 1.0 * tile_y / text_group->h(); if (text_panel->w() != ReceiveText->w()) tile_x = mvgroup->w(); fsq_ratio = 1.0 * fsq_rx_text->h() / fsq_group->h(); @@ -363,6 +366,7 @@ if (!bWF_only) { spref.set("rigcontest_ui", Rig_Contest_UI); spref.set("noriglog", NO_RIGLOG); spref.set("docked_scope", DOCKEDSCOPE); + spref.set("tbar_is_docked", tbar_is_docked); spref.set("rigctl_x", rigX); spref.set("rigctl_y", rigY); @@ -387,6 +391,7 @@ if (!bWF_only) { spref.set("tile_y", tile_y); spref.set("tile_w", tile_w); spref.set("tile_h", tile_h); + spref.set("tile_y_ratio", tile_y_ratio); spref.set("fsq_ratio", fsq_ratio); spref.set("ifkp_ratio", ifkp_ratio); @@ -565,6 +570,7 @@ void status::loadLastState() spref.get("rigcontest_ui", i, Rig_Contest_UI); Rig_Contest_UI = i; spref.get("noriglog", i, NO_RIGLOG); NO_RIGLOG = i; spref.get("docked_scope", i, DOCKEDSCOPE); DOCKEDSCOPE = i; + spref.get("tbar_is_docked", i, tbar_is_docked); tbar_is_docked = i; spref.get("rigctl_x", rigX, rigX); spref.get("rigctl_y", rigY, rigY); @@ -589,6 +595,7 @@ void status::loadLastState() spref.get("tile_y", tile_y, tile_y); spref.get("tile_w", tile_w, tile_w); spref.get("tile_h", tile_h, tile_h); + spref.get("tile_y_ratio", tile_y_ratio, tile_y_ratio); spref.get("fsq_ratio", fsq_ratio, fsq_ratio); spref.get("ifkp_ratio", ifkp_ratio, ifkp_ratio); diff --git a/src/waterfall/raster.cxx b/src/waterfall/raster.cxx index 383bdd90..1badf2e9 100644 --- a/src/waterfall/raster.cxx +++ b/src/waterfall/raster.cxx @@ -40,7 +40,7 @@ Raster::Raster (int X, int Y, int W, int H) : width = W - 4; height = H - 4; space = 2; - rowheight = 60; + rowheight = 2 * FELD_RX_COLUMN_LEN;//40;//60; Nrows = (int)(height / (rowheight + space) - 0.5); vidbuf = new unsigned char[width * height]; memset(vidbuf, 255, width * height); diff --git a/src/widgets/dock_gp.cxx b/src/widgets/dock_gp.cxx new file mode 100644 index 00000000..fe161e95 --- /dev/null +++ b/src/widgets/dock_gp.cxx @@ -0,0 +1,59 @@ +#include + +#include + +#include "dock_gp.h" +#include "dropwin.h" + +// basic fltk constructors +dockgroup::dockgroup(int x, int y, int w, int h, const char *l) + : Fl_Group(x, y, w, h, l) +{ + pack = new Fl_Pack(x, y, w, h); + pack->type(Fl_Pack::HORIZONTAL); + children = 0; + resizable(pack); + vis_h = h; +} + +void dockgroup::add(Fl_Widget *grp) +{ + int wd = w(); + int ht = h(); + + // if the dock is "closed", open it back up + if (ht < vis_h) + { + dropwin *dw = (dropwin *)win; + size(wd, vis_h); + pack->size(wd, vis_h); + dw->dock_resize(ht - vis_h); + } + pack->add(grp); + pack->resizable(grp); + children++; + if (callback() != NULL) do_callback(); +} + +void dockgroup::remove(Fl_Widget *grp) +{ + int wd = w(); + pack->remove(grp); + children--; + pack->resizable(pack->child(pack->children() - 1)); + // If the dock is empty, close it down + if (children <= 0) { + dropwin *dw = (dropwin *)win; + children = 0; + size(wd, 2); + dw->dock_resize(vis_h - 2); + } + if (callback() != NULL) do_callback(); +} + +char *dockgroup::dock_check(void) +{ + static char szcheck[50]; + snprintf(szcheck, sizeof(szcheck), "DG: %d - %dx%d", children, pack->w(), pack->h()); + return szcheck; +} diff --git a/src/widgets/drag_btn.cxx b/src/widgets/drag_btn.cxx new file mode 100644 index 00000000..0a488d19 --- /dev/null +++ b/src/widgets/drag_btn.cxx @@ -0,0 +1,144 @@ +#include + +#include +#include +#include + +#include "drag_btn.h" +#include "dock_events.h" +#include "toolgrp.h" + +static const char * grip_tile_xpm[] = { +"6 6 4 1", +" c None", +". c #FCFEFC", +"+ c #D4D6D4", +"@ c #9C9294", +".+++++", +"+@+.++", +"++++@+", +".+++++", +"+@+.++", +"++++@+"}; + +drag_btn::drag_btn(int x, int y, int w, int h, const char *l) + : Fl_Box(x, y, w, h, l) +{ + was_docked = 0; // Assume we have NOT just undocked... +} + +void drag_btn::draw() +{ + int xo = x(); + int yo = y(); + + // Draw the button box + draw_box(box(), color()); + + // set the clip region so we only "tile" the box + fl_push_clip(xo+1, yo+1, w()-3, h()-3); + + // tile the pixmap onto the button face... there must be a better way + for(int i = 2; i <= w(); i += 6) + for(int j = 2; j <= h(); j += 6) + fl_draw_pixmap(grip_tile_xpm, (xo + i), (yo + j)); + + fl_pop_clip(); +} // draw + +int drag_btn::handle(int event) +{ + toolgrp *tg = (toolgrp *)parent(); + int docked = tg->docked(); + int ret = 0; + int x2 = 0, y2 = 0; + int cx, cy; + + // If we are not docked, deal with dragging the toolwin around + if (!docked) { + // get the enclosing parent widget + Fl_Widget *tw = (Fl_Widget *)(tg->parent()); + if(!tw) return 0; + + switch (event) { + case FL_PUSH: // downclick in button creates cursor offsets + x1 = Fl::event_x_root(); + y1 = Fl::event_y_root(); + xoff = tw->x() - x1; + yoff = tw->y() - y1; + ret = 1; + break; + case FL_DRAG: // drag the button (and its parent window) around the screen + if (was_docked) { + // Need to init offsets, we probably got here following a drag + // from the dock, so the PUSH (above) will not have happened. + was_docked = 0; + x1 = Fl::event_x_root(); + y1 = Fl::event_y_root(); + xoff = tw->x() - x1; + yoff = tw->y() - y1; + } + tw->position(xoff + Fl::event_x_root(), yoff + Fl::event_y_root()); + tw->redraw(); + ret = 1; + break; + + case FL_RELEASE: + cx = Fl::event_x_root(); // Where did the release occur... + cy = Fl::event_y_root(); + x2 = x1 - cx; + y2 = y1 - cy; + x2 = (x2 > 0) ? x2 : (-x2); + y2 = (y2 > 0) ? y2 : (-y2); + // See if anyone is able to accept a dock with this widget + // How to find the dock window? Search 'em all for now... + for(Fl_Window *win = Fl::first_window(); win; win = Fl::next_window(win)) { + // Get the co-ordinates of each window + int ex = win->x_root(); + int ey = win->y_root(); + // Are we inside the boundary of the window? + if (win->visible() && + abs(cx - ex) < DROP_REGION_HEIGHT && + abs(cy - ey) < DROP_REGION_HEIGHT) { + // Send the found window a message that we want to dock with it. + if(Fl::handle(FX_DROP_EVENT, win)) { + tg->dock_grp(tg); + break; + } + } + } + //show(); + ret = 1; + break; + default: + break; + } + return(ret); + } + + // OK, so we must be docked - are we being dragged out of the dock? + switch(event) { + case FL_PUSH: // downclick in button creates cursor offsets + x1 = Fl::event_x_root(); + y1 = Fl::event_y_root(); + ret = 1; + break; + case FL_DRAG: + // IF the drag has moved further than the drag_min distance + // THEN invoke an un-docking + x2 = Fl::event_x_root() - x1; + y2 = Fl::event_y_root() - y1; + x2 = (x2 > 0) ? x2 : (-x2); + y2 = (y2 > 0) ? y2 : (-y2); + if ((x2 > 10) || (y2 > 10)) { + tg->undock_grp((void *)tg); // undock the window + was_docked = -1; // note that we *just now* undocked + } + ret = 1; + break; + default: + break; + } + return ret; +} // handle + diff --git a/src/widgets/dropwin.cxx b/src/widgets/dropwin.cxx new file mode 100644 index 00000000..17599e81 --- /dev/null +++ b/src/widgets/dropwin.cxx @@ -0,0 +1,67 @@ +#include +#include + +#include "dropwin.h" +#include "dock_events.h" + +// basic fltk constructors +dropwin::dropwin(int x, int y, int w, int h, const char *l) + : Fl_Double_Window(x, y, w, h, l) +{ + init_dropwin(); +} + +dropwin::dropwin(int w, int h, const char *l) + : Fl_Double_Window(w, h, l) +{ + init_dropwin(); +} + +void dropwin::init_dropwin(void) +{ + dock = (dockgroup *)0; + workspace = (Fl_Group *)0; + Wdrop = DROP_REGION_HEIGHT; + Hdrop = DROP_REGION_HEIGHT; +} + +void dropwin::dock_resize(int delta_h) +{ + int xo = workspace->x(); + int yo = workspace->y(); + int wo = workspace->w(); + int ho = workspace->h(); + + yo = yo - delta_h; + ho = ho + delta_h; + workspace->resize(xo, yo, wo, ho); + workspace->redraw(); + redraw(); +} + + +int dropwin::handle(int evt) +{ + int res = Fl_Double_Window::handle(evt); + + // Is this a dock_drop event? + if((evt == FX_DROP_EVENT) && (dock)) { + // Did the drop happen on us? + // Get our co-ordinates + int ex = x_root() + dock->x(); + int ey = y_root() + dock->y(); + // get the drop event co-ordinates + int cx = Fl::event_x_root(); + int cy = Fl::event_y_root(); + // Is the event inside the boundary of this window? + if (visible() && + abs(cx - ex) < Wdrop && + abs(cy - ey) < Hdrop) { + res = 1; + } else { + res = 0; + } + } + return res; +} + diff --git a/src/widgets/toolgrp.cxx b/src/widgets/toolgrp.cxx new file mode 100644 index 00000000..ec3f0372 --- /dev/null +++ b/src/widgets/toolgrp.cxx @@ -0,0 +1,204 @@ +#include + +/* fltk includes */ +#include + +#include "toolgrp.h" +#include "toolwin.h" +#include "dropwin.h" +#include "dock_gp.h" + +// function to handle the dock actions +void toolgrp::dock_grp(void* v) +{ // dock CB + toolgrp *gp = (toolgrp *)v; + dockgroup *dock = gp->get_dock(); + + // we can only dock a group that's not already docked... + // and only if a dock exists for it + if((gp->docked() == 0) && (dock)) + { //re-dock the group + toolwin *cur_parent = (toolwin *)gp->parent(); + dock->add(gp); // move the toolgroup into the dock + dock->redraw(); + gp->docked(-1); // toolgroup is docked... + // so we no longer need the tool window. + cur_parent->hide(); + delete cur_parent; + } +} + +// static CB to handle the undock actions +void toolgrp::undock_grp(void* v) +{ // undock CB + toolgrp *gp = (toolgrp *)v; + dockgroup *dock = gp->get_dock(); + + if(gp->docked() == -1) + { // undock the group into its own non-modal tool window + int w = gp->w(); + int h = gp->h(); + Fl_Group::current(0); + toolwin *new_parent = new toolwin(Fl::event_x_root() - 10, Fl::event_y_root() - 35, w + 3, h + 3); + new_parent->end(); + dock->remove(gp); + new_parent->add(gp);// move the tool group into the floating window + new_parent->set_inner((void *)gp); + gp->position(1, 1); // align group in floating window + new_parent->show(); // show floating window + gp->docked(0); // toolgroup is no longer docked + dock->redraw(); // update the dock, to show the group has gone... + } +} + +void toolgrp::hide_show() +{ +// if (docked() == 0) return; + + dockgroup *dock = get_dock(); + if (docked() == 0) { + toolwin *cur_parent = (toolwin *)parent(); + dock->add(this); // move the toolgroup into the dock + dock->redraw(); + cur_parent->remove(this); + cur_parent->hide(); // remove current parent window + delete cur_parent; + dock->remove(this); // remove toolgroup from docked parent + docked(-2); + dock->redraw(); + } + else if (docked() == -1) { + dock->remove(this); + docked(-2); + dock->redraw(); + } else { // docked() == -2 // the unassigned state + dock->add(this); + docked(-1); + dock->redraw(); + } +} + +// static CB to handle the dismiss action +//void toolgrp::cb_dismiss(Fl_Button*, void* v) +//{ +// toolgrp *gp = (toolgrp *)v; +// dockgroup *dock = gp->get_dock(); + +// if(gp->docked()) +// { // remove the group from the dock +// dock->remove(gp); +// gp->docked(0); +// dock->redraw(); // update the dock, to show the group has gone... +// Fl::delete_widget(gp); +// } +// else +// { // remove the group from the floating window, +// // and remove the floating window +// toolwin *cur_parent = (toolwin *)gp->parent(); +// cur_parent->remove(gp); +// //delete cur_parent; // we no longer need the tool window. +// Fl::delete_widget(cur_parent); +// Fl::delete_widget(gp); +// } +//} + +// Constructors for docked/floating window +// WITH x, y co-ordinates +toolgrp::toolgrp(dockgroup *dk, int floater, int x, int y, int w, int h, const char *lbl) + : Fl_Group(1, 1, w - 2 , h - 2, lbl) +{ + if((floater) && (dk)) // create floating + { + create_floating(dk, 1, x, y, w, h, lbl); + } + else if(dk) // create docked + { + create_docked(dk); + } +// else //do nothing... +} + +// WITHOUT x, y co-ordinates +toolgrp::toolgrp(dockgroup *dk, int floater, int w, int h, const char *lbl) + : Fl_Group(1, 1, w - 2, h - 2, lbl) +{ + if((floater) && (dk)) // create floating + { + create_floating(dk, 0, 0, 0, w, h, lbl); + } + else if(dk) // create docked + { + create_docked(dk); + } +// else //do nothing... +} + +// construction function +void toolgrp::create_dockable_group() +{ + + dragger = new drag_btn(2, 2, 12, h() - 4); + dragger->type(FL_TOGGLE_BUTTON); + dragger->box(FL_ENGRAVED_FRAME); + dragger->tooltip("Drag Box"); + dragger->clear_visible_focus(); + dragger->when(FL_WHEN_CHANGED); + + inner_group = new Fl_Group(16, 2, w() - 18, h() - 4); + inner_group->box(FL_FLAT_BOX); +// inner_group->box(FL_ENGRAVED_FRAME); +} + +void toolgrp::create_docked(dockgroup *dk) +{ + // create the group itself + create_dockable_group(); + // place it in the dock + dk->add(this); + set_dock(dk); // define where the toolgroup is allowed to dock + docked(-1); // docked + dk->redraw(); + Fl_Group::resizable(inner_group); +} + +void toolgrp::create_floating(dockgroup *dk, int full, int x, int y, int w, int h, const char *lbl) +{ + toolwin *tw; + // create the group itself + create_dockable_group(); + // create a floating toolbar window + // Ensure the window is not created as a child of its own inner group! + Fl_Group::current(0); + if(full) + tw = new toolwin(x, y, w + 4, h + 4, lbl); + else + tw = new toolwin(w + 4, h + 4, lbl); + tw->end(); + tw->add(this); // move the tool group into the floating window + docked(0); // NOT docked + set_dock(dk); // define where the toolgroup is allowed to dock + tw->set_inner((void *)this); + tw->show(); + Fl_Group::current(inner_group); // leave this group open when we leave the constructor... + Fl_Group::resizable(inner_group); +} + +// function for setting the docked state and checkbox +void toolgrp::docked(short r) +{ + _docked = r; +} + +// methods for hiding/showing *all* the floating windows +// show all the active floating windows +void toolgrp::show_all(void) +{ + toolwin::show_all(); +} + +// hide all the active floating windows +void toolgrp::hide_all(void) +{ + toolwin::hide_all(); +} + diff --git a/src/widgets/toolwin.cxx b/src/widgets/toolwin.cxx new file mode 100644 index 00000000..29beed38 --- /dev/null +++ b/src/widgets/toolwin.cxx @@ -0,0 +1,101 @@ +#include + +#include "toolwin.h" +#include "toolgrp.h" +#include "dock_events.h" + +#include + +#define NTW (toolwin*)0 // Null Tool Window + +// HACK:: This just stores the toolwindows in a static array. I'm too lazy +// to make a proper linked list to store these in... +toolwin* toolwin::active_list[TW_MAX_FLOATERS]; // list of active toolwins +short toolwin::active = 0; // count of active tool windows + +// Dummy close button callback +static void cb_ignore(void) +{ + // Just shrug off the close callback... +} + +// constructors +toolwin::toolwin(int x, int y, int w, int h, const char *l) + : Fl_Double_Window(x, y, w, h, l) +{ + create_dockable_window(); +} + +toolwin::toolwin(int w, int h, const char *l) + : Fl_Double_Window(w, h, l) +{ + create_dockable_window(); +} + +// destructor +toolwin::~toolwin() +{ + active_list[idx] = NTW; + active --; +} + +// construction function +void toolwin::create_dockable_window() +{ + static int first_window = 1; + tool_group = (void *)0; + // window list intialisation... + // this is a nasty hack, should make a proper list + if(first_window) + { + first_window = 0; + for(short i = 0; i < TW_MAX_FLOATERS; i++) + active_list[i] = NTW; + } + // find an empty index + for(short i = 0; i < TW_MAX_FLOATERS; i++) + { + if(!active_list[i]) + { + idx = i; + active_list[idx] = this; + active ++; + clear_border(); + set_non_modal(); + callback((Fl_Callback *)cb_ignore); + return; + } + } + // if we get here, the list is probably full, what a hack. + // FIX THIS:: At present, we will get a non-modal window with + // decorations as a default instead... + set_non_modal(); +} + +// show all the active floating windows +void toolwin::show_all(void) +{ + if (active) + { + for(short i = 0; i < TW_MAX_FLOATERS; i++) + { + if(active_list[i]) + active_list[i]->show(); + } + } +} + +// hide all the active floating windows +void toolwin::hide_all(void) +{ + if (active) + { + for(short i = 0; i < TW_MAX_FLOATERS; i++) + { + if(active_list[i]) + active_list[i]->hide(); + } + } +} + + From 9b210f742104f3edd66e7235beae6e9da21d0167 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 12 Nov 2015 14:41:29 -0600 Subject: [PATCH 042/138] kml disable * disabled kml services unless user enables on kml configuration tab. - default is OFF --- src/dialogs/confdialog.cxx | 22 ++++++++++++++++++++++ src/dialogs/confdialog.fl | 18 +++++++++++++++++- src/include/confdialog.h | 1 + src/include/configuration.h | 3 +++ src/main.cxx | 5 ++++- 5 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index b332d12c..eda2728c 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -5065,6 +5065,18 @@ static void cb_btnKmlPurgeOnStartup(Fl_Check_Button* o, void*) { progdefaults.changed = true; } +Fl_Check_Button *btn_kml_enabled=(Fl_Check_Button *)0; + +static void cb_btn_kml_enabled(Fl_Check_Button* o, void*) { + progdefaults.kml_enabled = o->value(); +if (progdefaults.kml_enabled) { + kml_init(true); + progdefaults.changed = true; +} else { + KmlServer::Exit(); +}; +} + Fl_Group *tabQRZ=(Fl_Group *)0; Fl_Tabs *tabsQRZ=(Fl_Tabs *)0; @@ -11066,6 +11078,16 @@ and restarted if needed.")); btnKmlPurgeOnStartup->callback((Fl_Callback*)cb_btnKmlPurgeOnStartup); o->value(progdefaults.kml_purge_on_startup); } // Fl_Check_Button* btnKmlPurgeOnStartup + { Fl_Group* o = new Fl_Group(283, 327, 310, 40); + o->box(FL_ENGRAVED_FRAME); + { Fl_Check_Button* o = btn_kml_enabled = new Fl_Check_Button(305, 337, 242, 19, _("KML server enabled (On / Off)")); + btn_kml_enabled->tooltip(_("Uncheck if KML is never used")); + btn_kml_enabled->down_box(FL_DOWN_BOX); + btn_kml_enabled->callback((Fl_Callback*)cb_btn_kml_enabled); + o->value(progdefaults.kml_enabled); + } // Fl_Check_Button* btn_kml_enabled + o->end(); + } // Fl_Group* o tabKML->end(); } // Fl_Group* tabKML tabsMisc->end(); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index fdb746eb..762785f9 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -359,7 +359,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} Fl_Window {} { label {Fldigi configuration} open - xywh {610 168 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible + xywh {611 168 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible } { Fl_Tabs tabsConfigure {open xywh {0 0 600 380} color 50 selection_color 50 @@ -6319,6 +6319,22 @@ progdefaults.changed = true;} tooltip {Empties KML documents when starting program.} xywh {322 231 172 15} down_box DOWN_BOX code0 {o->value(progdefaults.kml_purge_on_startup);} } + Fl_Group {} {open + xywh {283 327 310 40} box ENGRAVED_FRAME + } { + Fl_Check_Button btn_kml_enabled { + label {KML server enabled (On / Off)} + callback {progdefaults.kml_enabled = o->value(); +if (progdefaults.kml_enabled) { + kml_init(true); + progdefaults.changed = true; +} else { + KmlServer::Exit(); +}} + tooltip {Uncheck if KML is never used} xywh {305 337 242 19} down_box DOWN_BOX + code0 {o->value(progdefaults.kml_enabled);} + } + } } } } diff --git a/src/include/confdialog.h b/src/include/confdialog.h index d2bb90e0..8208d562 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -621,6 +621,7 @@ extern Fl_Button *btlTestKmlCommand; extern Fl_Button *btnSelectKmlDestDir; extern Fl_Button *btlPurge; extern Fl_Check_Button *btnKmlPurgeOnStartup; +extern Fl_Check_Button *btn_kml_enabled; extern Fl_Group *tabQRZ; extern Fl_Tabs *tabsQRZ; extern Fl_Round_Button *btnQRZWEBnotavailable; diff --git a/src/include/configuration.h b/src/include/configuration.h index 557d7bec..60b0c832 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -352,6 +352,9 @@ ELEM_(bool, PseudoFSK, "PSEUDOFSK", \ "Generate Pseudo-FSK signal on right audio channel", \ false) \ + ELEM_(bool, kml_enabled, "KMLSERVER_ENABLED", \ + "Enable kml server threads", \ + true) \ ELEM_(bool, SynopAdifDecoding, "SYNOPADIFDECODING", \ "Decoding of Synop weather information on RTTY to ADIF log", \ false) \ diff --git a/src/main.cxx b/src/main.cxx index 385afcf7..78c4ff66 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -750,7 +750,8 @@ int main(int argc, char ** argv) void exit_process() { - KmlServer::Exit(); + if (progdefaults.kml_enabled) + KmlServer::Exit(); arq_close(); kiss_close(); XML_RPC_Server::stop(); @@ -1709,6 +1710,8 @@ static void arg_error(const char* name, const char* arg, bool missing) /// Sets or resets the KML parameters, and loads existing files. void kml_init(bool load_files) { + if (progdefaults.kml_enabled == false) return; // disabled kml service + KmlServer::GetInstance()->InitParams( progdefaults.kml_command, progdefaults.kml_save_dir, From c0a7cff119e10d81ae51621c4827a1fec57e9bc5 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 19 Nov 2015 04:51:10 -0600 Subject: [PATCH 043/138] Version 3.23.05 * Maintenance release --- ChangeLog | 20 ++++++++++++++++++-- configure.ac | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 645a9207..95554a63 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,26 @@ +=Version 3.23.05= + +2015-11-14 David Freese + + cf7a199: dock macros + 30e6eda: kml disable + 2e2c9e9: ADIF record repairs + 93342e4: gpio ptt + d6a34a4: NAVTEX/SYNOP/KML + +2015-10-19 John Phelps + + 51535ff: Add 8PSK 125FL 250FL + + =Version 3.23.04= + 2015-10-15 David Freese - 345e7c0: CW filter + 2516356: CW filter 7f23f3f: Update Check 4862141: fsq abort 3bed0e3: log merge @@ -12,7 +28,7 @@ =Version 3.23.03= - 004c1e7: thor-image + 551d105: thor-image c3b610b: FSQ trigger bug diff --git a/configure.ac b/configure.ac index ebe3cef7..dabb5252 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) m4_define(FLDIGI_MINOR, [23]) -m4_define(FLDIGI_PATCH, [.04]) +m4_define(FLDIGI_PATCH, [.05]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.5]) From 55e0d31b881478adb2214b747f810c042a40f99b Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 19 Nov 2015 17:59:54 -0600 Subject: [PATCH 044/138] Compiler warnings * Fix code to correct compiler warnings --- src/misc/kmlserver.cxx | 8 +++++--- src/synop-src/synop.cxx | 23 +++++++++++++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/misc/kmlserver.cxx b/src/misc/kmlserver.cxx index 3ea3bc37..92ff91d6 100644 --- a/src/misc/kmlserver.cxx +++ b/src/misc/kmlserver.cxx @@ -683,7 +683,9 @@ class KmlSrvImpl : public KmlServer { /// and different positions due to a move. This has to be very fast because under lock protection. void FlushQueue(double merge_dist) { if (bMOREINFO) - LOG_INFO("FlushQueue nbelts %d sz=%d", m_queue_to_insert.size(), size() ); + LOG_INFO("FlushQueue nbelts %d sz=%d", + static_cast(m_queue_to_insert.size()), + static_cast(size()) ); if( m_queue_to_insert.empty() ) return ; @@ -692,7 +694,7 @@ class KmlSrvImpl : public KmlServer { DirectInsert( *itPL, merge_dist ); } if (bMOREINFO) - LOG_INFO("Flushed into sz=%d", size() ); + LOG_INFO("Flushed into sz=%d", static_cast(size()) ); // TODO: If lock contention problems, we might swap this list with another one owned by this // objet. This would later be merged into the container before saving data to disk. @@ -1384,7 +1386,7 @@ class KmlSrvImpl : public KmlServer { bool RewriteKmlFileFull(void) { bool wasSaved = false ; if (bMOREINFO) - LOG_INFO("nb_categories=%d", nb_categories ); + LOG_INFO("nb_categories=%d", static_cast(nb_categories) ); for( size_t i = 0; i < nb_categories; ++i ) { const char * category = categories[i]; PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); diff --git a/src/synop-src/synop.cxx b/src/synop-src/synop.cxx index 8b89d7bb..b43061a9 100644 --- a/src/synop-src/synop.cxx +++ b/src/synop-src/synop.cxx @@ -591,7 +591,8 @@ public: // First take the names if (bMOREINFO) - LOG_INFO("Eliminating duplicates out of %d elements",m_catalog.size()); + LOG_INFO("Eliminating duplicates out of %d elements", + static_cast(m_catalog.size())); for( IteratorType it = m_catalog.begin(), en = m_catalog.end(); it != en; ++it ) { RecordWmoStation & refWmo = it->second ; @@ -613,14 +614,19 @@ public: ++nbKeys; } if (bMOREINFO) - LOG_INFO("Name=%s nb=%d", itH->first.c_str(), nbKeys ); + LOG_INFO("Name=%s nb=%d", + itH->first.c_str(), + static_cast(nbKeys) ); // If no duplicates, then try next one. if( nbKeys == 1 ) continue ; ++nbDupl ; if (bMOREINFO) - LOG_INFO("%d: Name %s %d occurrences", nbDupl, itH->first.c_str(), nbKeys ); + LOG_INFO("%d: Name %s %d occurrences", + static_cast(nbDupl), + itH->first.c_str(), + static_cast(nbKeys) ); // There should not be many elements, two or three duplicates, maximum five apparently. typedef std::set< std::string > DiffNamesT ; @@ -678,7 +684,8 @@ public: HashT allNames ; if (bMOREINFO) - LOG_INFO("Eliminating duplicates out of %d elements",m_catalog.size()); + LOG_INFO("Eliminating duplicates out of %d elements", + static_cast(m_catalog.size())); /// First take the names for( IteratorType it = m_catalog.begin(), en = m_catalog.end(); it != en; ++it ) @@ -702,7 +709,9 @@ public: ++nbKeys; } if (bMOREINFO) - LOG_INFO("Name=%s nb=%d", itH->first.c_str(), nbKeys ); + LOG_INFO("Name=%s nb=%d", + itH->first.c_str(), + static_cast(nbKeys) ); // If no duplicates, then try next one. if( nbKeys == 1 ) continue ; @@ -710,7 +719,9 @@ public: ++nbDupl ; if (bMOREINFO) LOG_INFO("%d: Buoy name %s %d occurrences", - nbDupl, itH->first.c_str(), nbKeys ); + static_cast(nbDupl), + itH->first.c_str(), + static_cast(nbKeys) ); // There should not be many elements, two or three duplicates, maximum five apparently. typedef std::set< std::string > DiffNamesT ; From b19fff8d6be3b3e9e8318bf5c19191de24b57000 Mon Sep 17 00:00:00 2001 From: David Freese Date: Fri, 20 Nov 2015 18:07:13 -0600 Subject: [PATCH 045/138] Documentation * update to transmit meta strings * removed verbatim text from doc src file Macros.txt --- .../user_src_docs/KeyboardAndKeys.txt | 20 +++++++++++++------ fldigi_doxygen/user_src_docs/Macros.txt | 20 ------------------- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/fldigi_doxygen/user_src_docs/KeyboardAndKeys.txt b/fldigi_doxygen/user_src_docs/KeyboardAndKeys.txt index f3fab511..2b84a86c 100644 --- a/fldigi_doxygen/user_src_docs/KeyboardAndKeys.txt +++ b/fldigi_doxygen/user_src_docs/KeyboardAndKeys.txt @@ -23,12 +23,20 @@ text into the transmit buffer. There is one very important exception:
    -The caret "^" symbol. This is used in the macro expansion routine -and also used by the transmit buffer evaluator. A ^r puts fldigi into -receive mode. So you can enter the ^r (caret followed by the r) at the end -of your transmit buffer and when the sent character cursor (red chars) gets to -that point the program will clear the text and return to the receive -mode. +The caret "^" symbol, which fldigi uses as a meta character. The ^ is +used in the macro expansion routine and also used by the transmit buffer +evaluator. A ^r puts fldigi into receive mode. So you can enter the ^r +(caret followed by the r) at the end of your transmit buffer and when +the sent character cursor (red chars) gets to that point the program will +clear the text and return to the receive mode. +
    + +Other useful meta combinations: +
      +
    • ^l ^L - save the log entry when meta combination parsed
    • +
    • ^p ^P - pause transmission at this point in transmit text
    • +
    • ^r ^R - return to receive clear all transmit text
    • +

    You can load the transmit buffer with any ASCII Text file of your diff --git a/fldigi_doxygen/user_src_docs/Macros.txt b/fldigi_doxygen/user_src_docs/Macros.txt index 32990359..5ac9aec3 100644 --- a/fldigi_doxygen/user_src_docs/Macros.txt +++ b/fldigi_doxygen/user_src_docs/Macros.txt @@ -235,26 +235,6 @@ Macro | Description
  • -
    - -\verbatim - * Added macro to insert QRG text into Rx stream - - * Added save macro tag - * Added export strings - - FLDIGI_LOG_FILE - current logbook file name - - FLDIGI_MACRO_FILE - current macro file name - * Added tag - - returns to receive, but does not clear Tx buffer - * Added tag to control - transmit attenuator control from within a macro. - * Added macro tag - a do nothing that disappears from the transmitted - text -\endverbatim - -
    - \section modem_macro_tags Modem macro tags Macro tags are also assigned to each supported modem type and sub-modem type From 0b5b329d95a3092fed7b6c8c63040341c5f18a7b Mon Sep 17 00:00:00 2001 From: John Phelps Date: Fri, 20 Nov 2015 18:07:56 -0600 Subject: [PATCH 046/138] Developer Doxygen and BerliOS clean - Cleaned and Fixed developer Doxygen files - Added GitStats to the Dev Doxygen info -- run ./scripts/doxygen/gen_doxygen_docs.sh - Removed leftover refrences to BerliOS - Changed BerliOS links to Sourceforge links --- configure.ac | 4 +-- doc/flarq.1.txt | 2 +- doc/fldigi.1.txt | 2 +- scripts/doxygen/gen_doxygen_docs.sh | 40 +++++++++++++++++++++-------- src/include/doxygen.h | 27 +++++++++++-------- 5 files changed, 50 insertions(+), 25 deletions(-) diff --git a/configure.ac b/configure.ac index dabb5252..c8f8c76d 100644 --- a/configure.ac +++ b/configure.ac @@ -14,7 +14,7 @@ m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.5]) -AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[]FLDIGI_PATCH, [fldigi-devel@lists.berlios.de]) +AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[]FLDIGI_PATCH, [fldigi-devel@sourceforge.net]) # substitute in Makefiles AC_SUBST([FLDIGI_VERSION_MAJOR], [FLDIGI_MAJOR]) @@ -67,7 +67,7 @@ AC_DEFINE_UNQUOTED([FLDIGI_AUTHORS], ["$FLDIGI_AUTHORS"], [Fldigi authors]) AC_DEFINE_UNQUOTED([FLARQ_AUTHORS], ["$FLARQ_AUTHORS"], [Flarq authors]) AC_DEFINE_UNQUOTED([PACKAGE_HOME], ["$PACKAGE_HOME"], [Home page]) AC_DEFINE_UNQUOTED([PACKAGE_DL], ["$PACKAGE_DL"], [Download page]) -AC_DEFINE_UNQUOTED([PACKAGE_PROJ], ["$PACKAGE_PROJ"], [BerliOS page]) +AC_DEFINE_UNQUOTED([PACKAGE_PROJ], ["$PACKAGE_PROJ"], [Sourceforge page]) AC_DEFINE_UNQUOTED([PACKAGE_NEWBUG], ["$PACKAGE_NEWBUG"], [Trac new ticket page]) AC_DEFINE_UNQUOTED([PACKAGE_DOCS], ["$PACKAGE_DOCS"], [Docs index]) AC_DEFINE_UNQUOTED([PACKAGE_GUIDE], ["$PACKAGE_GUIDE"], [Beginners guide]) diff --git a/doc/flarq.1.txt b/doc/flarq.1.txt index f098faa0..496974b5 100644 --- a/doc/flarq.1.txt +++ b/doc/flarq.1.txt @@ -126,7 +126,7 @@ Flarq web site: http://www.w1hkj.com/flarq_main.html Fldigi web site: http://www.w1hkj.com/Fldigi.html -BerliOS project page: http://developer.berlios.de/projects/fldigi/ +Sourceforge project page: http://sourceforge.net/projects/fldigi/ ARQ specification by Paul Schmidt, K9PS: http://www.w1hkj.com/FlarqHelpFiles/ARQ2.pdf diff --git a/doc/fldigi.1.txt b/doc/fldigi.1.txt index dadf70b8..4a6348a8 100644 --- a/doc/fldigi.1.txt +++ b/doc/fldigi.1.txt @@ -443,7 +443,7 @@ getaddrinfo(3), getopt(3), regex(7), X(7) == RESOURCES == Main web site: http://www.w1hkj.com/Fldigi.html -BerliOS project page: http://developer.berlios.de/projects/fldigi/ +Sourceforge project page: http://sourceforge.net/projects/fldigi/ Wiki and bug tracker: https://fedorahosted.org/fldigi/ diff --git a/scripts/doxygen/gen_doxygen_docs.sh b/scripts/doxygen/gen_doxygen_docs.sh index 60d07572..9627e344 100755 --- a/scripts/doxygen/gen_doxygen_docs.sh +++ b/scripts/doxygen/gen_doxygen_docs.sh @@ -1,6 +1,6 @@ #! /bin/bash -e # -# KL4YFD 2013 +# Copyright (C) KL4YFD 2013-2015 # Released under GNU GPL # @@ -12,19 +12,21 @@ cd $( dirname ${BASH_SOURCE[0]} ) function usage { printf "\n\nThis script generates Doxygen documentation from the " - printf "\nfldigi sourcecode. By default, the tool \"cppcheck\" is also called. \nNote: This analysis takes longer than compilation and produces about 1.8GiB of data." + printf "\nfldigi sourcecode. Unless disabled, the tool \"cppcheck\" is also called. \nNote: This analysis takes longer than compilation and produces about 2000 MiB of data on-disk." printf "\n\nUsage:" printf "\n\tGenerate Doxygen documentation:\t ./gen_doxygen_docs.sh run" + printf "\n\tGenerate Doxygen documentation without Cppcheck:\t ./gen_doxygen_docs.sh nocppcheck" printf "\n\tClean up after Doxygen run:\t ./gen_doxygen_docs.sh clean" - printf "\n\tClean up after Doxygen run:\t ./gen_doxygen_docs.sh nocppcheck" printf "\n\tPrint this usage summary:\t ./gen_doxygen_docs.sh help \n\n" } function doxygen_clean { rm -Rf HTML - printf "\ndoxygen documentation deleted!\n" + printf "\n\nDoxygen documentation deleted!\n\n" } +# set defaults +nocppcheck_flag=false case "$1" in "run") @@ -34,11 +36,11 @@ case "$1" in break ;; "nocppcheck") - cppcheck_clean - exit + ../tests/cppcheck/gen_cppcheck_results.sh clean + nocppcheck_flag=true ;; "clean") - doxygen_clean + doxygen_clean # this auto-catches the gitstats files also ../tests/cppcheck/gen_cppcheck_results.sh clean exit ;; @@ -79,6 +81,14 @@ if ! which mscgen ; then exit 1 fi +# Ensure the binary "gitstats" is on the system +if ! which gitstats ; then + printf "\n\nERROR: Generating the Fldigi Doxygen documents requires the program: gitstats" + printf "\n\tPlease install this program to continue." + printf "\n\n === ABORTING === \n\n" + exit 1 +fi + # Ensure the Doxygen config file exists if [ ! -e ./fldigi_doxyfile.txt ]; then printf "\n\nERROR: Doxygen configuration file: \"fldigi_doxyfile.txt\" not found." @@ -86,13 +96,19 @@ if [ ! -e ./fldigi_doxyfile.txt ]; then exit 1 fi -doxygen fldigi_doxyfile.txt + +mkdir HTML # just in case + +doxygen fldigi_doxyfile.txt # this takes a while + +gitstats ../../ ./HTML/GITSTATS # this is pretty fast + # Go create some really useful information using git cd HTML mkdir __git; cd __git - git format-patch --summary -n HEAD~125 # Create patches for the last 125 commits - git log --stat -n 125 > gitlog.txt # Dump the history of the last 125 commits + git format-patch --summary -n HEAD~100 # Create patches for the last 100 commits + git log --stat -n 100 > gitlog.txt # Dump the history of the last 100 commits cd .. cd .. @@ -100,7 +116,9 @@ if ! which cppcheck ; then printf "\n\nWARNING: Binary \"cppcheck\" not found." printf "\n\n\t Skipping sourcecode analysis. Install cppcheck and re-run.\n\n" else - ../tests/cppcheck/gen_cppcheck_results.sh run + if [ "$nocppcheck_flag" != true ];then + ../tests/cppcheck/gen_cppcheck_results.sh run + fi fi printf "\n\n === DOXYGEN documentation generation complete. ===" diff --git a/src/include/doxygen.h b/src/include/doxygen.h index d052070f..b21bee2e 100644 --- a/src/include/doxygen.h +++ b/src/include/doxygen.h @@ -1,7 +1,7 @@ // ---------------------------------------------------------------------------- // doxygen.h // -// Copyright (C) 2013 +// Copyright (C) 2013-2015 // John Phelps, KL4YFD // // This file is part of fldigi. @@ -27,7 +27,7 @@ */ -/** \mainpage Fldigi 3.21 doxygen documentation +/** \mainpage Fldigi Developer Doxygen Documentation
    \section intro Introduction @@ -48,13 +48,14 @@ \section download To Download Fldigi :
    - + \section entry Good Entry-Points for Navigating the Doxygen Documentation :
      @@ -85,8 +86,14 @@ \section git Information from git : \section license License From e08e403757dc100a3d11ce8b74d3bc71bbf338d0 Mon Sep 17 00:00:00 2001 From: David Freese Date: Mon, 23 Nov 2015 10:55:05 -0600 Subject: [PATCH 047/138] ARQ shutdown * Added LOG_INFO statement during shutdown --- src/misc/arq_io.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/misc/arq_io.cxx b/src/misc/arq_io.cxx index a8386f99..04e6f0c0 100644 --- a/src/misc/arq_io.cxx +++ b/src/misc/arq_io.cxx @@ -872,6 +872,7 @@ void arq_close(void) // and then wait for it to die pthread_join(arq_thread, NULL); arq_enabled = false; + LOG_INFO("ARQ closed"); if(data_io_enabled == ARQ_IO) data_io_enabled = DISABLED_IO ; arq_exit = false; From 482d0606c8fb257b6cd92f723e0d7790c4ac1dbb Mon Sep 17 00:00:00 2001 From: David Freese Date: Mon, 23 Nov 2015 18:40:03 -0600 Subject: [PATCH 048/138] Smeter PWRmeter * Added resize methods to both classes --- src/dialogs/fl_digi.cxx | 5 ++++ src/include/pwrmeter.h | 2 ++ src/include/smeter.h | 1 + src/widgets/pwrmeter.cxx | 65 +++++++++++++++++++++++++++++++++++++--- src/widgets/smeter.cxx | 34 +++++++++++++++++++++ 5 files changed, 103 insertions(+), 4 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 492c57ae..1d144298 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -3990,6 +3990,11 @@ UI_return: text_panel->position( orgx, orgy, nux, nuy); + RigControlFrame->init_sizes(); + RigControlFrame->redraw(); + smeter->redraw(); + pwrmeter->redraw(); + center_group->redraw(); wefax_group->redraw(); fsq_group->redraw(); diff --git a/src/include/pwrmeter.h b/src/include/pwrmeter.h index bc5da02c..4741ab17 100644 --- a/src/include/pwrmeter.h +++ b/src/include/pwrmeter.h @@ -69,6 +69,7 @@ public: void value(double v) { value_ = v; redraw(); } double value() const { return (value_); } + void resize(int x, int y, int w, int h); void set_background(Fl_Color c1) { bgnd_ = c1; redraw(); } void set_metercolor(Fl_Color c2) { fgnd_ = c2; redraw(); } @@ -83,5 +84,6 @@ private: void select_200W(); }; + #endif // !pwrmeter diff --git a/src/include/smeter.h b/src/include/smeter.h index 23c1d108..21526524 100644 --- a/src/include/smeter.h +++ b/src/include/smeter.h @@ -76,6 +76,7 @@ public: redraw(); } double value() const { return (value_); } + void resize(int x, int y, int w, int h); void set_background(Fl_Color c1) { bgnd_ = c1; redraw(); } void set_metercolor(Fl_Color c2) { fgnd_ = c2; redraw(); } diff --git a/src/widgets/pwrmeter.cxx b/src/widgets/pwrmeter.cxx index 3ff85e3d..94777487 100644 --- a/src/widgets/pwrmeter.cxx +++ b/src/widgets/pwrmeter.cxx @@ -132,10 +132,10 @@ void PWRmeter::select( int sel ) { redraw(); } -const char * PWRmeter::W25_face = "| : : : : | : : : : | : : : : | : : : : | : : : : | 25"; -const char * PWRmeter::W50_face = "| : | : | : | : | : | 50"; -const char * PWRmeter::W100_face = "| | | | | | | | | | | 100"; -const char * PWRmeter::W200_face = "| : | : | : | : | 200"; +const char * PWRmeter::W25_face = "| : : : : | : : : : | : : : : | : : : : | : : : 25|"; +const char * PWRmeter::W50_face = "| : | : | : | : | : 50|"; +const char * PWRmeter::W100_face = "| | | | | | | | | | 100|"; +const char * PWRmeter::W200_face = "| : | : | : | : 200|"; PWRmeter::PWRmeter(int X, int Y, int W, int H, const char* l) : Fl_Widget(X, Y, W, H, "") @@ -188,6 +188,63 @@ PWRmeter::PWRmeter(int X, int Y, int W, int H, const char* l) meter_width -= fl_width("| 100"); } +void PWRmeter::resize(int X, int Y, int W, int H) { + Fl_Widget::resize(X,Y,W,H); + + bx = Fl::box_dx(box()); + by = Fl::box_dy(box()); + bw = Fl::box_dw(box()); + bh = Fl::box_dh(box()); + + tx = X + bx; + tw = W - bw; + ty = Y + by; + th = H - bh; + + const char *face; + switch (select_) { + case P25: + face = W25_face; + break; + case P50: + face = W50_face; + break; + case P100: + face = W100_face; + break; + case P200: + face = W200_face; + break; + case AUTO: + default: + face = W25_face; + } + + static int fsize = 6; + fl_font(FL_HELVETICA, fsize); + meter_width = fl_width(face); + while ((meter_width < tw) && (fl_height() < th)) { + fsize++; + fl_font(FL_HELVETICA, fsize); + meter_width = fl_width(face); + } + fsize--; + fl_font(FL_HELVETICA, fsize); + meter_width = fl_width(face); + + meter_height = fl_height(); + label(face); + labelfont(FL_HELVETICA); + labelsize(fsize); + labelcolor(scale_color); + + sx = (tw - meter_width) / 2 + fl_width("|") / 2; + + meter_width -= fl_width("| 100"); + +} + + // // End of PWRmeter.cxx // diff --git a/src/widgets/smeter.cxx b/src/widgets/smeter.cxx index abeba00c..84a24911 100644 --- a/src/widgets/smeter.cxx +++ b/src/widgets/smeter.cxx @@ -98,6 +98,40 @@ Smeter::Smeter(int X, int Y, int W, int H, const char* l) sx = (tw - meter_width) / 2; } +void Smeter::resize(int X, int Y, int W, int H) { + Fl_Widget::resize(X,Y,W,H); + + bx = Fl::box_dx(box()); + by = Fl::box_dy(box()); + bw = Fl::box_dw(box()); + bh = Fl::box_dh(box()); + + tx = X + bx; + tw = W - bw; + ty = Y + by; + th = H - bh; + + static int fsize = 6; + fl_font(FL_HELVETICA, fsize); + meter_width = fl_width(meter_face); + while ((meter_width < tw) && (fl_height() < th)) { + fsize++; + fl_font(FL_HELVETICA, fsize); + meter_width = fl_width(meter_face); + } + fsize--; + fl_font(FL_HELVETICA, fsize); + meter_width = fl_width(meter_face); + meter_height = fl_height(); + label(meter_face); + labelfont(FL_HELVETICA); + labelsize(fsize); + labelcolor(scale_color); + + meter_width -= fl_width("|"); + sx = (tw - meter_width) / 2; +} + // // End of Smeter.cxx // From 3f577d977b0994fc07c38c9e1841e2dd00ab0ca1 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 25 Nov 2015 19:24:57 -0600 Subject: [PATCH 049/138] WO woes * WO strikes again as a result of adding the 4x12 matrix I need to be more careful and remember to test the --wo for the N1MM users --- src/dialogs/fl_digi.cxx | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 1d144298..ca52eaa4 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -7218,7 +7218,7 @@ void noop_controls() // create and then hide all controls not being used btnMacro[i] = new Fl_Button(defwidget); btnMacro[i]->hide(); } for (int i = 0; i < 48; i++) { - btnDockMacro[i] = new Fl_Button(defwidget); btnMacro[i]->hide(); + btnDockMacro[i] = new Fl_Button(defwidget); btnDockMacro[i]->hide(); } inpQth = new Fl_Input2(defwidget); inpQth->hide(); @@ -7342,17 +7342,16 @@ void create_fl_digi_main_WF_only() { fl_font(fnt, fsize); - IMAGE_WIDTH = 4000;//progdefaults.HighFreqCutoff; + IMAGE_WIDTH = 4000; Hwfall = progdefaults.wfheight; Wwfall = progStatus.mainW - 2 * DEFAULT_SW - 2 * pad; - WF_only_height = fl_digi_main->workspace->y() + Hwfall + Hstatus + 4 * pad; + WF_only_height = Hmenu + Hwfall + Hstatus + 4 * pad; -// fl_digi_main = new Fl_Double_Window(progStatus.mainW, WF_only_height); fl_digi_main = new dropwin(progStatus.mainW, WF_only_height); - mnuFrame = new Fl_Group(0,0,progStatus.mainW, fl_digi_main->workspace->y()); + mnuFrame = new Fl_Group(0,0,progStatus.mainW, Hmenu); - mnu = new Fl_Menu_Bar(0, 0, progStatus.mainW - 200 - pad, fl_digi_main->workspace->y()); + mnu = new Fl_Menu_Bar(0, 0, progStatus.mainW - 200 - pad, Hmenu); // do some more work on the menu for (size_t i = 0; i < sizeof(alt_menu_)/sizeof(alt_menu_[0]); i++) { // FL_NORMAL_SIZE may have changed; update the menu items @@ -7365,29 +7364,29 @@ void create_fl_digi_main_WF_only() { } mnu->menu(alt_menu_); - btnAutoSpot = new Fl_Light_Button(progStatus.mainW - 200 - pad, 0, 50, fl_digi_main->workspace->y(), "Spot"); + btnAutoSpot = new Fl_Light_Button(progStatus.mainW - 200 - pad, 0, 50, Hmenu, "Spot"); btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->callback(cbAutoSpot, 0); btnAutoSpot->deactivate(); - btnRSID = new Fl_Light_Button(progStatus.mainW - 150 - pad, 0, 50, fl_digi_main->workspace->y(), "RxID"); + btnRSID = new Fl_Light_Button(progStatus.mainW - 150 - pad, 0, 50, Hmenu, "RxID"); btnRSID->selection_color(progdefaults.RxIDColor); btnRSID->tooltip("Receive RSID"); btnRSID->callback(cbRSID, 0); - btnTxRSID = new Fl_Light_Button(progStatus.mainW - 100 - pad, 0, 50, fl_digi_main->workspace->y(), "TxID"); + btnTxRSID = new Fl_Light_Button(progStatus.mainW - 100 - pad, 0, 50, Hmenu, "TxID"); btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->tooltip("Transmit RSID"); btnTxRSID->callback(cbTxRSID, 0); - btnTune = new Fl_Light_Button(progStatus.mainW - 50 - pad, 0, 50, fl_digi_main->workspace->y(), "TUNE"); + btnTune = new Fl_Light_Button(progStatus.mainW - 50 - pad, 0, 50, Hmenu, "TUNE"); btnTune->selection_color(progdefaults.TuneColor); btnTune->callback(cbTune, 0); mnuFrame->resizable(mnu); mnuFrame->end(); - Y = fl_digi_main->workspace->y() + pad; + Y = Hmenu + pad; Fl_Pack *wfpack = new Fl_Pack(0, Y, progStatus.mainW, Hwfall); wfpack->type(1); From 16ede0800c3f46b30fbc0264f92bfd16f493ffb8 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 26 Nov 2015 22:23:39 -0600 Subject: [PATCH 050/138] flrig xmlrpc * give priority to flrig xmlrpc support independent of any other configuration setting for rig control - dependent on fldigi detecting an flrig compatible xmlrpc xcvr server * add test for xcvr response loop to set_ptt * added XMLRPC_DEBUG with time signature --- src/include/debug.h | 12 ++- src/include/rigsupport.h | 2 +- src/misc/debug.cxx | 66 ++++++------- src/rigcontrol/rigsupport.cxx | 23 +++-- src/rigcontrol/xmlrpc_rig.cxx | 168 +++++++++++++++++++--------------- 5 files changed, 147 insertions(+), 124 deletions(-) diff --git a/src/include/debug.h b/src/include/debug.h index 3dff2711..23cd6597 100644 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -35,9 +35,15 @@ public: VERBOSE_LEVEL, DEBUG_LEVEL, LOG_NLEVELS }; enum source_e { - LOG_ARQCONTROL = 1 << 0, LOG_AUDIO = 1 << 1, LOG_MODEM = 1 << 2, - LOG_RIGCONTROL = 1 << 3, LOG_RPC = 1 << 4, LOG_SPOTTER = 1 << 5, - LOG_KISSCONTROL = 1 << 6, LOG_OTHER = 1 << 7 + LOG_ARQCONTROL = 1 << 0, + LOG_AUDIO = 1 << 1, + LOG_MODEM = 1 << 2, + LOG_RIGCONTROL = 1 << 3, + LOG_XMLRPC_RIG = 1 << 4, + LOG_RPC = 1 << 5, + LOG_SPOTTER = 1 << 6, + LOG_KISSCONTROL = 1 << 7, + LOG_OTHER = 1 << 8 }; static void start(const char* filename); static void stop(void); diff --git a/src/include/rigsupport.h b/src/include/rigsupport.h index 07db8819..82ed8ff5 100644 --- a/src/include/rigsupport.h +++ b/src/include/rigsupport.h @@ -113,7 +113,7 @@ extern void FLRIG_set_flrig_ab(int n); //------------------------------------------------------------------------------ // flrig xmlrpc client support //------------------------------------------------------------------------------ - +extern bool connected_to_flrig; //------------------------------------------------------------------------------ #endif diff --git a/src/misc/debug.cxx b/src/misc/debug.cxx index d8faed84..22494c2d 100644 --- a/src/misc/debug.cxx +++ b/src/misc/debug.cxx @@ -70,14 +70,12 @@ using namespace std; static FILE* wfile = 0; static FILE* rfile = 0; -static size_t nlines = 0; static int rfd; static bool tty; static Fl_Double_Window* window; +static Fl_Browser* btext; -static Fl_Browser* btext; -static string dbg_buffer; static string linebuf; debug* debug::inst = 0; @@ -101,6 +99,7 @@ Fl_Menu_Item src_menu[] = { { _("Audio"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Modem"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Rig control"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, + { _("Flrig I/O"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("RPC"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("Spotter"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE }, { _("KISS control"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_VALUE | FL_MENU_DIVIDER }, @@ -139,11 +138,11 @@ void debug::start(const char* filename) window->xclass(PACKAGE_TARNAME); int pad = 2; - Fl_Menu_Button* button = new Fl_Menu_Button(pad, pad, 128, 20, _("Log sources")); + Fl_Menu_Button* button = new Fl_Menu_Button(pad, pad, 128, 22, _("Log sources")); button->menu(src_menu); button->callback(src_menu_cb); - Fl_Slider* slider = new Fl_Slider(button->x() + button->w() + pad, pad, 128, 20, prefix[level]); + Fl_Slider* slider = new Fl_Slider(button->x() + button->w() + pad, pad, 128, 22, prefix[level]); slider->tooltip(_("Change log level")); slider->align(FL_ALIGN_RIGHT); slider->type(FL_HOR_NICE_SLIDER); @@ -152,14 +151,13 @@ void debug::start(const char* filename) slider->value(level); slider->callback(slider_cb); - Fl_Button* clearbtn = new Fl_Button(window->w() - 64, pad, 60, 20, "clear"); + Fl_Button* clearbtn = new Fl_Button(window->w() - 64, pad, 60, 22, "clear"); clearbtn->callback(clear_cb); btext = new Fl_Browser(pad, slider->h()+pad, window->w()-2*pad, window->h()-slider->h()-2*pad, 0); btext->textfont(FL_HELVETICA); btext->textsize(14); window->resizable(btext); - dbg_buffer.clear(); window->end(); } @@ -178,6 +176,7 @@ void debug::stop(void) } static char fmt[1024]; +static char dtext[16384]; void debug::log(level_e level, const char* func, const char* srcf, int line, const char* format, ...) { @@ -185,7 +184,8 @@ void debug::log(level_e level, const char* func, const char* srcf, int line, con if (!inst) return; - if (unlikely(debug::level == DEBUG_LEVEL) || debug_pskmail || debug_audio) { + if (unlikely(debug::level == DEBUG_LEVEL) || + debug_pskmail || debug_audio) { time_t t = time(NULL); struct tm stm; (void)localtime_r(&t, &stm); @@ -196,13 +196,13 @@ void debug::log(level_e level, const char* func, const char* srcf, int line, con snprintf(fmt, sizeof(fmt), "%c: %s: %s\n", *prefix[level], func, format); va_list args; va_start(args, format); - intptr_t nw = vfprintf(wfile, fmt, args); + intptr_t nt = vsnprintf(dtext, sizeof(dtext), fmt, args); va_end(args); + + fprintf(wfile, "%s", dtext); if (tty) { if (level <= DEBUG_LEVEL && level > QUIET_LEVEL) { - va_start(args, format); - vfprintf(stderr, fmt, args); - va_end(args); + fprintf(stderr, "%s", dtext); } } @@ -210,7 +210,8 @@ void debug::log(level_e level, const char* func, const char* srcf, int line, con fflush(wfile); #endif - Fl::awake(sync_text, (void*)nw); + linebuf.append(dtext); + Fl::awake(sync_text, (void*)nt); } void debug::hex_dump(const char* func, const char * data, int length) @@ -270,35 +271,20 @@ void debug::show(void) window->show(); } -static char buf[BUFSIZ+1]; - void debug::sync_text(void* arg) { - intptr_t toread = (intptr_t)arg; - size_t block = MIN((size_t)toread, sizeof(buf) - 1); - ssize_t n; + guard_lock debug_lock(&debug_mutex); - while (toread > 0) { - if ((n = read(rfd, buf, block)) <= 0) - break; - if (unlikely(++nlines > MAX_LINES)) { - btext->clear(); - nlines = 0; - } - buf[n] = '\0'; - linebuf = buf; - if (linebuf[linebuf.length() - 1] != '\n') - linebuf += '\n'; - size_t p1 = 0, p2 = linebuf.find("\n"); - while( p2 != string::npos) { - btext->add(linebuf.substr(p1, p2 - p1).c_str()); - btext->redraw(); - dbg_buffer.append(linebuf.substr(p1, p2 - p1 + 1));//.append("\n"); - p1 = p2 + 1; - p2 = linebuf.find("\n", p1); - } - toread -= n; + size_t p1 = 0, p2 = linebuf.find("\n"); + while (p2 != string::npos) { + btext->add(linebuf.substr(p1, p2 - p1).c_str()); + p1 = p2 + 1; + p2 = linebuf.find("\n", p1); } + btext->redraw(); + btext->bottomline(btext->size()); + linebuf.clear(); + return; } debug::debug(const char* filename) @@ -320,6 +306,7 @@ debug::debug(const char* filename) throw strerror(errno); #endif tty = isatty(fileno(stderr)); + linebuf.clear(); } debug::~debug() @@ -342,7 +329,8 @@ static void src_menu_cb(Fl_Widget* w, void*) static void clear_cb(Fl_Widget* w, void*) { + guard_lock debug_lock(&debug_mutex); btext->clear(); - dbg_buffer.clear(); + linebuf.clear(); } diff --git a/src/rigcontrol/rigsupport.cxx b/src/rigcontrol/rigsupport.cxx index 04e8a87e..8eea9da1 100644 --- a/src/rigcontrol/rigsupport.cxx +++ b/src/rigcontrol/rigsupport.cxx @@ -317,21 +317,25 @@ void buildlist() int cb_qso_opMODE() { + if (connected_to_flrig) { + set_flrig_mode(qso_opMODE->value()); + return 0; + } #if USE_HAMLIB if (progdefaults.chkUSEHAMLIBis) hamlib_setmode(mode_nums[qso_opMODE->value()]); else #endif rigCAT_setmode(qso_opMODE->value()); - set_flrig_mode(qso_opMODE->value()); return 0; } int cb_qso_opBW() { - if (progdefaults.chkUSERIGCATis) + if (connected_to_flrig) + set_flrig_bw(qso_opBW->index(), -1); + else if (progdefaults.chkUSERIGCATis) rigCAT_setwidth(qso_opBW->value()); - set_flrig_bw(qso_opBW->index(), -1); return 0; } @@ -367,13 +371,16 @@ int cb_qso_opBW2() void sendFreq(long int f) { + if (connected_to_flrig) + set_flrig_freq(f); + else { #if USE_HAMLIB - if (progdefaults.chkUSEHAMLIBis) - hamlib_setfreq(f); - else + if (progdefaults.chkUSEHAMLIBis) + hamlib_setfreq(f); + else #endif - rigCAT_setfreq(f); - set_flrig_freq(f); + rigCAT_setfreq(f); + } } void qso_movFreq(Fl_Widget* w, void *data) diff --git a/src/rigcontrol/xmlrpc_rig.cxx b/src/rigcontrol/xmlrpc_rig.cxx index b32fc1a6..5704b7a7 100644 --- a/src/rigcontrol/xmlrpc_rig.cxx +++ b/src/rigcontrol/xmlrpc_rig.cxx @@ -45,8 +45,9 @@ #include "qrunner.h" #include "debug.h" #include "status.h" +#include "icons.h" -static bool XMLRPC_DEBUG = 0; +LOG_FILE_SOURCE(debug::debug::LOG_XMLRPC_RIG); using namespace XmlRpc; using namespace std; @@ -107,8 +108,7 @@ void xmlrpc_rig_set_qsy(long long rfc) wf->rfcarrier(rfc); wf->movetocenter(); show_frequency(rfc); - if (XMLRPC_DEBUG) - LOG_INFO("set qsy: %d", (int)rfc); + LOG_INFO("set qsy: %d", (int)rfc); } //====================================================================== @@ -126,29 +126,52 @@ void set_flrig_ptt(int on) { if (!connected_to_flrig) return; XmlRpcValue val, result; + int resp, res; val = int(on); guard_lock flrig_lock(&mutex_flrig); - if (flrig_client->execute("rig.set_ptt", val, result, timeout)) { - wait_ptt = true; - wait_ptt_timeout = 10; - ptt_state = on; - if (XMLRPC_DEBUG) - LOG_INFO("ptt: %s", on ? "ON" : "OFF"); - } else { - wait_ptt = false; - wait_ptt_timeout = 0; - LOG_ERROR("%s", "rig.set_vfo failed"); +// PTT on/off is critical 5 attempts with 10 verify reads per attempt + for (int i = 0; i < 5; i++) { + res = flrig_client->execute("rig.set_ptt", val, result, timeout); + if (res) { + for (int j = 0; j < 10; j++) { + MilliSleep(20); + Fl::awake(); + res = flrig_client->execute("rig.get_ptt", XmlRpcValue(), result, 10); + if (res) { + resp = (int)result; + if (resp == on) { + wait_ptt = true; + wait_ptt_timeout = 10; + ptt_state = on; + LOG_INFO("ptt %s in %d msec", + on ? "ON" : "OFF", + i*50 + (j + 1)*20); + return; + } + } + } + } + MilliSleep(50); + Fl::awake(); } + wait_ptt = false; + wait_ptt_timeout = 0; + LOG_ERROR("%s", "rig.set_ptt failed (3)"); + fl_alert2("fldigi/flrig PTT %s failure", on ? "ON" : "OFF"); return; } pthread_mutex_t mutex_flrig_ptt = PTHREAD_MUTEX_INITIALIZER; + void xmlrpc_rig_show_ptt(void *data) { guard_lock flrig_lock(&mutex_flrig_ptt); int on = reinterpret_cast(data); - if (wf) wf->xmtrcv->value(on); + if (wf) { + wf->xmtrcv->value(on); + wf->xmtrcv->do_callback(); + } } void flrig_get_ptt() @@ -161,8 +184,7 @@ void flrig_get_ptt() ptt_state = val; guard_lock flrig_lock(&mutex_flrig_ptt); Fl::awake(xmlrpc_rig_show_ptt, reinterpret_cast(val) ); - if (XMLRPC_DEBUG) - LOG_INFO("get_ptt: %s", ptt_state ? "ON" : "OFF"); + LOG_INFO("get_ptt: %s", ptt_state ? "ON" : "OFF"); } else if (wait_ptt && (val == ptt_state)) { wait_ptt = false; wait_ptt_timeout = 0; @@ -203,8 +225,7 @@ void set_flrig_freq(long int fr) wait_freq = true; wait_freq_timeout = 5; xcvr_freq = fr; - if (XMLRPC_DEBUG) - LOG_INFO("set freq: %d", (int)fr); + LOG_INFO("set freq: %d", (int)fr); } } @@ -232,8 +253,7 @@ void flrig_get_frequency() xcvr_freq = fr; guard_lock flrig_lock(&mutex_flrig_freq); Fl::awake(xmlrpc_rig_show_freq, reinterpret_cast(fr)); - if (XMLRPC_DEBUG) - LOG_INFO("get freq: %d", fr); + LOG_INFO("get freq: %d", fr); } else if (wait_freq && (fr == xcvr_freq)) { wait_freq = false; wait_freq_timeout = 0; @@ -281,7 +301,7 @@ void set_flrig_mode(const char *md) bws_posted = false; wait_mode = true; wait_mode_timeout = 5; - if (XMLRPC_DEBUG) LOG_INFO("set mode: %s", md); + LOG_INFO("set mode: %s", md); } } @@ -307,8 +327,7 @@ void flrig_get_mode() posted_mode = md; guard_lock flrig_lock(&mutex_flrig_mode); Fl::awake(xmlrpc_rig_post_mode, reinterpret_cast(&md)); - if (XMLRPC_DEBUG) - LOG_INFO("get mode: %s", md.c_str()); + LOG_INFO("get mode: %s", md.c_str()); } else if (wait_mode && posted) { wait_mode = false; wait_mode_timeout = 0; @@ -341,11 +360,8 @@ void xmlrpc_rig_post_modes(void *) return; } - for (int i = 0; i < nargs; i++) { + for (int i = 0; i < nargs; i++) qso_opMODE->add(string(modes_result[i]).c_str()); - if (XMLRPC_DEBUG) - LOG_INFO("post mode: %s", string(modes_result[i]).c_str()); -} qso_opMODE->index(0); qso_opMODE->activate(); @@ -361,8 +377,17 @@ void flrig_get_modes() guard_lock flrig_lock(&mutex_flrig_modes); Fl::awake(xmlrpc_rig_post_modes); posted_mode = posted_bw = posted_bw1 = posted_bw2 = "GETME"; - if (XMLRPC_DEBUG) - LOG_INFO("%s", "get modes"); + { + int nargs = modes_result.size(); + static string debugstr; + debugstr.assign("Mode table: "); + for (int i = 0; i < nargs - 1; i++) + debugstr.append(modes_result[i]).append(","); + debugstr.append(modes_result[nargs-1]); + LOG_INFO("%s", debugstr.c_str()); + } + } else { + LOG_ERROR("%s", "get modes failed"); } } @@ -381,8 +406,7 @@ void set_flrig_bw(int bw2, int bw1) val = ival; guard_lock flrig_lock(&mutex_flrig); - if (XMLRPC_DEBUG) - LOG_INFO("set_flrig_bw %04X", ival); + LOG_INFO("set_flrig_bw %04X", ival); if (!flrig_client->execute("rig.set_bw", val, result, timeout)) { LOG_ERROR("%s", "rig.set_bw failed"); wait_bw = false; @@ -399,8 +423,11 @@ void xmlrpc_rig_post_bw(void *) guard_lock flrig_lock(&mutex_flrig_bw); if (!qso_opBW) return; - qso_opBW->value(posted_bw.c_str()); - qso_opBW->redraw(); + if (posted_bw != (std::string)(qso_opBW->value())) { + qso_opBW->value(posted_bw.c_str()); + qso_opBW->redraw(); + LOG_INFO("Update BW %s", posted_bw.c_str()); + } } void xmlrpc_rig_post_bw1(void *) @@ -408,17 +435,22 @@ void xmlrpc_rig_post_bw1(void *) guard_lock flrig_lock(&mutex_flrig_bw); if (!qso_opBW1) return; - qso_opBW1->value(posted_bw1.c_str()); - qso_opBW1->redraw(); + if (posted_bw1 != (std::string)(qso_opBW1->value())) { + qso_opBW1->value(posted_bw1.c_str()); + qso_opBW1->redraw(); + LOG_INFO("Update combo BW1 %s", posted_bw1.c_str()); + } } void xmlrpc_rig_post_bw2(void *) { guard_lock flrig_lock(&mutex_flrig_bw); if (!qso_opBW2) return; - - qso_opBW2->value(posted_bw2.c_str()); - qso_opBW2->redraw(); + if (posted_bw2 != (std::string)(qso_opBW2->value())) { + qso_opBW2->value(posted_bw2.c_str()); + qso_opBW2->redraw(); + LOG_INFO("Update combo BW2 %s", posted_bw2.c_str()); + } } void flrig_get_bw() @@ -436,8 +468,6 @@ void flrig_get_bw() s2 = string(res[0]); s1 = string(res[1]); - if (XMLRPC_DEBUG) - LOG_INFO("s1 %s, s2 %s", s1.c_str(), s2.c_str()); if (!s1.empty()) { posted_bw1 = s1; Fl::awake(xmlrpc_rig_post_bw1); @@ -460,7 +490,6 @@ void flrig_get_bw() pthread_mutex_t mutex_flrig_bws = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_post_bws(void *) { -// guard_lock flrig_lock(&mutex_flrig_bws); if (!qso_opBW) return; int nargs; @@ -487,14 +516,13 @@ void xmlrpc_rig_post_bws(void *) qso_opBW1->index(0); qso_opBW1->redraw(); - if (XMLRPC_DEBUG) { - static string debugstr = "opBW1:\n"; - for (int i = 0; i < nargs-1; i++) + { + static string debugstr; + debugstr.assign("\nBW1 table: "); + for (int i = 1; i < nargs-1; i++) debugstr.append(string(bws_result[1][i])).append(", "); debugstr.append(string(bws_result[1][nargs - 1])).append("\n"); - debugstr.append(labels1).append("\n"); - debugstr.append("btn1 '").append(btn1_label); - debugstr.append("' tip '").append(tooltip1); + debugstr.append(labels1); LOG_INFO("%s", debugstr.c_str()); } @@ -516,18 +544,17 @@ void xmlrpc_rig_post_bws(void *) qso_btnBW2->redraw(); static char tooltip2[20]; snprintf(tooltip2,sizeof(tooltip2),"%s",labels2.substr(2).c_str()); - qso_opBW2->tooltip(tooltip1); + qso_opBW2->tooltip(tooltip2); qso_opBW2->index(0); qso_opBW2->redraw(); - if (XMLRPC_DEBUG) { - static string debugstr = "opBW2:\n"; - for (int i = 0; i < nargs-1; i++) + { + static string debugstr; + debugstr.assign("\nBW2 table: "); + for (int i = 1; i < nargs-1; i++) debugstr.append(string(bws_result[0][i])).append(", "); debugstr.append(string(bws_result[0][nargs - 1])).append("\n"); - debugstr.append(labels2).append("\n"); - debugstr.append("btn2 '").append(btn2_label); - debugstr.append("' tip '").append(tooltip2); + debugstr.append(labels2); LOG_INFO("%s", debugstr.c_str()); } @@ -554,9 +581,10 @@ void xmlrpc_rig_post_bws(void *) qso_opBW->show(); qso_opGROUP->hide(); - if (XMLRPC_DEBUG) { - static string debugstr = "BW:\n"; - for (int i = 0; i < nargs-1; i++) + { + static string debugstr; + debugstr.assign("BW table: "); + for (int i = 1; i < nargs-1; i++) debugstr.append(string(bws_result[0][i])).append(", "); debugstr.append(string(bws_result[0][nargs - 1])); LOG_INFO("%s", debugstr.c_str()); @@ -582,12 +610,9 @@ void flrig_get_bws() wait_bw = true; wait_bw_timeout = 5; posted_bw.clear(); -// guard_lock flrig_lock(&mutex_flrig_bws); Fl::awake(xmlrpc_rig_post_bws); - if (XMLRPC_DEBUG) - LOG_INFO("%s", "get bws"); } else { - LOG_ERROR("%s", "get bws failed"); + LOG_ERROR("%s", "get bws failed"); } } @@ -813,16 +838,13 @@ void flrig_setQSY(void *) void flrig_connection() { -// guard_lock flrig_lock(&mutex_flrig); XmlRpcValue noArgs, result; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); -//LOG_WARN("%s", "checking flrig listMethods"); ret = flrig_client->execute("system.listMethods", noArgs, result, timeout); } -// if (flrig_client->execute("system.listMethods", noArgs, result, timeout)) { if (ret) { int nargs = result.size(); string method_str = "\nMethods:\n"; @@ -834,12 +856,12 @@ void flrig_connection() flrig_get_xcvr(); Fl::awake(flrig_setQSY); } else { -//LOG_WARN("%s", "not able to connect"); + LOG_INFO("%s", "Waiting for flrig"); connected_to_flrig = false; - poll_interval = 1000;//500; + poll_interval = 5000; } } catch (...) { -//LOG_WARN("%s", "failure in flrig_client"); +// LOG_ERROR("%s", "failure in flrig_client"); } } @@ -851,17 +873,17 @@ void connect_to_flrig() flrig_client = (XmlRpcClient *)0; } try { -//LOG_WARN("creating flrig client %s, %d", -// progdefaults.flrig_ip_address.c_str(), -// atol(progdefaults.flrig_ip_port.c_str())); flrig_client = new XmlRpcClient( progdefaults.flrig_ip_address.c_str(), atol(progdefaults.flrig_ip_port.c_str())); + LOG_WARN("created flrig client %s, %ld", + progdefaults.flrig_ip_address.c_str(), + atol(progdefaults.flrig_ip_port.c_str())); flrig_connection(); } catch (...) { - LOG_ERROR("Cannot connect to %s, %s", - progdefaults.flrig_ip_address.c_str(), - progdefaults.flrig_ip_port.c_str()); + LOG_ERROR("Cannot create client %s, %s", + progdefaults.flrig_ip_address.c_str(), + progdefaults.flrig_ip_port.c_str()); } } From c986a766b3461e6c6f86918a585e9a718cae17a7 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 25 Nov 2015 20:39:57 -0600 Subject: [PATCH 051/138] Version 3.23.06 * Maintenance release --- ChangeLog | 25 +++++++++++++++++++++---- configure.ac | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 95554a63..08fdde1f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,11 +1,28 @@ +2015-11-26 David Freese + + 16ede08: flrig xmlrpc + + +=Version 3.23.06= + + 3f577d9: WO woes + 482d060: Smeter PWRmeter + e08e403: ARQ shutdown + +2015-11-20 John Phelps + + 0b5b329: Developer Doxygen and BerliOS clean - Cleaned and Fixed developer Doxygen files - Added GitStats to the Dev Doxygen info -- run ./scripts/doxygen/gen_doxygen_docs.sh + +2015-11-20 David Freese + + b19fff8: Documentation + 55e0d31: Compiler warnings =Version 3.23.05= -2015-11-14 David Freese - - cf7a199: dock macros - 30e6eda: kml disable + c86ec80: dock macros + 9b210f7: kml disable 2e2c9e9: ADIF record repairs 93342e4: gpio ptt d6a34a4: NAVTEX/SYNOP/KML diff --git a/configure.ac b/configure.ac index c8f8c76d..474195cf 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) m4_define(FLDIGI_MINOR, [23]) -m4_define(FLDIGI_PATCH, [.05]) +m4_define(FLDIGI_PATCH, [.06]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.5]) From 14a2618bf9606a8e6ff91ebbf0d25f3338d36779 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 3 Dec 2015 14:24:21 -0600 Subject: [PATCH 052/138] Rx SaveAs * correct Rx panel "Save text as..." end-of-line sequence --- src/widgets/FTextView.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/FTextView.cxx b/src/widgets/FTextView.cxx index e890509a..1e622f25 100644 --- a/src/widgets/FTextView.cxx +++ b/src/widgets/FTextView.cxx @@ -355,7 +355,7 @@ void FTextBase::saveFile(void) char *p1, *p2, *text = tbuf->text(); for (p1 = p2 = text; *p1; p1 = p2) { - while (*p2 != '\0' && *p2 != '\n') + while (*p2 != '\0' && *p2 != '\r') p2++; if (*p2 == '\n') { *p2 = '\0'; From 78baf6cde37b548cf7d64cd569b3a215259142e6 Mon Sep 17 00:00:00 2001 From: David Freese Date: Fri, 4 Dec 2015 13:36:44 -0600 Subject: [PATCH 053/138] Set Frequency * Added code to update waterfall when changing vfo frequency from fldigi / flrig --- src/rigcontrol/xmlrpc_rig.cxx | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/rigcontrol/xmlrpc_rig.cxx b/src/rigcontrol/xmlrpc_rig.cxx index 5704b7a7..3403e844 100644 --- a/src/rigcontrol/xmlrpc_rig.cxx +++ b/src/rigcontrol/xmlrpc_rig.cxx @@ -209,6 +209,18 @@ bool wait_freq = false; // wait for transceiver to respond int wait_freq_timeout = 5; // 5 polls and then disable wait long int xcvr_freq = 0; +pthread_mutex_t mutex_flrig_freq = PTHREAD_MUTEX_INITIALIZER; + +void xmlrpc_rig_show_freq(void * fr) +{ + guard_lock flrig_lock(&mutex_flrig_freq); + if (!wf) return; + long freq = reinterpret_cast(fr); + wf->rfcarrier(freq); + wf->movetocenter(); + show_frequency(freq); +} + void set_flrig_freq(long int fr) { if (!connected_to_flrig) return; @@ -225,21 +237,11 @@ void set_flrig_freq(long int fr) wait_freq = true; wait_freq_timeout = 5; xcvr_freq = fr; + Fl::awake(xmlrpc_rig_show_freq, reinterpret_cast(fr)); LOG_INFO("set freq: %d", (int)fr); } } -pthread_mutex_t mutex_flrig_freq = PTHREAD_MUTEX_INITIALIZER; -void xmlrpc_rig_show_freq(void * fr) -{ - guard_lock flrig_lock(&mutex_flrig_freq); - if (!wf) return; - long freq = reinterpret_cast(fr); - wf->rfcarrier(freq); - wf->movetocenter(); - show_frequency(freq); -} - void flrig_get_frequency() { guard_lock flrig_lock(&mutex_flrig); From e9e8b3650681645b8fce8d56a0bfc7ee184fd612 Mon Sep 17 00:00:00 2001 From: David Freese Date: Mon, 7 Dec 2015 11:37:27 -0600 Subject: [PATCH 054/138] Misc Updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * correct WF hesitation when processing post Tx macros * remove xmlrpc_rig ptt transition waiting from main loop * correct WF hesitation when transmitting MT63 start tones * added CTRL-nnn numeric sequence character entry to Fl_Input2 class. Allows direct entry of characters such as ñ in QSO fields, macro editor, etc. * added new menu items to FTextEdit and Fl_Input2 widgets - allow user to select UTF-8 special characters from pop-up menu (right click in widget). This effects TX text widgets and all data entry controls which use the Fl_Input2 widget. --- fldigi_doxygen/user_src_docs/Doxyfile | 3 +- .../user_src_docs/KeyboardAndKeys.txt | 10 +- .../user_src_docs/fldigi_operating.txt | 1 + fldigi_doxygen/user_src_docs/index_order.txt | 2 +- fldigi_doxygen/user_src_docs/xchar.txt | 67 +++++++++ src/include/flinput2.h | 7 + src/misc/macros.cxx | 30 ++-- src/mt63/mt63.cxx | 9 +- src/rigcontrol/xmlrpc_rig.cxx | 37 +++-- src/widgets/FTextRXTX.cxx | 89 +++++++++++ src/widgets/flinput2.cxx | 139 +++++++++++++++++- 11 files changed, 359 insertions(+), 35 deletions(-) create mode 100644 fldigi_doxygen/user_src_docs/xchar.txt diff --git a/fldigi_doxygen/user_src_docs/Doxyfile b/fldigi_doxygen/user_src_docs/Doxyfile index 756bbcc3..3a4f9007 100644 --- a/fldigi_doxygen/user_src_docs/Doxyfile +++ b/fldigi_doxygen/user_src_docs/Doxyfile @@ -63,7 +63,8 @@ INPUT = index.txt \ Multiples.txt Notifier.txt OperatingControls.txt RST-RSQ.txt \ Spotter.txt Synop.txt TransceiverControl.txt UTF8.txt \ pskmail_config.txt PskViewer.txt DXCC_list.txt \ - KeyboardAndKeys.txt KML.txt support_data.txt Installing.txt WindowsOS.txt \ + KeyboardAndKeys.txt xchar.txt \ + KML.txt support_data.txt Installing.txt WindowsOS.txt \ Wizard.txt Menus.txt ModeTable.txt CWkeying.txt \ PseudoFSK.txt w5zit-interface.txt rigxml.txt commandline.txt \ buildinfo.txt xmlrpc-control.txt parseUALR.txt ualr-telnet.txt \ diff --git a/fldigi_doxygen/user_src_docs/KeyboardAndKeys.txt b/fldigi_doxygen/user_src_docs/KeyboardAndKeys.txt index 2b84a86c..2527b8e9 100644 --- a/fldigi_doxygen/user_src_docs/KeyboardAndKeys.txt +++ b/fldigi_doxygen/user_src_docs/KeyboardAndKeys.txt @@ -94,9 +94,13 @@ fldigi text widget supports some short cuts to make your life easier: character following the last one transmitted. CW operation is slightly different, see the help for \ref cw_page . -
    • Ctrl + three digits will insert the ASCII character designated by - that entry.
    • - +
    • Extended UTF-8 characters can be entered into all text entry controls + using Ctrl + three digits. These characters can also be entered using + the right-click pop-up menu item \"Spec Char \". The extended character + transmitted by fldigi will actually be a 2 byte UTF-8 string. + + see \ref xchar_page "Extended Characters" +
    \section function_keys Function Keys diff --git a/fldigi_doxygen/user_src_docs/fldigi_operating.txt b/fldigi_doxygen/user_src_docs/fldigi_operating.txt index 2e53909e..4effd73e 100644 --- a/fldigi_doxygen/user_src_docs/fldigi_operating.txt +++ b/fldigi_doxygen/user_src_docs/fldigi_operating.txt @@ -10,6 +10,7 @@
  • \subpage fft_scan_page
  • \subpage frequency_analyzer_page
  • \subpage keyboard_operation_page
  • +
  • \subpage xchar_page
  • \subpage kml_page
  • \subpage menus_page
  • \subpage mouse_and_keyboard_shortcuts_page
  • diff --git a/fldigi_doxygen/user_src_docs/index_order.txt b/fldigi_doxygen/user_src_docs/index_order.txt index da9d19aa..21adf252 100644 --- a/fldigi_doxygen/user_src_docs/index_order.txt +++ b/fldigi_doxygen/user_src_docs/index_order.txt @@ -19,7 +19,7 @@ DigiscopeDisplay.txt DigiWWV.txt map.txt MousingKeyboardShortcuts.txt \ Multiples.txt Notifier.txt OperatingControls.txt RST-RSQ.txt \ Spotter.txt Synop.txt TransceiverControl.txt UTF8.txt \ pskmail_config.txt PskViewer.txt DXCC_list.txt \ -KeyboardAndKeys.txt KML.txt Installing.txt WindowsOS.txt \ +KeyboardAndKeys.txt xchar.txt KML.txt Installing.txt WindowsOS.txt \ Wizard.txt Menus.txt ModeTable.txt CWkeying.txt PseudoFSK.txt \ w5zit-interface.txt rigxml.txt commandline.txt \ buildinfo.txt xmlrpc-control.txt parseUALR.txt ualr-telnet.txt \ diff --git a/fldigi_doxygen/user_src_docs/xchar.txt b/fldigi_doxygen/user_src_docs/xchar.txt new file mode 100644 index 00000000..e4c87e94 --- /dev/null +++ b/fldigi_doxygen/user_src_docs/xchar.txt @@ -0,0 +1,67 @@ +/** +\page xchar_page Extended Characters + +Extended UTF-8 characters can be entered into all text entry controls +using Ctrl + three digits. These characters can also be entered using +the right-click pop-up menu item \"Spec Char \". The extended character +transmitted by fldigi will actually be a 2 byte UTF-8 string. + +
    +Extended character set +
    +
    +- |- |- |- |- |- |- |- +:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----: + 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 + iexcl | cent | pound | curren| yen | brvbar| sect | uml + ¡ | ¢ | £ | ¤ | ¥ | ¦ | § | ¨ +- |- |- |- |- |- |- |- + 169 | 170 | 171 | 172 | 173 | 174 | 176 | 177 + copy | ordf | laquo | not | shy | reg | macr | deg + © | ª | « | ¬ | | ® | ¯ | ° +- |- |- |- |- |- |- |- + 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 +plusmn | sup2 | sup3 | acute | micro | para | midot | cedil + ± | ² | ³ | ´ | µ | ¶ | · | ¸ +- |- |- |- |- |- |- |- + 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 + sup1 | ordm | raquo |frac14 |frac12 |frac34 |iquest |Agrave + ¹ | º | » | ¼ | ½ | ¾ | ¿ | À +- |- |- |- |- |- |- |- + 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 + Acute | Acirc |Atilde | Auml | Aring | AElig |Ccedil |Egrave + Á | Â | Ã | Ä | Å | Æ | Ç | È +- |- |- |- |- |- |- |- + 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 +Eacute | Ecirc | Euml |Igrave |Iacute | Icirc | Iuml | ETH + É | Ê | Ë | Ì | Í | Î | Ï | Ð +- |- |- |- |- |- |- |- + 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 +Ntilde |Ograve |Oacute |Ocirc |Otilde | Ouml | times |Oslash + Ñ | Ò | Ó | Ô | Õ | Ö | × | Ø +- |- |- |- |- |- |- |- + 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 +Ugrave |Uacute | Ucirc | Uuml |Yacute | THORN | szlig |agrave + Ù | Ú | Û | Ü | Ý | Þ | ß | à +- |- |- |- |- |- |- |- + 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 +aacute | acirc |atilde | auml | aring | aelig |ccedil |egrave + á | â | ã | ä | å | æ | ç | è +- |- |- |- |- |- |- |- + 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 +eacute |ecirc | euml |igrave |iacute | icirc | iuml | eth + é | ê | ë | ì | í | î | ï | ð +- |- |- |- |- |- |- |- + 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 +ntilde |ograve |oacute | ocirc |otilde | ouml |divide |oslash + ñ | ò | ó | ô | õ | ö | ÷ | ø +- |- |- |- |- |- |- |- + 249 | 250 | 251 | 252 | 253 | 254 | 255 | - +ugrave |uacute | ucirc | uuml |yacute | thorn | yuml | - + ù | ú | û | ü | ý | þ | ÿ | - +
    + +\ref xchar_page "Return to Top of Page" +
    +\ref main_page "Return to Main Page" +*/ diff --git a/src/include/flinput2.h b/src/include/flinput2.h index 9e2234c4..f68fb733 100644 --- a/src/include/flinput2.h +++ b/src/include/flinput2.h @@ -25,6 +25,13 @@ class Fl_Input2 : public Fl_Input { +private: + int ascii_cnt; // restart the numeric keypad entries. + int ascii_chr; // character value of ASCII > 0x80 + int handle_key_ascii(int key); + char *utf8text; + int utf8cnt; + public: Fl_Input2(int x, int y, int w, int h, const char* l = 0); int handle(int event); diff --git a/src/misc/macros.cxx b/src/misc/macros.cxx index b8c4709c..8e3cdf59 100644 --- a/src/misc/macros.cxx +++ b/src/misc/macros.cxx @@ -3085,21 +3085,22 @@ bool queue_must_rx() // occurs immediately after the ^r execution // AND after TX_STATE returns to Rx // ^r is the control string substitute for the macro tag -void Rx_queue_execute() +int time_out = 400; +void Rx_queue_execution(void *) { - if (Rx_cmds.empty()) return; - - int time_out = 100; // force return after ten seconds - while (trx_state != STATE_RX && time_out) { - time_out--; - Fl::awake(); - MilliSleep(100); - } - if (!time_out) { - while (!Rx_cmds.empty()) Rx_cmds.pop(); + if (trx_state != STATE_RX) { + if (time_out-- == 0) { + while (!Rx_cmds.empty()) Rx_cmds.pop(); + LOG_ERROR("%s", "failed"); + time_out = 200; + return; + } + Fl::repeat_timeout( .050, Rx_queue_execution ); return; } + LOG_INFO("action delayed by %4.2f seconds", (400 - time_out)*.050); + time_out = 400; CMDS cmd; while (!Rx_cmds.empty()) { cmd = Rx_cmds.front(); @@ -3109,11 +3110,18 @@ void Rx_queue_execute() cmd.cmd.erase(0,2); cmd.cmd.insert(0,"DataInterleave; i++) { diff --git a/src/rigcontrol/xmlrpc_rig.cxx b/src/rigcontrol/xmlrpc_rig.cxx index 3403e844..ca70a842 100644 --- a/src/rigcontrol/xmlrpc_rig.cxx +++ b/src/rigcontrol/xmlrpc_rig.cxx @@ -122,46 +122,53 @@ bool wait_ptt = false; // wait for transceiver to respond int wait_ptt_timeout = 5; // 5 polls and then disable wait int ptt_state = 0; -void set_flrig_ptt(int on) { - if (!connected_to_flrig) return; +int new_ptt = -1; + +void exec_flrig_ptt() { + if (!connected_to_flrig) { + new_ptt = -1; + return; + } XmlRpcValue val, result; int resp, res; - val = int(on); - guard_lock flrig_lock(&mutex_flrig); // PTT on/off is critical 5 attempts with 10 verify reads per attempt for (int i = 0; i < 5; i++) { - res = flrig_client->execute("rig.set_ptt", val, result, timeout); + res = flrig_client->execute("rig.set_ptt", new_ptt, result, timeout); if (res) { for (int j = 0; j < 10; j++) { MilliSleep(20); - Fl::awake(); res = flrig_client->execute("rig.get_ptt", XmlRpcValue(), result, 10); if (res) { resp = (int)result; - if (resp == on) { + if (resp == new_ptt) { wait_ptt = true; wait_ptt_timeout = 10; - ptt_state = on; + ptt_state = new_ptt; LOG_INFO("ptt %s in %d msec", - on ? "ON" : "OFF", + ptt_state ? "ON" : "OFF", i*50 + (j + 1)*20); + new_ptt = -1; return; } } } } - MilliSleep(50); - Fl::awake(); } wait_ptt = false; wait_ptt_timeout = 0; LOG_ERROR("%s", "rig.set_ptt failed (3)"); - fl_alert2("fldigi/flrig PTT %s failure", on ? "ON" : "OFF"); + fl_alert2("fldigi/flrig PTT %s failure", new_ptt ? "ON" : "OFF"); + new_ptt = -1; return; } +void set_flrig_ptt(int on) { + guard_lock flrig_lock(&mutex_flrig); + new_ptt = on; +} + pthread_mutex_t mutex_flrig_ptt = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_show_ptt(void *data) @@ -858,7 +865,7 @@ void flrig_connection() flrig_get_xcvr(); Fl::awake(flrig_setQSY); } else { - LOG_INFO("%s", "Waiting for flrig"); + LOG_VERBOSE("%s", "Waiting for flrig"); connected_to_flrig = false; poll_interval = 5000; } @@ -900,6 +907,10 @@ void * flrig_thread_loop(void *d) connect_to_flrig(); if (!connected_to_flrig) flrig_connection(); else if (flrig_get_xcvr()) { + if (new_ptt > -1) { + exec_flrig_ptt(); + continue; + } flrig_get_ptt(); if (trx_state == STATE_RX) { flrig_get_frequency(); diff --git a/src/widgets/FTextRXTX.cxx b/src/widgets/FTextRXTX.cxx index b74d523f..373f4366 100644 --- a/src/widgets/FTextRXTX.cxx +++ b/src/widgets/FTextRXTX.cxx @@ -772,6 +772,92 @@ Fl_Menu_Item FTextTX::menu[] = { { 0 }, // EDIT_MENU_READ { 0 }, // EDIT_MENU_WRAP + { _("Spec Char"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "¢ - cent", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "£ - pound", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "µ - micro", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "° - degree", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "¿ - iques", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "× - times", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "÷ - divide", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { _("A"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "À - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "à - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("E"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "È - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "è - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "É - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "é - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("I"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("N"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("O"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("U"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("Y"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ÿ - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("Other"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "ß - szlig", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Þ - thorn", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0}, { 0 } }; @@ -1310,6 +1396,9 @@ void FTextTX::menu_cb(size_t item) case TX_MENU_WRAP: set_word_wrap(!wrap, true); break; + default: + if (FTextTX::menu[item].flags == 0) // not an FL_SUB_MENU + add(FTextTX::menu[item].text[0]); add(FTextTX::menu[item].text[1]); } } diff --git a/src/widgets/flinput2.cxx b/src/widgets/flinput2.cxx index 35cf9135..94f125e7 100644 --- a/src/widgets/flinput2.cxx +++ b/src/widgets/flinput2.cxx @@ -34,6 +34,7 @@ #include "icons.h" #include "flinput2.h" #include "gettext.h" +#include "debug.h" enum { OP_UNDO, OP_CUT, OP_COPY, OP_PASTE, OP_DELETE, OP_CLEAR, OP_SELECT_ALL }; @@ -46,11 +47,96 @@ static Fl_Menu_Item cmenu[] = { { icons::make_icon_label(_("Delete"), trash_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Select All"), edit_select_all_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, - { 0 } + { _("Spec Char"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "¢ - cent", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "£ - pound", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "µ - micro", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "° - degree", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "¿ - iques", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "× - times", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "÷ - divide", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { _("A"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "À - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "à - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("E"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "È - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "è - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "É - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "é - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("I"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("N"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("O"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("U"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("Y"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ÿ - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("Other"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "ß - szlig", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Þ - thorn", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0} }; static bool cmenu_init = false; - Fl_Input2::Fl_Input2(int x, int y, int w, int h, const char* l) : Fl_Input(x, y, w, h, l) { @@ -60,13 +146,60 @@ Fl_Input2::Fl_Input2(int x, int y, int w, int h, const char* l) icons::set_icon_label(&cmenu[i]); cmenu_init = true; } + ascii_cnt = 0; // restart the numeric keypad entries. + ascii_chr = 0; + utf8text = NULL; } +//---------------------------------------------------------------------- +/// Composes ascii characters and adds them to the Fl_Input2 buffer. +/// Control characters are inserted with the CTRL style. Values larger than 127 +/// (0x7f) are ignored. We cannot really add NULs for the time being. +/// +/// @param key A digit character +/// +/// @return 1 +/// +int Fl_Input2::handle_key_ascii(int key) +{ + if (key >= FL_KP) key -= FL_KP; + key -= '0'; + ascii_cnt++; + ascii_chr *= 10; + ascii_chr += key; + if (ascii_cnt == 3) { + if (ascii_chr < 0x100) { + utf8text = new char[fl_utf8bytes(ascii_chr) + 1]; + utf8cnt = fl_utf8encode(ascii_chr, utf8text); + return 1; + } + ascii_cnt = ascii_chr = 0; + } + + return 0; +} + +//---------------------------------------------------------------------- int Fl_Input2::handle(int event) { switch (event) { case FL_KEYBOARD: { int b = Fl::event_key(); + + if ((Fl::event_state() & FL_CTRL) && (isdigit(b) || isdigit(b - FL_KP))) { + if (handle_key_ascii(b)) { + if (utf8text) { + insert(utf8text, utf8cnt); + delete utf8text; + } + ascii_cnt = 0; + ascii_chr = 0; + } + return 1; + } + ascii_cnt = 0; + ascii_chr = 0; + int p = position(); // stop the move-to-next-field madness, we have Tab for that! if (unlikely((b == FL_Left && p == 0) || (b == FL_Right && p == size()) || @@ -176,6 +309,8 @@ int Fl_Input2::handle(int event) case OP_SELECT_ALL: position(0, size()); break; + default: + insert(m->text, 1); } return 1; From 2652387036d55b368b2f56ffe01b5d217d7e9eb9 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 20 Dec 2015 07:27:35 -0600 Subject: [PATCH 055/138] Log Notes * Added control for user selection of clearing/retaining data in notes field after remote database query. --- src/dialogs/confdialog.cxx | 46 ++++++++++++++++++++++----------- src/dialogs/confdialog.fl | 51 ++++++++++++++++++++++--------------- src/include/confdialog.h | 1 + src/include/configuration.h | 3 +++ src/logbook/lookupcall.cxx | 16 +++++++++--- 5 files changed, 78 insertions(+), 39 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index eda2728c..51ee4b29 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -5198,6 +5198,13 @@ static void cb_btn_notes_address(Fl_Check_Button* o, void*) { progdefaults.changed = true; } +Fl_Check_Button *btn_clear_notes=(Fl_Check_Button *)0; + +static void cb_btn_clear_notes(Fl_Check_Button* o, void*) { + progdefaults.clear_notes = o->value(); +progdefaults.changed= true; +} + Fl_Input2 *inpEQSL_id=(Fl_Input2 *)0; static void cb_inpEQSL_id(Fl_Input2* o, void*) { @@ -5871,7 +5878,6 @@ Fl_Double_Window* ConfigureDialog() { tabsUI->selection_color(FL_LIGHT1); { tabBrowser = new Fl_Group(0, 50, 600, 330, _("Browser")); tabBrowser->tooltip(_("User Interface - Browser")); - tabBrowser->hide(); { Fl_Group* o = new Fl_Group(30, 65, 540, 300); o->box(FL_ENGRAVED_FRAME); { Fl_Spinner2* o = cntChannels = new Fl_Spinner2(46, 75, 50, 24, _("Channels, first channel starts at waterfall lower limit")); @@ -6627,6 +6633,7 @@ ab and newline are automatically included.")); } // Fl_Group* tabWF_UI { tabColorsFonts = new Fl_Group(0, 50, 600, 330, _("Clrs/Fnts")); tabColorsFonts->tooltip(_("User Interface - Colors / Fonts")); + tabColorsFonts->hide(); { tabsColors = new Fl_Tabs(0, 55, 600, 325); { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Rx/Tx")); { Fl_ListBox* o = listbox_charset_status = new Fl_ListBox(96, 85, 165, 24, _("Rx/Tx Character set")); @@ -11099,8 +11106,7 @@ and restarted if needed.")); tabQRZ->hide(); { tabsQRZ = new Fl_Tabs(0, 25, 600, 355); { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Call Lookup")); - o->hide(); - { Fl_Group* o = new Fl_Group(55, 56, 490, 122, _("Web Browser lookup")); + { Fl_Group* o = new Fl_Group(34, 56, 538, 122, _("Web Browser lookup")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btnQRZWEBnotavailable = new Fl_Round_Button(77, 82, 337, 20, _("None")); @@ -11130,7 +11136,7 @@ and restarted if needed.")); } // Fl_Round_Button* btnHamQTHonline o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(55, 180, 490, 190, _("Data base lookup")); + { Fl_Group* o = new Fl_Group(34, 180, 538, 195, _("Data base lookup")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btnQRZXMLnotavailable = new Fl_Round_Button(77, 203, 64, 20, _("None")); @@ -11140,37 +11146,37 @@ and restarted if needed.")); btnQRZXMLnotavailable->callback((Fl_Callback*)cb_btnQRZXMLnotavailable); o->value(progdefaults.QRZXML == QRZXMLNONE); } // Fl_Round_Button* btnQRZXMLnotavailable - { Fl_Round_Button* o = btnQRZcdrom = new Fl_Round_Button(77, 231, 70, 20, _("QRZ cdrom")); + { Fl_Round_Button* o = btnQRZcdrom = new Fl_Round_Button(77, 238, 70, 20, _("QRZ cdrom")); btnQRZcdrom->tooltip(_("Use CD or hard drive CD image")); btnQRZcdrom->down_box(FL_DOWN_BOX); btnQRZcdrom->callback((Fl_Callback*)cb_btnQRZcdrom); o->value(progdefaults.QRZXML == QRZCD); } // Fl_Round_Button* btnQRZcdrom - { Fl_Round_Button* o = btnQRZsub = new Fl_Round_Button(77, 259, 125, 20, _("QRZ.com")); + { Fl_Round_Button* o = btnQRZsub = new Fl_Round_Button(77, 266, 126, 20, _("QRZ.com")); btnQRZsub->tooltip(_("You need a paid QRZ online\nsubscription to access")); btnQRZsub->down_box(FL_DOWN_BOX); btnQRZsub->callback((Fl_Callback*)cb_btnQRZsub); o->value(progdefaults.QRZXML == QRZNET); } // Fl_Round_Button* btnQRZsub - { Fl_Round_Button* o = btnHamcall = new Fl_Round_Button(77, 285, 125, 20, _("Hamcall.net")); + { Fl_Round_Button* o = btnHamcall = new Fl_Round_Button(77, 292, 126, 20, _("Hamcall.net")); btnHamcall->tooltip(_("You need a paid Hamcall online\nsubscription to access")); btnHamcall->down_box(FL_DOWN_BOX); btnHamcall->callback((Fl_Callback*)cb_btnHamcall); o->value(progdefaults.QRZXML == HAMCALLNET); } // Fl_Round_Button* btnHamcall - { Fl_Round_Button* o = btnHamQTH = new Fl_Round_Button(77, 311, 125, 20, _("HamQTH.com (free service http://www.hamqth.com)")); + { Fl_Round_Button* o = btnHamQTH = new Fl_Round_Button(77, 318, 126, 20, _("HamQTH.com (free service http://www.hamqth.com)")); btnHamQTH->tooltip(_("Free service courtesy of OK")); btnHamQTH->down_box(FL_DOWN_BOX); btnHamQTH->callback((Fl_Callback*)cb_btnHamQTH); o->value(progdefaults.QRZXML == HAMQTH); } // Fl_Round_Button* btnHamQTH - { Fl_Round_Button* o = btnCALLOOK = new Fl_Round_Button(77, 338, 125, 20, _("Callook.info lookup (free service US callsigns only)")); + { Fl_Round_Button* o = btnCALLOOK = new Fl_Round_Button(77, 345, 126, 20, _("Callook.info lookup (free service US callsigns only)")); btnCALLOOK->tooltip(_("Visit Hamcall web site")); btnCALLOOK->down_box(FL_DOWN_BOX); btnCALLOOK->callback((Fl_Callback*)cb_btnCALLOOK); o->value(progdefaults.QRZXML == CALLOOK); } // Fl_Round_Button* btnCALLOOK - { Fl_Input2* o = txtQRZpathname = new Fl_Input2(202, 230, 300, 22, _("at:")); + { Fl_Input2* o = txtQRZpathname = new Fl_Input2(203, 237, 301, 22, _("at:")); txtQRZpathname->tooltip(_("ie: /home/dave/CALLBK/ or C:/CALLBK/\nLeave blank to search for database")); txtQRZpathname->box(FL_DOWN_BOX); txtQRZpathname->color(FL_BACKGROUND2_COLOR); @@ -11185,7 +11191,7 @@ and restarted if needed.")); o->value(progdefaults.QRZpathname.c_str()); txtQRZpathname->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* txtQRZpathname - { Fl_Input2* o = inpQRZusername = new Fl_Input2(285, 258, 150, 22, _("User name")); + { Fl_Input2* o = inpQRZusername = new Fl_Input2(286, 265, 150, 22, _("User name")); inpQRZusername->tooltip(_("Your login name")); inpQRZusername->box(FL_DOWN_BOX); inpQRZusername->color(FL_BACKGROUND2_COLOR); @@ -11200,7 +11206,7 @@ and restarted if needed.")); o->value(progdefaults.QRZusername.c_str()); inpQRZusername->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpQRZusername - { Fl_Input2* o = inpQRZuserpassword = new Fl_Input2(285, 284, 150, 22, _("Password")); + { Fl_Input2* o = inpQRZuserpassword = new Fl_Input2(286, 291, 150, 22, _("Password")); inpQRZuserpassword->tooltip(_("Your login password")); inpQRZuserpassword->box(FL_DOWN_BOX); inpQRZuserpassword->color(FL_BACKGROUND2_COLOR); @@ -11216,20 +11222,30 @@ and restarted if needed.")); o->type(FL_SECRET_INPUT); inpQRZuserpassword->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpQRZuserpassword - { btnQRZpasswordShow = new Fl_Button(445, 285, 70, 20, _("Show")); + { btnQRZpasswordShow = new Fl_Button(447, 292, 70, 20, _("Show")); btnQRZpasswordShow->tooltip(_("Show password in plain text")); btnQRZpasswordShow->callback((Fl_Callback*)cb_btnQRZpasswordShow); } // Fl_Button* btnQRZpasswordShow - { Fl_Check_Button* o = btn_notes_address = new Fl_Check_Button(202, 205, 207, 15, _("Add address to notes field")); + { Fl_Group* o = new Fl_Group(195, 203, 371, 27); + o->box(FL_ENGRAVED_FRAME); + { Fl_Check_Button* o = btn_notes_address = new Fl_Check_Button(207, 210, 207, 15, _("Add address to notes field")); btn_notes_address->down_box(FL_DOWN_BOX); btn_notes_address->callback((Fl_Callback*)cb_btn_notes_address); o->value(progdefaults.notes_address); - } // Fl_Check_Button* btn_notes_address + } // Fl_Check_Button* btn_notes_address + { Fl_Check_Button* o = btn_clear_notes = new Fl_Check_Button(434, 210, 122, 15, _("clear old data")); + btn_clear_notes->down_box(FL_DOWN_BOX); + btn_clear_notes->callback((Fl_Callback*)cb_btn_clear_notes); + o->value(progdefaults.clear_notes); + } // Fl_Check_Button* btn_clear_notes + o->end(); + } // Fl_Group* o o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("eQSL")); + o->hide(); { Fl_Input2* o = inpEQSL_id = new Fl_Input2(225, 58, 150, 20, _("User ID")); inpEQSL_id->tooltip(_("Your login name")); inpEQSL_id->box(FL_DOWN_BOX); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 762785f9..7503566d 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -464,7 +464,7 @@ progdefaults.changed = true;} } { Fl_Group tabBrowser { label Browser - tooltip {User Interface - Browser} xywh {0 50 600 330} hide + tooltip {User Interface - Browser} xywh {0 50 600 330} } { Fl_Group {} {open xywh {30 65 540 300} box ENGRAVED_FRAME @@ -1354,7 +1354,7 @@ WF_UI();} } Fl_Group tabColorsFonts { label {Clrs/Fnts} open - tooltip {User Interface - Colors / Fonts} xywh {0 50 600 330} + tooltip {User Interface - Colors / Fonts} xywh {0 50 600 330} hide } { Fl_Tabs tabsColors {open xywh {0 55 600 325} @@ -6347,11 +6347,11 @@ if (progdefaults.kml_enabled) { } { Fl_Group {} { label {Call Lookup} open - xywh {0 50 600 330} hide + xywh {0 50 600 330} } { Fl_Group {} { label {Web Browser lookup} open - xywh {55 56 490 122} box ENGRAVED_FRAME align 21 + xywh {34 56 538 122} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnQRZWEBnotavailable { label None @@ -6388,7 +6388,7 @@ progdefaults.changed = true;} } Fl_Group {} { label {Data base lookup} open - xywh {55 180 490 190} box ENGRAVED_FRAME align 21 + xywh {34 180 538 195} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnQRZXMLnotavailable { label None @@ -6403,7 +6403,7 @@ progdefaults.changed = true;} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = QRZCD; progdefaults.changed = true;} - tooltip {Use CD or hard drive CD image} xywh {77 231 70 20} down_box DOWN_BOX + tooltip {Use CD or hard drive CD image} xywh {77 238 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == QRZCD);} } Fl_Round_Button btnQRZsub { @@ -6412,7 +6412,7 @@ progdefaults.changed = true;} progdefaults.QRZXML = QRZNET; progdefaults.changed = true;} tooltip {You need a paid QRZ online -subscription to access} xywh {77 259 125 20} down_box DOWN_BOX +subscription to access} xywh {77 266 126 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == QRZNET);} } Fl_Round_Button btnHamcall { @@ -6421,7 +6421,7 @@ subscription to access} xywh {77 259 125 20} down_box DOWN_BOX progdefaults.QRZXML = HAMCALLNET; progdefaults.changed = true;} tooltip {You need a paid Hamcall online -subscription to access} xywh {77 285 125 20} down_box DOWN_BOX +subscription to access} xywh {77 292 126 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == HAMCALLNET);} } Fl_Round_Button btnHamQTH { @@ -6429,7 +6429,7 @@ subscription to access} xywh {77 285 125 20} down_box DOWN_BOX callback {set_qrzxml_buttons(o); progdefaults.QRZXML = HAMQTH; progdefaults.changed = true;} - tooltip {Free service courtesy of OK} xywh {77 311 125 20} down_box DOWN_BOX + tooltip {Free service courtesy of OK} xywh {77 318 126 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == HAMQTH);} } Fl_Round_Button btnCALLOOK { @@ -6437,7 +6437,7 @@ progdefaults.changed = true;} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = CALLOOK; progdefaults.changed = true;} - tooltip {Visit Hamcall web site} xywh {77 338 125 20} down_box DOWN_BOX + tooltip {Visit Hamcall web site} xywh {77 345 126 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == CALLOOK);} } Fl_Input txtQRZpathname { @@ -6446,7 +6446,7 @@ progdefaults.changed = true;} progdefaults.QRZchanged = true; progdefaults.changed = true;} tooltip {ie: /home/dave/CALLBK/ or C:/CALLBK/ -Leave blank to search for database} xywh {202 230 300 22} +Leave blank to search for database} xywh {203 237 301 22} code0 {o->value(progdefaults.QRZpathname.c_str());} code1 {txtQRZpathname->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 @@ -6455,7 +6455,7 @@ Leave blank to search for database} xywh {202 230 300 22} label {User name} callback {progdefaults.QRZusername = o->value(); progdefaults.changed = true;} - tooltip {Your login name} xywh {285 258 150 22} + tooltip {Your login name} xywh {286 265 150 22} code0 {o->value(progdefaults.QRZusername.c_str());} code1 {inpQRZusername->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 @@ -6464,7 +6464,7 @@ progdefaults.changed = true;} label Password callback {progdefaults.QRZuserpassword = o->value(); progdefaults.changed = true;} - tooltip {Your login password} xywh {285 284 150 22} + tooltip {Your login password} xywh {286 291 150 22} code0 {o->value(progdefaults.QRZuserpassword.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {inpQRZuserpassword->labelsize(FL_NORMAL_SIZE);} @@ -6475,20 +6475,31 @@ progdefaults.changed = true;} callback {inpQRZuserpassword->type(inpQRZuserpassword->type() ^ FL_SECRET_INPUT); inpQRZuserpassword->redraw(); o->label((inpQRZuserpassword->type() & FL_SECRET_INPUT) ? "Show" : "Hide");} - tooltip {Show password in plain text} xywh {445 285 70 20} + tooltip {Show password in plain text} xywh {447 292 70 20} } - Fl_Check_Button btn_notes_address { - label {Add address to notes field} - callback {progdefaults.notes_address = o->value(); + Fl_Group {} {open + xywh {195 203 371 27} box ENGRAVED_FRAME + } { + Fl_Check_Button btn_notes_address { + label {Add address to notes field} + callback {progdefaults.notes_address = o->value(); progdefaults.changed = true;} - xywh {202 205 207 15} down_box DOWN_BOX - code0 {o->value(progdefaults.notes_address);} + xywh {207 210 207 15} down_box DOWN_BOX + code0 {o->value(progdefaults.notes_address);} + } + Fl_Check_Button btn_clear_notes { + label {clear old data} + callback {progdefaults.clear_notes = o->value(); +progdefaults.changed= true;} + xywh {434 210 122 15} down_box DOWN_BOX + code0 {o->value(progdefaults.clear_notes);} + } } } } Fl_Group {} { label eQSL open - xywh {0 50 600 330} + xywh {0 50 600 330} hide } { Fl_Input inpEQSL_id { label {User ID} diff --git a/src/include/confdialog.h b/src/include/confdialog.h index 8208d562..726b26c6 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -639,6 +639,7 @@ extern Fl_Input2 *inpQRZusername; extern Fl_Input2 *inpQRZuserpassword; extern Fl_Button *btnQRZpasswordShow; extern Fl_Check_Button *btn_notes_address; +extern Fl_Check_Button *btn_clear_notes; extern Fl_Input2 *inpEQSL_id; extern Fl_Input2 *inpEQSL_pwd; extern Fl_Button *btnEQSL_pwd_show; diff --git a/src/include/configuration.h b/src/include/configuration.h index 60b0c832..1a96b937 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -914,6 +914,9 @@ ELEM_(bool, notes_address, "NOTES_ADDRESS", \ "Populate logbook notes (comment) field with mailing address", \ false) \ + ELEM_(bool, clear_notes, "CLEAR_NOTES", \ + "Clear notes control when making a new QRZ query", \ + true) \ ELEM_(bool, QRZchanged, "", "", false) \ /* eQSL */ \ ELEM_(std::string, eqsl_id, "EQSL_ID", \ diff --git a/src/logbook/lookupcall.cxx b/src/logbook/lookupcall.cxx index faa5b278..306702b0 100644 --- a/src/logbook/lookupcall.cxx +++ b/src/logbook/lookupcall.cxx @@ -440,7 +440,9 @@ void QRZ_CD_query() srch[i] = toupper(srch[i]); string notes; - notes.assign(inpNotes->value()); + if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); + else notes.clear(); + if( qCall->FindRecord( srch ) == 1) { lookup_fname = qCall->GetFname(); camel_case(lookup_fname); @@ -530,7 +532,9 @@ void QRZAlert() qrzerror.clear(); } string notes; - notes.assign(inpNotes->value()); + if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); + else notes.clear(); + if (!qrznote.empty()) notes.append("\n").append(qrznote); inpNotes->value(notes.c_str()); } @@ -580,7 +584,9 @@ void QRZquery() } string notes; - notes.assign(inpNotes->value()); + if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); + else notes.clear(); + if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_fname).append(" ").append(lookup_name).append("\n"); @@ -653,7 +659,9 @@ void parse_callook(string& xmlpage) } string notes; - notes.assign(inpNotes->value()); + if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); + else notes.clear(); + if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_name).append("\n"); From 94f83626f9fd6e7e0e2c38559db844d9635e7987 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sat, 2 Jan 2016 07:24:09 -0600 Subject: [PATCH 056/138] XmlRpc client update * Corrected passing hi/lo cutoff values for supported transceivers such as the TS2000. * Added macro tags which make flrig requests to respectively set the lo-cut and hi-cut transceiver DSP filter settings. * Added get_sideband xmlrpc call to modified flrig --- src/include/rigsupport.h | 21 +---- src/misc/macroedit.cxx | 2 + src/misc/macros.cxx | 156 ++++++++++++++++++++++++++++++---- src/rigcontrol/rigio.cxx | 2 + src/rigcontrol/rigsupport.cxx | 2 + src/rigcontrol/xmlrpc_rig.cxx | 98 ++++++++++++--------- 6 files changed, 206 insertions(+), 75 deletions(-) diff --git a/src/include/rigsupport.h b/src/include/rigsupport.h index 82ed8ff5..eaf0b972 100644 --- a/src/include/rigsupport.h +++ b/src/include/rigsupport.h @@ -80,24 +80,8 @@ extern std::string modeString(rmode_t m); extern bool connected_to_flrig; extern void xmlrpc_rig_set_qsy(long long rfc); -using namespace XmlRpc; -using namespace std; - -extern bool bws_posted; -extern bool FLRIG_bw_posted; -extern bool FLRIG_mode_posted; -extern bool modes_posted; -extern bool FLRIG_freq_posted; - -extern long int FLRIG_xcvr_freq; -extern string xcvr_name; -extern string posted_mode; -extern string posted_bw1; -extern string posted_bw2; - -extern XmlRpcValue modes_result; -extern XmlRpcValue bws_result; -extern XmlRpcValue FLRIG_bw_result; +//using namespace XmlRpc; +//using namespace std; extern void FLRIG_start_flrig_thread(); extern void stop_flrig_thread(); @@ -107,6 +91,7 @@ extern void set_flrig_freq(long int fr); extern void set_flrig_mode(const char *md); extern void set_flrig_bw(int bw1, int bw2 = 0); extern void set_flrig_notch(); +extern bool xmlrpc_USB(); extern void FLRIG_set_flrig_ab(int n); diff --git a/src/misc/macroedit.cxx b/src/misc/macroedit.cxx index e6937008..2c3512a5 100644 --- a/src/misc/macroedit.cxx +++ b/src/misc/macroedit.cxx @@ -150,6 +150,8 @@ void loadBrowser(Fl_Widget *widget) { w->add(_("\tincr/decr xcvr freq")); w->add(_("\tvalid xcvr mode")); w->add(_("\tvalid xcvr filter width")); + w->add(_("\tvalid xcvr low cutoff filter")); + w->add(_("\tvalid xcvr hi cutoff filter")); w->add(_("\trig freq has kbd focus")); w->add(LINE_SEP); diff --git a/src/misc/macros.cxx b/src/misc/macros.cxx index 8e3cdf59..6421bb2b 100644 --- a/src/misc/macros.cxx +++ b/src/misc/macros.cxx @@ -2549,13 +2549,55 @@ static void pTxQueQSY(std::string &s, size_t &i, size_t endbracket) s.replace(i, endbracket - i + 1, "^!"); } -float waitFILWID = 0.0; +float wait_after_mode_change = 0.0; static string sFILWID; static void delayedFILWID(void *) { qso_opBW->value(sFILWID.c_str()); cb_qso_opBW(); - waitFILWID = 0.0; + wait_after_mode_change = 0.0; +} + +static void pFILWID(std::string& s, size_t& i, size_t endbracket) +{ + if (within_exec) { + s.replace(i, endbracket - i + 1, ""); + return; + } + std::string sWidth = s.substr(i+8, endbracket - i - 8); + sFILWID = sWidth; + Fl::add_timeout(wait_after_mode_change, delayedFILWID); + s.replace(i, endbracket - i + 1, ""); +} + +static void doFILWID(std::string s) +{ + std::string sWID = s.substr(9, s.length() - 10); + qso_opBW->value(sWID.c_str()); + cb_qso_opBW(); + que_ok = true; +} + +static void pTxQueFILWID(std::string &s, size_t &i, size_t endbracket) +{ + if (within_exec) { + s.replace(i, endbracket - i + 1, ""); + return; + } + struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFILWID }; + push_txcmd(cmd); + s.replace(i, endbracket - i + 1, "^!"); +} + +static void pRxQueFILWID(std::string &s, size_t &i, size_t endbracket) +{ + if (within_exec) { + s.replace(i, endbracket - i + 1, ""); + return; + } + struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFILWID }; + push_rxcmd(cmd); + s.replace(i, endbracket - i + 1, ""); } static void pRIGMODE(std::string& s, size_t& i, size_t endbracket) @@ -2568,8 +2610,12 @@ static void pRIGMODE(std::string& s, size_t& i, size_t endbracket) qso_opMODE->value(sMode.c_str()); cb_qso_opMODE(); s.replace(i, endbracket - i + 1, ""); - if (s.find("FILWID") != string::npos) - waitFILWID = progdefaults.mbw; + if ((s.find("FILWID") != string::npos) || + (s.find("RIGLO") != string::npos) || + (s.find("RIGHI") != string::npos) ) + wait_after_mode_change = progdefaults.mbw; + else + wait_after_mode_change = 0; } static void doRIGMODE(std::string s) @@ -2602,46 +2648,114 @@ static void pRxQueRIGMODE(std::string &s, size_t &i, size_t endbracket) s.replace(i, endbracket - i + 1, ""); } -static void pFILWID(std::string& s, size_t& i, size_t endbracket) +static string sRIGLO; + +static void delayedRIGLO(void *) +{ + qso_opBW2->value(sRIGLO.c_str()); + cb_qso_opBW2(); + wait_after_mode_change = 0.0; +} + +static void pRIGLO(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } - std::string sWidth = s.substr(i+8, endbracket - i - 8); -// qso_opBW->value(sWidth.c_str()); -// cb_qso_opBW(); - sFILWID = sWidth; - Fl::add_timeout(waitFILWID, delayedFILWID); + std::string sLO = s.substr(i+7, endbracket - i - 7); + sRIGLO = sLO; + if (wait_after_mode_change) + Fl::add_timeout(wait_after_mode_change, delayedRIGLO); + else { + qso_opBW2->value(sLO.c_str()); + cb_qso_opBW2(); + } s.replace(i, endbracket - i + 1, ""); } -static void doFILWID(std::string s) +static void doRIGLO(std::string s) { - std::string sWID = s.substr(9, s.length() - 10); - qso_opBW->value(sWID.c_str()); - cb_qso_opBW(); + std::string sLO = s.substr(8, s.length() - 9); + qso_opBW2->value(sLO.c_str()); + cb_qso_opBW2(); que_ok = true; } -static void pTxQueFILWID(std::string &s, size_t &i, size_t endbracket) +static void pTxQueRIGLO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } - struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFILWID }; + struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGLO }; push_txcmd(cmd); s.replace(i, endbracket - i + 1, "^!"); } -static void pRxQueFILWID(std::string &s, size_t &i, size_t endbracket) +static void pRxQueRIGLO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } - struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFILWID }; + struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGLO }; + push_rxcmd(cmd); + s.replace(i, endbracket - i + 1, ""); +} + +static string sRIGHI; + +static void delayedRIGHI(void *) +{ + qso_opBW1->value(sRIGHI.c_str()); + cb_qso_opBW1(); + wait_after_mode_change = 0.0; +} + +static void pRIGHI(std::string& s, size_t& i, size_t endbracket) +{ + if (within_exec) { + s.replace(i, endbracket - i + 1, ""); + return; + } + std::string sHI = s.substr(i+7, endbracket - i - 7); + sRIGHI = sHI; + if (wait_after_mode_change) + Fl::add_timeout(wait_after_mode_change, delayedRIGHI); + else { + qso_opBW1->value(sHI.c_str()); + cb_qso_opBW1(); + } + s.replace(i, endbracket - i + 1, ""); +} + +static void doRIGHI(std::string s) +{ + std::string sHI = s.substr(8, s.length() - 9); + qso_opBW1->value(sHI.c_str()); + cb_qso_opBW1(); + que_ok = true; +} + +static void pTxQueRIGHI(std::string &s, size_t &i, size_t endbracket) +{ + if (within_exec) { + s.replace(i, endbracket - i + 1, ""); + return; + } + struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGHI }; + push_txcmd(cmd); + s.replace(i, endbracket - i + 1, "^!"); +} + +static void pRxQueRIGHI(std::string &s, size_t &i, size_t endbracket) +{ + if (within_exec) { + s.replace(i, endbracket - i + 1, ""); + return; + } + struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGHI }; push_rxcmd(cmd); s.replace(i, endbracket - i + 1, ""); } @@ -3230,6 +3344,8 @@ static const MTAGS mtags[] = { {"", pQSYFM}, {"", pMAPIT}, {"", pREPEAT}, @@ -3255,6 +3371,8 @@ static const MTAGS mtags[] = { {"", pRxQueGOHOME}, {"<@RIGMODE:", pRxQueRIGMODE}, {"<@FILWID:", pRxQueFILWID}, + {"<@RIGHI:", pRxQueRIGHI}, + {"<@RIGLO:", pRxQueRIGLO}, {"<@TXRSID:", pRxQueTXRSID}, {"<@WAIT:", pRxQueWAIT}, diff --git a/src/rigcontrol/rigio.cxx b/src/rigcontrol/rigio.cxx index 42a6500f..05026959 100644 --- a/src/rigcontrol/rigio.cxx +++ b/src/rigcontrol/rigio.cxx @@ -1284,6 +1284,8 @@ void rigCAT_set_qsy(long long f) bool ModeIsLSB(string s) { + if (connected_to_flrig) return !xmlrpc_USB(); + list::iterator pM = LSBmodes.begin(); while (pM != LSBmodes.end() ) { if (*pM == s) diff --git a/src/rigcontrol/rigsupport.cxx b/src/rigcontrol/rigsupport.cxx index 8eea9da1..f6ca336f 100644 --- a/src/rigcontrol/rigsupport.cxx +++ b/src/rigcontrol/rigsupport.cxx @@ -359,12 +359,14 @@ int cb_qso_btnBW2() int cb_qso_opBW1() { +//printf("opBW1 %d:%s\n", qso_opBW1->index(), qso_opBW1->value()); set_flrig_bw(qso_opBW2->index(), qso_opBW1->index()); return 0; } int cb_qso_opBW2() { +//printf("opBW2 %d:%s\n", qso_opBW2->index(), qso_opBW2->value()); set_flrig_bw(qso_opBW2->index(), qso_opBW1->index()); return 0; } diff --git a/src/rigcontrol/xmlrpc_rig.cxx b/src/rigcontrol/xmlrpc_rig.cxx index ca70a842..9887a66d 100644 --- a/src/rigcontrol/xmlrpc_rig.cxx +++ b/src/rigcontrol/xmlrpc_rig.cxx @@ -52,7 +52,7 @@ LOG_FILE_SOURCE(debug::debug::LOG_XMLRPC_RIG); using namespace XmlRpc; using namespace std; -int xmlrpc_verbosity = 0; +static int xmlrpc_verbosity = 0; //====================================================================== // flrig xmlrpc client @@ -84,21 +84,24 @@ void connect_to_flrig(); XmlRpcClient *flrig_client = (XmlRpcClient *)0; -bool bws_posted = false; -bool bw_posted = false; -bool mode_posted = false; -bool modes_posted = false; -bool freq_posted = true; - -string xcvr_name; -string str_freq; -string mode_result; -XmlRpcValue modes_result; -XmlRpcValue bws_result; -XmlRpcValue bw_result; -XmlRpcValue notch_result; - +//---------------------------------------------------------------------- +// declared as extern in rigsupport.h +//---------------------------------------------------------------------- bool connected_to_flrig = false; +//---------------------------------------------------------------------- + +static bool bws_posted = false; +static bool modes_posted = false; +static bool freq_posted = true; + +static string xcvr_name; +static string str_freq; +static string mode_result; +static XmlRpcValue modes_result; +static XmlRpcValue bws_result; +static XmlRpcValue bw_result; +static XmlRpcValue notch_result; + static double timeout = 2.0; //====================================================================== @@ -118,11 +121,11 @@ void xmlrpc_rig_set_qsy(long long rfc) //---------------------------------------------------------------------- // push to talk //---------------------------------------------------------------------- -bool wait_ptt = false; // wait for transceiver to respond -int wait_ptt_timeout = 5; // 5 polls and then disable wait -int ptt_state = 0; +static bool wait_ptt = false; // wait for transceiver to respond +static int wait_ptt_timeout = 5; // 5 polls and then disable wait +static int ptt_state = 0; -int new_ptt = -1; +static int new_ptt = -1; void exec_flrig_ptt() { if (!connected_to_flrig) { @@ -212,9 +215,9 @@ void flrig_get_ptt() // transceiver radio frequency //---------------------------------------------------------------------- -bool wait_freq = false; // wait for transceiver to respond -int wait_freq_timeout = 5; // 5 polls and then disable wait -long int xcvr_freq = 0; +static bool wait_freq = false; // wait for transceiver to respond +static int wait_freq_timeout = 5; // 5 polls and then disable wait +static long int xcvr_freq = 0; pthread_mutex_t mutex_flrig_freq = PTHREAD_MUTEX_INITIALIZER; @@ -283,15 +286,16 @@ void flrig_get_frequency() // transceiver get modes (mode table) //---------------------------------------------------------------------- -bool wait_mode = false; // wait for transceiver to respond -int wait_mode_timeout = 5; // 5 polls and then disable wait -string posted_mode = ""; +static bool wait_mode = false; // wait for transceiver to respond +static int wait_mode_timeout = 5; // 5 polls and then disable wait +static string posted_mode = ""; -bool wait_bw = false; // wait for transceiver to respond -int wait_bw_timeout = 5; // 5 polls and then disable wait -string posted_bw = ""; -string posted_bw1 = ""; -string posted_bw2 = ""; +static bool wait_bw = false; // wait for transceiver to respond +static int wait_bw_timeout = 5; // 5 polls and then disable wait +static bool need_sideband = false; +static string posted_bw = ""; +static string posted_bw1 = ""; +static string posted_bw2 = ""; void set_flrig_mode(const char *md) { @@ -307,6 +311,7 @@ void set_flrig_mode(const char *md) wait_mode_timeout = 5; } else { posted_mode = md; + need_sideband = true; bws_posted = false; wait_mode = true; wait_mode_timeout = 5; @@ -315,6 +320,13 @@ void set_flrig_mode(const char *md) } pthread_mutex_t mutex_flrig_mode = PTHREAD_MUTEX_INITIALIZER; +static bool xml_USB = true; + +bool xmlrpc_USB() +{ + return xml_USB; +} + void xmlrpc_rig_post_mode(void *data) { guard_lock flrig_lock(&mutex_flrig_mode); @@ -322,6 +334,7 @@ void xmlrpc_rig_post_mode(void *data) string *s = reinterpret_cast(data); qso_opMODE->value(s->c_str()); bws_posted = false; + need_sideband = false; } void flrig_get_mode() @@ -332,11 +345,18 @@ void flrig_get_mode() static string md; md = string(res); bool posted = (md == posted_mode); - if (!wait_mode && !posted) { + if (!wait_mode && (!posted || need_sideband)) { posted_mode = md; - guard_lock flrig_lock(&mutex_flrig_mode); + guard_lock flrig_modelock(&mutex_flrig_mode); + if (flrig_client->execute("rig.get_sideband", XmlRpcValue(), res, timeout) ) { + static string sb; + sb = string(res); + xml_USB = (sb[0] == 'U'); + } else { + xml_USB = true; + } Fl::awake(xmlrpc_rig_post_mode, reinterpret_cast(&md)); - LOG_INFO("get mode: %s", md.c_str()); + LOG_INFO("get mode: %s:%s", md.c_str(), xml_USB ? "USB" : "LSB"); } else if (wait_mode && posted) { wait_mode = false; wait_mode_timeout = 0; @@ -411,7 +431,7 @@ void set_flrig_bw(int bw2, int bw1) XmlRpcValue val, result; int ival = bw2; - if (bw1 > 0) ival = 256*(bw1+128) + bw2; + if (bw1 > -1) ival = 256*(bw1+128) + bw2; val = ival; guard_lock flrig_lock(&mutex_flrig); @@ -676,9 +696,9 @@ void flrig_get_vfo() //============================================================================== // transceiver set / get notch //============================================================================== -bool wait_notch = false; // wait for transceiver to respond -int wait_notch_timeout = 5; // 5 polls and then disable wait -int xcvr_notch = 0; +static bool wait_notch = false; // wait for transceiver to respond +static int wait_notch_timeout = 5; // 5 polls and then disable wait +static int xcvr_notch = 0; void set_flrig_notch() { @@ -832,8 +852,8 @@ bool flrig_get_xcvr() //====================================================================== // xmlrpc read polling thread //====================================================================== -bool run_flrig_thread = true; -int poll_interval = 1000; // 100 // milliseconds +static bool run_flrig_thread = true; +static int poll_interval = 1000; // 100 // milliseconds //---------------------------------------------------------------------- // Set QSY to true if xmlrpc client connection is OK From 22514a57740bb0a691c766e311503f29b9e81058 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 3 Jan 2016 07:29:12 -0600 Subject: [PATCH 057/138] Macro Tool Bar * Correct edit / launch behavior of 4 row toolbar - removed dependency on 2 bar selection of alternate macro set --- src/dialogs/fl_digi.cxx | 12 ++++++++---- src/include/fl_digi.h | 1 + src/misc/macroedit.cxx | 8 +++++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index ca52eaa4..722c7162 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -1831,10 +1831,14 @@ void macro_cb(Fl_Widget *w, void *v) int b = (int)(reinterpret_cast (v)); - if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { - if (b >= NUMMACKEYS) b += (altMacros - 1) * NUMMACKEYS; + if (b & 0x80) { // 4 bar docked macros + b &= 0x7F; } else { - b += altMacros * NUMMACKEYS; + if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { + if (b >= NUMMACKEYS) b += (altMacros - 1) * NUMMACKEYS; + } else { + b += altMacros * NUMMACKEYS; + } } int mouse = Fl::event_button(); @@ -5431,7 +5435,7 @@ static void add_docked(dockgroup *dock) ((i % 12) == 11) ? w - xpos - 4 : Wbtn, Hbtn, ""); btnDockMacro[i]->box(FL_THIN_UP_BOX); btnDockMacro[i]->tooltip(_("Left Click - execute\nRight Click - edit")); - btnDockMacro[i]->callback(macro_cb, reinterpret_cast(i)); + btnDockMacro[i]->callback(macro_cb, reinterpret_cast(i | 0x80)); xpos += Wbtn; if (i == 11 || i == 23 || i == 35) { diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index 642b7ab8..a3f143e2 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -88,6 +88,7 @@ extern PWRmeter *pwrmeter; extern Fl_Button *btnMacro[]; extern Fl_Button *btnAltMacros1; extern Fl_Button *btnAltMacros2; +extern Fl_Button *btnDockMacro[]; extern Fl_Group *macroFrame1; extern Fl_Group *macroFrame2; extern Fl_Input2 *inpFreq; diff --git a/src/misc/macroedit.cxx b/src/misc/macroedit.cxx index 2c3512a5..497f6ca4 100644 --- a/src/misc/macroedit.cxx +++ b/src/misc/macroedit.cxx @@ -310,9 +310,9 @@ void update_macro_button(int iMacro, const char *text, const char *name) if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (iMacro < NUMMACKEYS) { - btnMacro[iMacro % NUMMACKEYS]->label( macros.name[iMacro].c_str() ); - btnMacro[iMacro % NUMMACKEYS]->redraw_label(); - } else { + btnMacro[iMacro]->label( macros.name[iMacro].c_str() ); + btnMacro[iMacro]->redraw_label(); + } else if ((iMacro / NUMMACKEYS) == altMacros) { btnMacro[(iMacro % NUMMACKEYS) + NUMMACKEYS]->label( macros.name[iMacro].c_str() ); btnMacro[(iMacro % NUMMACKEYS) + NUMMACKEYS]->redraw_label(); } @@ -320,6 +320,8 @@ void update_macro_button(int iMacro, const char *text, const char *name) btnMacro[iMacro % NUMMACKEYS]->label( macros.name[iMacro].c_str() ); btnMacro[iMacro % NUMMACKEYS]->redraw_label(); } + btnDockMacro[iMacro]->label(macros.name[iMacro].c_str()); + btnDockMacro[iMacro]->redraw_label(); macros.changed = true; } From 2fb5648f2a77d92439d3422f903c0f58dc4751d4 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 6 Jan 2016 12:36:33 -0600 Subject: [PATCH 058/138] hamlib PTT_ON_DATA * changed PTT_ON to PTT_ON_DATA in call rig_set_ptt --- src/dialogs/confdialog.cxx | 576 ++++++++++++++++++------------------ src/dialogs/confdialog.fl | 343 ++++++++++----------- src/include/confdialog.h | 35 +-- src/include/configuration.h | 3 + src/rigcontrol/hamlib.cxx | 4 +- 5 files changed, 487 insertions(+), 474 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index 51ee4b29..345466b5 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -3691,155 +3691,6 @@ Fl_Group *tabRig=(Fl_Group *)0; Fl_Tabs *tabsRig=(Fl_Tabs *)0; -Fl_Check_Button *btnPTTrightchannel=(Fl_Check_Button *)0; - -static void cb_btnPTTrightchannel(Fl_Check_Button* o, void*) { - progdefaults.PTTrightchannel = o->value(); -btnPTTrightchannel2->value(o->value()); -if (o->value()) { - progdefaults.QSK = false; - btnQSK->value(0); - progdefaults.PseudoFSK = false; - chkPseudoFSK->value(0); - progdefaults.sig_on_right_channel = false; - chkAudioStereoOut->value(0); -} -progdefaults.changed = true; -} - -Fl_Group *grpHWPTT=(Fl_Group *)0; - -Fl_Round_Button *btnTTYptt=(Fl_Round_Button *)0; - -static void cb_btnTTYptt(Fl_Round_Button* o, void*) { - btnUsePPortPTT->value(false); -btnUseUHrouterPTT->value(false); - -progdefaults.TTYptt = o->value(); -progdefaults.UsePPortPTT = false; -progdefaults.UseUHrouterPTT = false; -btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true; -} - -Fl_ComboBox *inpTTYdev=(Fl_ComboBox *)0; - -static void cb_inpTTYdev(Fl_ComboBox*, void*) { - btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true; -} - -Fl_Round_Button *btnRTSptt=(Fl_Round_Button *)0; - -static void cb_btnRTSptt(Fl_Round_Button*, void*) { - btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true; -} - -Fl_Round_Button *btnRTSplusV=(Fl_Round_Button *)0; - -static void cb_btnRTSplusV(Fl_Round_Button*, void*) { - btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true; -} - -Fl_Round_Button *btnDTRptt=(Fl_Round_Button *)0; - -static void cb_btnDTRptt(Fl_Round_Button*, void*) { - btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true; -} - -Fl_Round_Button *btnDTRplusV=(Fl_Round_Button *)0; - -static void cb_btnDTRplusV(Fl_Round_Button*, void*) { - btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true; -} - -Fl_Button *btnInitHWPTT=(Fl_Button *)0; - -static void cb_btnInitHWPTT(Fl_Button* o, void*) { - progdefaults.initInterface(); -o->labelcolor(FL_FOREGROUND_COLOR); -progdefaults.changed = true; -} - -Fl_Round_Button *btnUsePPortPTT=(Fl_Round_Button *)0; - -static void cb_btnUsePPortPTT(Fl_Round_Button* o, void*) { - btnTTYptt->value(false); -btnUseUHrouterPTT->value(false); - -progdefaults.TTYptt = false; -progdefaults.UsePPortPTT = o->value(); -progdefaults.UseUHrouterPTT = false; -btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true; -} - -Fl_Round_Button *btnUseUHrouterPTT=(Fl_Round_Button *)0; - -static void cb_btnUseUHrouterPTT(Fl_Round_Button* o, void*) { - btnTTYptt->value(false); -btnUsePPortPTT->value(false); - -progdefaults.TTYptt = false; -progdefaults.UsePPortPTT = false; -progdefaults.UseUHrouterPTT = o->value(); -btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true; -} - -Fl_Round_Button *btnUseGPIOPTT=(Fl_Round_Button *)0; - -static void cb_btnUseGPIOPTT(Fl_Round_Button* o, void*) { - btnTTYptt->value(false); -btnUsePPortPTT->value(false); -btnUseUHrouterPTT->value(false); - -progdefaults.TTYptt = false; -progdefaults.UsePPortPTT = false; -progdefaults.UseUHrouterPTT = false; -progdefaults.UseGPIOPTT = o->value(); - -btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true; -} - -Fl_Counter2 *inpGPIOPort=(Fl_Counter2 *)0; - -static void cb_inpGPIOPort(Fl_Counter2*, void*) { - btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true; -} - -Fl_Group *grpPTTdelays=(Fl_Group *)0; - -Fl_Counter *cntPTT_on_delay=(Fl_Counter *)0; - -static void cb_cntPTT_on_delay(Fl_Counter* o, void*) { - progdefaults.PTT_on_delay = o->value(); -progdefaults.changed = true; -} - -Fl_Counter *cntPTT_off_delay=(Fl_Counter *)0; - -static void cb_cntPTT_off_delay(Fl_Counter* o, void*) { - progdefaults.PTT_off_delay = o->value(); -progdefaults.changed = true; -} - Fl_Check_Button *chkUSERIGCAT=(Fl_Check_Button *)0; static void cb_chkUSERIGCAT(Fl_Check_Button* o, void*) { @@ -4142,18 +3993,18 @@ progdefaults.changed = true; Fl_ListBox *listbox_sideband=(Fl_ListBox *)0; -static void cb_listbox_sideband(Fl_ListBox*, void*) { +Fl_Check_Button *btnHamlibCMDptt=(Fl_Check_Button *)0; + +static void cb_btnHamlibCMDptt(Fl_Check_Button*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate(); } -Fl_Round_Button *btnHamlibCMDptt=(Fl_Round_Button *)0; +Fl_Check_Button *btnHamlibPTT_ON_DATA=(Fl_Check_Button *)0; -static void cb_btnHamlibCMDptt(Fl_Round_Button*, void*) { - btnInitHAMLIB->labelcolor(FL_RED); -btnInitHAMLIB->redraw_label(); -btnRevertHAMLIB->activate(); +static void cb_btnHamlibPTT_ON_DATA(Fl_Check_Button* o, void*) { + progdefaults.hamlib_ptt_on_data = o->value(); } Fl_Check_Button *btnHamlibDTRplus=(Fl_Check_Button *)0; @@ -4207,6 +4058,155 @@ hamlib_restore_defaults(); #endif } +Fl_Check_Button *btnPTTrightchannel=(Fl_Check_Button *)0; + +static void cb_btnPTTrightchannel(Fl_Check_Button* o, void*) { + progdefaults.PTTrightchannel = o->value(); +btnPTTrightchannel2->value(o->value()); +if (o->value()) { + progdefaults.QSK = false; + btnQSK->value(0); + progdefaults.PseudoFSK = false; + chkPseudoFSK->value(0); + progdefaults.sig_on_right_channel = false; + chkAudioStereoOut->value(0); +} +progdefaults.changed = true; +} + +Fl_Group *grpHWPTT=(Fl_Group *)0; + +Fl_Round_Button *btnTTYptt=(Fl_Round_Button *)0; + +static void cb_btnTTYptt(Fl_Round_Button* o, void*) { + btnUsePPortPTT->value(false); +btnUseUHrouterPTT->value(false); + +progdefaults.TTYptt = o->value(); +progdefaults.UsePPortPTT = false; +progdefaults.UseUHrouterPTT = false; +btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_ComboBox *inpTTYdev=(Fl_ComboBox *)0; + +static void cb_inpTTYdev(Fl_ComboBox*, void*) { + btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_Round_Button *btnRTSptt=(Fl_Round_Button *)0; + +static void cb_btnRTSptt(Fl_Round_Button*, void*) { + btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_Round_Button *btnRTSplusV=(Fl_Round_Button *)0; + +static void cb_btnRTSplusV(Fl_Round_Button*, void*) { + btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_Round_Button *btnDTRptt=(Fl_Round_Button *)0; + +static void cb_btnDTRptt(Fl_Round_Button*, void*) { + btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_Round_Button *btnDTRplusV=(Fl_Round_Button *)0; + +static void cb_btnDTRplusV(Fl_Round_Button*, void*) { + btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_Button *btnInitHWPTT=(Fl_Button *)0; + +static void cb_btnInitHWPTT(Fl_Button* o, void*) { + progdefaults.initInterface(); +o->labelcolor(FL_FOREGROUND_COLOR); +progdefaults.changed = true; +} + +Fl_Round_Button *btnUsePPortPTT=(Fl_Round_Button *)0; + +static void cb_btnUsePPortPTT(Fl_Round_Button* o, void*) { + btnTTYptt->value(false); +btnUseUHrouterPTT->value(false); + +progdefaults.TTYptt = false; +progdefaults.UsePPortPTT = o->value(); +progdefaults.UseUHrouterPTT = false; +btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_Round_Button *btnUseUHrouterPTT=(Fl_Round_Button *)0; + +static void cb_btnUseUHrouterPTT(Fl_Round_Button* o, void*) { + btnTTYptt->value(false); +btnUsePPortPTT->value(false); + +progdefaults.TTYptt = false; +progdefaults.UsePPortPTT = false; +progdefaults.UseUHrouterPTT = o->value(); +btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_Round_Button *btnUseGPIOPTT=(Fl_Round_Button *)0; + +static void cb_btnUseGPIOPTT(Fl_Round_Button* o, void*) { + btnTTYptt->value(false); +btnUsePPortPTT->value(false); +btnUseUHrouterPTT->value(false); + +progdefaults.TTYptt = false; +progdefaults.UsePPortPTT = false; +progdefaults.UseUHrouterPTT = false; +progdefaults.UseGPIOPTT = o->value(); + +btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_Counter2 *inpGPIOPort=(Fl_Counter2 *)0; + +static void cb_inpGPIOPort(Fl_Counter2*, void*) { + btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true; +} + +Fl_Group *grpPTTdelays=(Fl_Group *)0; + +Fl_Counter *cntPTT_on_delay=(Fl_Counter *)0; + +static void cb_cntPTT_on_delay(Fl_Counter* o, void*) { + progdefaults.PTT_on_delay = o->value(); +progdefaults.changed = true; +} + +Fl_Counter *cntPTT_off_delay=(Fl_Counter *)0; + +static void cb_cntPTT_off_delay(Fl_Counter* o, void*) { + progdefaults.PTT_off_delay = o->value(); +progdefaults.changed = true; +} + Fl_Group *tabXMLRPC=(Fl_Group *)0; Fl_Group *grpXMLRPC=(Fl_Group *)0; @@ -9388,128 +9388,8 @@ le Earth)")); tabRig->hide(); { tabsRig = new Fl_Tabs(0, 23, 600, 357); tabsRig->selection_color(FL_LIGHT1); - { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Hardware PTT")); - { Fl_Group* o = new Fl_Group(55, 57, 490, 38); - o->box(FL_ENGRAVED_FRAME); - { Fl_Check_Button* o = btnPTTrightchannel = new Fl_Check_Button(74, 66, 250, 20, _("PTT tone on right audio channel ")); - btnPTTrightchannel->tooltip(_("Can be used in lieu of or in addition to other PTT types")); - btnPTTrightchannel->down_box(FL_DOWN_BOX); - btnPTTrightchannel->callback((Fl_Callback*)cb_btnPTTrightchannel); - o->value(progdefaults.PTTrightchannel); - } // Fl_Check_Button* btnPTTrightchannel - o->end(); - } // Fl_Group* o - { grpHWPTT = new Fl_Group(55, 97, 490, 184, _("h/w ptt device-pin")); - grpHWPTT->box(FL_ENGRAVED_FRAME); - grpHWPTT->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { btnTTYptt = new Fl_Round_Button(74, 121, 220, 20, _("Use separate serial port PTT")); - btnTTYptt->down_box(FL_DOWN_BOX); - btnTTYptt->selection_color((Fl_Color)1); - btnTTYptt->callback((Fl_Callback*)cb_btnTTYptt); - } // Fl_Round_Button* btnTTYptt - { Fl_ComboBox* o = inpTTYdev = new Fl_ComboBox(128, 151, 160, 22, _("Device:")); - inpTTYdev->box(FL_DOWN_BOX); - inpTTYdev->color(FL_BACKGROUND2_COLOR); - inpTTYdev->selection_color(FL_BACKGROUND_COLOR); - inpTTYdev->labeltype(FL_NORMAL_LABEL); - inpTTYdev->labelfont(0); - inpTTYdev->labelsize(14); - inpTTYdev->labelcolor(FL_FOREGROUND_COLOR); - inpTTYdev->callback((Fl_Callback*)cb_inpTTYdev); - inpTTYdev->align(Fl_Align(FL_ALIGN_LEFT)); - inpTTYdev->when(FL_WHEN_RELEASE); - o->labelsize(FL_NORMAL_SIZE); - inpTTYdev->end(); - } // Fl_ComboBox* inpTTYdev - { btnRTSptt = new Fl_Round_Button(310, 120, 85, 20, _("Use RTS")); - btnRTSptt->tooltip(_("RTS is PTT signal line")); - btnRTSptt->down_box(FL_DOWN_BOX); - btnRTSptt->callback((Fl_Callback*)cb_btnRTSptt); - } // Fl_Round_Button* btnRTSptt - { btnRTSplusV = new Fl_Round_Button(407, 120, 100, 20, _("RTS = +V")); - btnRTSplusV->tooltip(_("Initial voltage on RTS")); - btnRTSplusV->down_box(FL_DOWN_BOX); - btnRTSplusV->callback((Fl_Callback*)cb_btnRTSplusV); - } // Fl_Round_Button* btnRTSplusV - { btnDTRptt = new Fl_Round_Button(310, 150, 85, 20, _("Use DTR")); - btnDTRptt->tooltip(_("DTR is PTT signal line")); - btnDTRptt->down_box(FL_DOWN_BOX); - btnDTRptt->callback((Fl_Callback*)cb_btnDTRptt); - } // Fl_Round_Button* btnDTRptt - { btnDTRplusV = new Fl_Round_Button(407, 150, 100, 20, _("DTR = +V")); - btnDTRplusV->tooltip(_("Initial voltage on DTR")); - btnDTRplusV->down_box(FL_DOWN_BOX); - btnDTRplusV->callback((Fl_Callback*)cb_btnDTRplusV); - } // Fl_Round_Button* btnDTRplusV - { btnInitHWPTT = new Fl_Button(411, 217, 113, 24, _("Initialize")); - btnInitHWPTT->tooltip(_("Initialize the H/W PTT interface")); - btnInitHWPTT->callback((Fl_Callback*)cb_btnInitHWPTT); - } // Fl_Button* btnInitHWPTT - { btnUsePPortPTT = new Fl_Round_Button(74, 191, 170, 20, _("Use parallel port PTT")); - btnUsePPortPTT->down_box(FL_DOWN_BOX); - btnUsePPortPTT->selection_color((Fl_Color)1); - btnUsePPortPTT->callback((Fl_Callback*)cb_btnUsePPortPTT); - } // Fl_Round_Button* btnUsePPortPTT - { btnUseUHrouterPTT = new Fl_Round_Button(74, 221, 170, 20, _("Use uHRouter PTT")); - btnUseUHrouterPTT->down_box(FL_DOWN_BOX); - btnUseUHrouterPTT->selection_color((Fl_Color)1); - btnUseUHrouterPTT->callback((Fl_Callback*)cb_btnUseUHrouterPTT); - } // Fl_Round_Button* btnUseUHrouterPTT - { btnUseGPIOPTT = new Fl_Round_Button(74, 252, 170, 20, _("Use GPIO PTT")); - btnUseGPIOPTT->down_box(FL_DOWN_BOX); - btnUseGPIOPTT->selection_color((Fl_Color)1); - btnUseGPIOPTT->callback((Fl_Callback*)cb_btnUseGPIOPTT); - } // Fl_Round_Button* btnUseGPIOPTT - { inpGPIOPort = new Fl_Counter2(286, 252, 65, 20, _("GPIO:")); - inpGPIOPort->tooltip(_("Select GPIO port")); - inpGPIOPort->type(1); - inpGPIOPort->box(FL_UP_BOX); - inpGPIOPort->color(FL_BACKGROUND_COLOR); - inpGPIOPort->selection_color(FL_INACTIVE_COLOR); - inpGPIOPort->labeltype(FL_NORMAL_LABEL); - inpGPIOPort->labelfont(0); - inpGPIOPort->labelsize(14); - inpGPIOPort->labelcolor(FL_FOREGROUND_COLOR); - inpGPIOPort->minimum(0); - inpGPIOPort->maximum(31); - inpGPIOPort->step(1); - inpGPIOPort->value(17); - inpGPIOPort->callback((Fl_Callback*)cb_inpGPIOPort); - inpGPIOPort->align(Fl_Align(FL_ALIGN_LEFT)); - inpGPIOPort->when(FL_WHEN_CHANGED); - } // Fl_Counter2* inpGPIOPort - grpHWPTT->end(); - } // Fl_Group* grpHWPTT - { grpPTTdelays = new Fl_Group(55, 284, 490, 91, _("PTT delays valid for all CAT/PTT types")); - grpPTTdelays->box(FL_ENGRAVED_FRAME); - grpPTTdelays->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { Fl_Counter* o = cntPTT_on_delay = new Fl_Counter(74, 311, 100, 21, _("Start of transmit PTT delay")); - cntPTT_on_delay->tooltip(_("Delay NN msec before starting audio")); - cntPTT_on_delay->minimum(0); - cntPTT_on_delay->maximum(500); - cntPTT_on_delay->step(1); - cntPTT_on_delay->callback((Fl_Callback*)cb_cntPTT_on_delay); - cntPTT_on_delay->align(Fl_Align(FL_ALIGN_RIGHT)); - o->value(progdefaults.PTT_on_delay); - o->lstep(10); - } // Fl_Counter* cntPTT_on_delay - { Fl_Counter* o = cntPTT_off_delay = new Fl_Counter(74, 341, 100, 21, _("PTT end of transmit delay")); - cntPTT_off_delay->tooltip(_("Delay NN msec before releasing PTT")); - cntPTT_off_delay->minimum(0); - cntPTT_off_delay->maximum(500); - cntPTT_off_delay->step(1); - cntPTT_off_delay->callback((Fl_Callback*)cb_cntPTT_off_delay); - cntPTT_off_delay->align(Fl_Align(FL_ALIGN_RIGHT)); - o->value(progdefaults.PTT_off_delay); - o->lstep(10); - } // Fl_Counter* cntPTT_off_delay - grpPTTdelays->end(); - } // Fl_Group* grpPTTdelays - o->end(); - } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("RigCAT")); o->tooltip(_("Rig Control using xml spec file")); - o->hide(); { chkUSERIGCAT = new Fl_Check_Button(245, 60, 110, 20, _("Use RigCAT")); chkUSERIGCAT->tooltip(_("RigCAT used for rig control")); chkUSERIGCAT->down_box(FL_DOWN_BOX); @@ -9894,7 +9774,7 @@ le Earth)")); btnInitHAMLIB->tooltip(_("Initialize hamlib interface")); btnInitHAMLIB->callback((Fl_Callback*)cb_btnInitHAMLIB); } // Fl_Button* btnInitHAMLIB - { Fl_ListBox* o = listbox_sideband = new Fl_ListBox(431, 222, 144, 22, _("Sideband:")); + { Fl_ListBox* o = listbox_sideband = new Fl_ListBox(431, 210, 144, 22, _("Sideband:")); listbox_sideband->box(FL_DOWN_BOX); listbox_sideband->color(FL_BACKGROUND2_COLOR); listbox_sideband->selection_color(FL_BACKGROUND_COLOR); @@ -9902,39 +9782,43 @@ le Earth)")); listbox_sideband->labelfont(0); listbox_sideband->labelsize(14); listbox_sideband->labelcolor(FL_FOREGROUND_COLOR); - listbox_sideband->callback((Fl_Callback*)cb_listbox_sideband); - listbox_sideband->align(Fl_Align(FL_ALIGN_TOP_LEFT)); + listbox_sideband->align(Fl_Align(FL_ALIGN_LEFT)); listbox_sideband->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listbox_sideband->end(); } // Fl_ListBox* listbox_sideband - { Fl_Round_Button* o = btnHamlibCMDptt = new Fl_Round_Button(55, 223, 200, 20, _("PTT via Hamlib command")); - btnHamlibCMDptt->tooltip(_("PTT is a hamlib command")); + { Fl_Check_Button* o = btnHamlibCMDptt = new Fl_Check_Button(55, 211, 215, 20, _("PTT via Hamlib command")); + btnHamlibCMDptt->tooltip(_("PTT using hamlib command")); btnHamlibCMDptt->down_box(FL_DOWN_BOX); - btnHamlibCMDptt->selection_color((Fl_Color)1); btnHamlibCMDptt->callback((Fl_Callback*)cb_btnHamlibCMDptt); o->value(progdefaults.HamlibCMDptt); - } // Fl_Round_Button* btnHamlibCMDptt - { Fl_Check_Button* o = btnHamlibDTRplus = new Fl_Check_Button(55, 248, 90, 20, _("DTR +12")); + } // Fl_Check_Button* btnHamlibCMDptt + { Fl_Check_Button* o = btnHamlibPTT_ON_DATA = new Fl_Check_Button(55, 234, 215, 20, _("Audio on Auxiliary Port")); + btnHamlibPTT_ON_DATA->tooltip(_("PTT enables auxiliary audio source")); + btnHamlibPTT_ON_DATA->down_box(FL_DOWN_BOX); + btnHamlibPTT_ON_DATA->callback((Fl_Callback*)cb_btnHamlibPTT_ON_DATA); + o->value(progdefaults.hamlib_ptt_on_data); + } // Fl_Check_Button* btnHamlibPTT_ON_DATA + { Fl_Check_Button* o = btnHamlibDTRplus = new Fl_Check_Button(55, 257, 90, 20, _("DTR +12")); btnHamlibDTRplus->tooltip(_("Initial state of DTR")); btnHamlibDTRplus->down_box(FL_DOWN_BOX); btnHamlibDTRplus->callback((Fl_Callback*)cb_btnHamlibDTRplus); o->value(progdefaults.HamlibDTRplus); } // Fl_Check_Button* btnHamlibDTRplus - { Fl_Check_Button* o = chkHamlibRTSplus = new Fl_Check_Button(345, 248, 85, 20, _("RTS +12")); + { Fl_Check_Button* o = chkHamlibRTSplus = new Fl_Check_Button(345, 257, 85, 20, _("RTS +12")); chkHamlibRTSplus->tooltip(_("Initial state of RTS")); chkHamlibRTSplus->down_box(FL_DOWN_BOX); chkHamlibRTSplus->callback((Fl_Callback*)cb_chkHamlibRTSplus); o->value(progdefaults.HamlibRTSplus); } // Fl_Check_Button* chkHamlibRTSplus - { Fl_Check_Button* o = chkHamlibRTSCTSflow = new Fl_Check_Button(55, 276, 170, 20, _("RTS/CTS flow control")); + { Fl_Check_Button* o = chkHamlibRTSCTSflow = new Fl_Check_Button(55, 280, 170, 20, _("RTS/CTS flow control")); chkHamlibRTSCTSflow->tooltip(_("Rig requires RTS/CTS flow control")); chkHamlibRTSCTSflow->down_box(FL_DOWN_BOX); chkHamlibRTSCTSflow->callback((Fl_Callback*)cb_chkHamlibRTSCTSflow); o->value(progdefaults.HamlibRTSCTSflow); if (o->value()) chkHamlibRTSplus->deactivate(); } // Fl_Check_Button* chkHamlibRTSCTSflow - { Fl_Check_Button* o = chkHamlibXONXOFFflow = new Fl_Check_Button(345, 276, 185, 20, _("XON/XOFF flow control")); + { Fl_Check_Button* o = chkHamlibXONXOFFflow = new Fl_Check_Button(345, 280, 185, 20, _("XON/XOFF flow control")); chkHamlibXONXOFFflow->tooltip(_("Rig requires Xon/Xoff flow control")); chkHamlibXONXOFFflow->down_box(FL_DOWN_BOX); chkHamlibXONXOFFflow->callback((Fl_Callback*)cb_chkHamlibXONXOFFflow); @@ -9950,6 +9834,126 @@ le Earth)")); } // Fl_Group* grpHamlib tabHamlib->end(); } // Fl_Group* tabHamlib + { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Hardware PTT")); + o->hide(); + { Fl_Group* o = new Fl_Group(55, 57, 490, 38); + o->box(FL_ENGRAVED_FRAME); + { Fl_Check_Button* o = btnPTTrightchannel = new Fl_Check_Button(74, 66, 250, 20, _("PTT tone on right audio channel ")); + btnPTTrightchannel->tooltip(_("Can be used in lieu of or in addition to other PTT types")); + btnPTTrightchannel->down_box(FL_DOWN_BOX); + btnPTTrightchannel->callback((Fl_Callback*)cb_btnPTTrightchannel); + o->value(progdefaults.PTTrightchannel); + } // Fl_Check_Button* btnPTTrightchannel + o->end(); + } // Fl_Group* o + { grpHWPTT = new Fl_Group(55, 97, 490, 184, _("h/w ptt device-pin")); + grpHWPTT->box(FL_ENGRAVED_FRAME); + grpHWPTT->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); + { btnTTYptt = new Fl_Round_Button(74, 121, 220, 20, _("Use separate serial port PTT")); + btnTTYptt->down_box(FL_DOWN_BOX); + btnTTYptt->selection_color((Fl_Color)1); + btnTTYptt->callback((Fl_Callback*)cb_btnTTYptt); + } // Fl_Round_Button* btnTTYptt + { Fl_ComboBox* o = inpTTYdev = new Fl_ComboBox(128, 151, 160, 22, _("Device:")); + inpTTYdev->box(FL_DOWN_BOX); + inpTTYdev->color(FL_BACKGROUND2_COLOR); + inpTTYdev->selection_color(FL_BACKGROUND_COLOR); + inpTTYdev->labeltype(FL_NORMAL_LABEL); + inpTTYdev->labelfont(0); + inpTTYdev->labelsize(14); + inpTTYdev->labelcolor(FL_FOREGROUND_COLOR); + inpTTYdev->callback((Fl_Callback*)cb_inpTTYdev); + inpTTYdev->align(Fl_Align(FL_ALIGN_LEFT)); + inpTTYdev->when(FL_WHEN_RELEASE); + o->labelsize(FL_NORMAL_SIZE); + inpTTYdev->end(); + } // Fl_ComboBox* inpTTYdev + { btnRTSptt = new Fl_Round_Button(310, 120, 85, 20, _("Use RTS")); + btnRTSptt->tooltip(_("RTS is PTT signal line")); + btnRTSptt->down_box(FL_DOWN_BOX); + btnRTSptt->callback((Fl_Callback*)cb_btnRTSptt); + } // Fl_Round_Button* btnRTSptt + { btnRTSplusV = new Fl_Round_Button(407, 120, 100, 20, _("RTS = +V")); + btnRTSplusV->tooltip(_("Initial voltage on RTS")); + btnRTSplusV->down_box(FL_DOWN_BOX); + btnRTSplusV->callback((Fl_Callback*)cb_btnRTSplusV); + } // Fl_Round_Button* btnRTSplusV + { btnDTRptt = new Fl_Round_Button(310, 150, 85, 20, _("Use DTR")); + btnDTRptt->tooltip(_("DTR is PTT signal line")); + btnDTRptt->down_box(FL_DOWN_BOX); + btnDTRptt->callback((Fl_Callback*)cb_btnDTRptt); + } // Fl_Round_Button* btnDTRptt + { btnDTRplusV = new Fl_Round_Button(407, 150, 100, 20, _("DTR = +V")); + btnDTRplusV->tooltip(_("Initial voltage on DTR")); + btnDTRplusV->down_box(FL_DOWN_BOX); + btnDTRplusV->callback((Fl_Callback*)cb_btnDTRplusV); + } // Fl_Round_Button* btnDTRplusV + { btnInitHWPTT = new Fl_Button(411, 217, 113, 24, _("Initialize")); + btnInitHWPTT->tooltip(_("Initialize the H/W PTT interface")); + btnInitHWPTT->callback((Fl_Callback*)cb_btnInitHWPTT); + } // Fl_Button* btnInitHWPTT + { btnUsePPortPTT = new Fl_Round_Button(74, 191, 170, 20, _("Use parallel port PTT")); + btnUsePPortPTT->down_box(FL_DOWN_BOX); + btnUsePPortPTT->selection_color((Fl_Color)1); + btnUsePPortPTT->callback((Fl_Callback*)cb_btnUsePPortPTT); + } // Fl_Round_Button* btnUsePPortPTT + { btnUseUHrouterPTT = new Fl_Round_Button(74, 221, 170, 20, _("Use uHRouter PTT")); + btnUseUHrouterPTT->down_box(FL_DOWN_BOX); + btnUseUHrouterPTT->selection_color((Fl_Color)1); + btnUseUHrouterPTT->callback((Fl_Callback*)cb_btnUseUHrouterPTT); + } // Fl_Round_Button* btnUseUHrouterPTT + { btnUseGPIOPTT = new Fl_Round_Button(74, 252, 170, 20, _("Use GPIO PTT")); + btnUseGPIOPTT->down_box(FL_DOWN_BOX); + btnUseGPIOPTT->selection_color((Fl_Color)1); + btnUseGPIOPTT->callback((Fl_Callback*)cb_btnUseGPIOPTT); + } // Fl_Round_Button* btnUseGPIOPTT + { inpGPIOPort = new Fl_Counter2(286, 252, 65, 20, _("GPIO:")); + inpGPIOPort->tooltip(_("Select GPIO port")); + inpGPIOPort->type(1); + inpGPIOPort->box(FL_UP_BOX); + inpGPIOPort->color(FL_BACKGROUND_COLOR); + inpGPIOPort->selection_color(FL_INACTIVE_COLOR); + inpGPIOPort->labeltype(FL_NORMAL_LABEL); + inpGPIOPort->labelfont(0); + inpGPIOPort->labelsize(14); + inpGPIOPort->labelcolor(FL_FOREGROUND_COLOR); + inpGPIOPort->minimum(0); + inpGPIOPort->maximum(31); + inpGPIOPort->step(1); + inpGPIOPort->value(17); + inpGPIOPort->callback((Fl_Callback*)cb_inpGPIOPort); + inpGPIOPort->align(Fl_Align(FL_ALIGN_LEFT)); + inpGPIOPort->when(FL_WHEN_CHANGED); + } // Fl_Counter2* inpGPIOPort + grpHWPTT->end(); + } // Fl_Group* grpHWPTT + { grpPTTdelays = new Fl_Group(55, 284, 490, 91, _("PTT delays valid for all CAT/PTT types")); + grpPTTdelays->box(FL_ENGRAVED_FRAME); + grpPTTdelays->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); + { Fl_Counter* o = cntPTT_on_delay = new Fl_Counter(74, 311, 100, 21, _("Start of transmit PTT delay")); + cntPTT_on_delay->tooltip(_("Delay NN msec before starting audio")); + cntPTT_on_delay->minimum(0); + cntPTT_on_delay->maximum(500); + cntPTT_on_delay->step(1); + cntPTT_on_delay->callback((Fl_Callback*)cb_cntPTT_on_delay); + cntPTT_on_delay->align(Fl_Align(FL_ALIGN_RIGHT)); + o->value(progdefaults.PTT_on_delay); + o->lstep(10); + } // Fl_Counter* cntPTT_on_delay + { Fl_Counter* o = cntPTT_off_delay = new Fl_Counter(74, 341, 100, 21, _("PTT end of transmit delay")); + cntPTT_off_delay->tooltip(_("Delay NN msec before releasing PTT")); + cntPTT_off_delay->minimum(0); + cntPTT_off_delay->maximum(500); + cntPTT_off_delay->step(1); + cntPTT_off_delay->callback((Fl_Callback*)cb_cntPTT_off_delay); + cntPTT_off_delay->align(Fl_Align(FL_ALIGN_RIGHT)); + o->value(progdefaults.PTT_off_delay); + o->lstep(10); + } // Fl_Counter* cntPTT_off_delay + grpPTTdelays->end(); + } // Fl_Group* grpPTTdelays + o->end(); + } // Fl_Group* o { tabXMLRPC = new Fl_Group(0, 50, 600, 330, _("XML-RPC")); tabXMLRPC->hide(); { grpXMLRPC = new Fl_Group(55, 61, 490, 160); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 7503566d..ec93c637 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -4608,167 +4608,9 @@ progdefaults.changed = true;} Fl_Tabs tabsRig {open xywh {0 23 600 357} selection_color 50 } { - Fl_Group {} { - label {Hardware PTT} open - xywh {0 50 600 330} - } { - Fl_Group {} {open - xywh {55 57 490 38} box ENGRAVED_FRAME - } { - Fl_Check_Button btnPTTrightchannel { - label {PTT tone on right audio channel } - callback {progdefaults.PTTrightchannel = o->value(); -btnPTTrightchannel2->value(o->value()); -if (o->value()) { - progdefaults.QSK = false; - btnQSK->value(0); - progdefaults.PseudoFSK = false; - chkPseudoFSK->value(0); - progdefaults.sig_on_right_channel = false; - chkAudioStereoOut->value(0); -} -progdefaults.changed = true;} - tooltip {Can be used in lieu of or in addition to other PTT types} xywh {74 66 250 20} down_box DOWN_BOX - code0 {o->value(progdefaults.PTTrightchannel);} - } - } - Fl_Group grpHWPTT { - label {h/w ptt device-pin} open - xywh {55 97 490 184} box ENGRAVED_FRAME align 21 - } { - Fl_Round_Button btnTTYptt { - label {Use separate serial port PTT} - callback {btnUsePPortPTT->value(false); -btnUseUHrouterPTT->value(false); - -progdefaults.TTYptt = o->value(); -progdefaults.UsePPortPTT = false; -progdefaults.UseUHrouterPTT = false; -btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true;} - xywh {74 121 220 20} down_box DOWN_BOX selection_color 1 - } - Fl_Group inpTTYdev { - label {Device:} - callback {btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true;} open - xywh {128 151 160 22} box DOWN_BOX color 7 align 4 - code0 {o->labelsize(FL_NORMAL_SIZE);} - class Fl_ComboBox - } {} - Fl_Round_Button btnRTSptt { - label {Use RTS} - callback {btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true;} - tooltip {RTS is PTT signal line} xywh {310 120 85 20} down_box DOWN_BOX - } - Fl_Round_Button btnRTSplusV { - label {RTS = +V} - callback {btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true;} - tooltip {Initial voltage on RTS} xywh {407 120 100 20} down_box DOWN_BOX - } - Fl_Round_Button btnDTRptt { - label {Use DTR} - callback {btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true;} - tooltip {DTR is PTT signal line} xywh {310 150 85 20} down_box DOWN_BOX - } - Fl_Round_Button btnDTRplusV { - label {DTR = +V} - callback {btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true;} - tooltip {Initial voltage on DTR} xywh {407 150 100 20} down_box DOWN_BOX - } - Fl_Button btnInitHWPTT { - label Initialize - callback {progdefaults.initInterface(); -o->labelcolor(FL_FOREGROUND_COLOR); -progdefaults.changed = true;} - tooltip {Initialize the H/W PTT interface} xywh {411 217 113 24} - } - Fl_Round_Button btnUsePPortPTT { - label {Use parallel port PTT} - callback {btnTTYptt->value(false); -btnUseUHrouterPTT->value(false); - -progdefaults.TTYptt = false; -progdefaults.UsePPortPTT = o->value(); -progdefaults.UseUHrouterPTT = false; -btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true;} - xywh {74 191 170 20} down_box DOWN_BOX selection_color 1 - } - Fl_Round_Button btnUseUHrouterPTT { - label {Use uHRouter PTT} - callback {btnTTYptt->value(false); -btnUsePPortPTT->value(false); - -progdefaults.TTYptt = false; -progdefaults.UsePPortPTT = false; -progdefaults.UseUHrouterPTT = o->value(); -btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true;} - xywh {74 221 170 20} down_box DOWN_BOX selection_color 1 - } - Fl_Round_Button btnUseGPIOPTT { - label {Use GPIO PTT} - callback {btnTTYptt->value(false); -btnUsePPortPTT->value(false); -btnUseUHrouterPTT->value(false); - -progdefaults.TTYptt = false; -progdefaults.UsePPortPTT = false; -progdefaults.UseUHrouterPTT = false; -progdefaults.UseGPIOPTT = o->value(); - -btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true;} - xywh {74 252 170 20} down_box DOWN_BOX selection_color 1 - } - Fl_Counter inpGPIOPort { - label {GPIO:} - callback {btnInitHWPTT->labelcolor(FL_RED); -btnInitHWPTT->redraw(); -progdefaults.changed = true;} - tooltip {Select GPIO port} xywh {286 252 65 20} type Simple align 4 minimum 0 maximum 31 step 1 value 17 - class Fl_Counter2 - } - } - Fl_Group grpPTTdelays { - label {PTT delays valid for all CAT/PTT types} - xywh {55 284 490 91} box ENGRAVED_FRAME align 21 - } { - Fl_Counter cntPTT_on_delay { - label {Start of transmit PTT delay} - callback {progdefaults.PTT_on_delay = o->value(); -progdefaults.changed = true;} - tooltip {Delay NN msec before starting audio} xywh {74 311 100 21} align 8 minimum 0 maximum 500 step 1 - code0 {o->value(progdefaults.PTT_on_delay);} - code1 {o->lstep(10);} - } - Fl_Counter cntPTT_off_delay { - label {PTT end of transmit delay} - callback {progdefaults.PTT_off_delay = o->value(); -progdefaults.changed = true;} - tooltip {Delay NN msec before releasing PTT} xywh {74 341 100 21} align 8 minimum 0 maximum 500 step 1 - code0 {o->value(progdefaults.PTT_off_delay);} - code1 {o->lstep(10);} - } - } - } Fl_Group {} { label RigCAT open - tooltip {Rig Control using xml spec file} xywh {0 50 600 330} hide + tooltip {Rig Control using xml spec file} xywh {0 50 600 330} } { Fl_Check_Button chkUSERIGCAT { label {Use RigCAT} @@ -5110,28 +4952,31 @@ progdefaults.changed = true;} tooltip {Initialize hamlib interface} xywh {462 330 113 24} } Fl_Group listbox_sideband { - label {Sideband:} - callback {btnInitHAMLIB->labelcolor(FL_RED); -btnInitHAMLIB->redraw_label(); -btnRevertHAMLIB->activate();} open - xywh {431 222 144 22} box DOWN_BOX color 7 align 5 + label {Sideband:} open + xywh {431 210 144 22} box DOWN_BOX color 7 align 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} - Fl_Round_Button btnHamlibCMDptt { + Fl_Check_Button btnHamlibCMDptt { label {PTT via Hamlib command} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} - tooltip {PTT is a hamlib command} xywh {55 223 200 20} down_box DOWN_BOX selection_color 1 + tooltip {PTT using hamlib command} xywh {55 211 215 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibCMDptt);} } + Fl_Check_Button btnHamlibPTT_ON_DATA { + label {Audio on Auxiliary Port} + callback {progdefaults.hamlib_ptt_on_data = o->value();} + tooltip {PTT enables auxiliary audio source} xywh {55 234 215 20} down_box DOWN_BOX + code0 {o->value(progdefaults.hamlib_ptt_on_data);} + } Fl_Check_Button btnHamlibDTRplus { label {DTR +12} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} - tooltip {Initial state of DTR} xywh {55 248 90 20} down_box DOWN_BOX + tooltip {Initial state of DTR} xywh {55 257 90 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibDTRplus);} } Fl_Check_Button chkHamlibRTSplus { @@ -5141,7 +4986,7 @@ btnRevertHAMLIB->activate();} btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} - tooltip {Initial state of RTS} xywh {345 248 85 20} down_box DOWN_BOX + tooltip {Initial state of RTS} xywh {345 257 85 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibRTSplus);} } Fl_Check_Button chkHamlibRTSCTSflow { @@ -5154,7 +4999,7 @@ btnRevertHAMLIB->activate();} btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} - tooltip {Rig requires RTS/CTS flow control} xywh {55 276 170 20} down_box DOWN_BOX + tooltip {Rig requires RTS/CTS flow control} xywh {55 280 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibRTSCTSflow);} code1 {if (o->value()) chkHamlibRTSplus->deactivate();} } @@ -5165,7 +5010,7 @@ btnRevertHAMLIB->activate();} btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} - tooltip {Rig requires Xon/Xoff flow control} xywh {345 276 185 20} down_box DOWN_BOX + tooltip {Rig requires Xon/Xoff flow control} xywh {345 280 185 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibXONXOFFflow);} } Fl_Button btnRevertHAMLIB { @@ -5179,6 +5024,164 @@ hamlib_restore_defaults(); } } } + Fl_Group {} { + label {Hardware PTT} open + xywh {0 50 600 330} hide + } { + Fl_Group {} {open + xywh {55 57 490 38} box ENGRAVED_FRAME + } { + Fl_Check_Button btnPTTrightchannel { + label {PTT tone on right audio channel } + callback {progdefaults.PTTrightchannel = o->value(); +btnPTTrightchannel2->value(o->value()); +if (o->value()) { + progdefaults.QSK = false; + btnQSK->value(0); + progdefaults.PseudoFSK = false; + chkPseudoFSK->value(0); + progdefaults.sig_on_right_channel = false; + chkAudioStereoOut->value(0); +} +progdefaults.changed = true;} + tooltip {Can be used in lieu of or in addition to other PTT types} xywh {74 66 250 20} down_box DOWN_BOX + code0 {o->value(progdefaults.PTTrightchannel);} + } + } + Fl_Group grpHWPTT { + label {h/w ptt device-pin} open + xywh {55 97 490 184} box ENGRAVED_FRAME align 21 + } { + Fl_Round_Button btnTTYptt { + label {Use separate serial port PTT} + callback {btnUsePPortPTT->value(false); +btnUseUHrouterPTT->value(false); + +progdefaults.TTYptt = o->value(); +progdefaults.UsePPortPTT = false; +progdefaults.UseUHrouterPTT = false; +btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + xywh {74 121 220 20} down_box DOWN_BOX selection_color 1 + } + Fl_Group inpTTYdev { + label {Device:} + callback {btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} open + xywh {128 151 160 22} box DOWN_BOX color 7 align 4 + code0 {o->labelsize(FL_NORMAL_SIZE);} + class Fl_ComboBox + } {} + Fl_Round_Button btnRTSptt { + label {Use RTS} + callback {btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + tooltip {RTS is PTT signal line} xywh {310 120 85 20} down_box DOWN_BOX + } + Fl_Round_Button btnRTSplusV { + label {RTS = +V} + callback {btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + tooltip {Initial voltage on RTS} xywh {407 120 100 20} down_box DOWN_BOX + } + Fl_Round_Button btnDTRptt { + label {Use DTR} + callback {btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + tooltip {DTR is PTT signal line} xywh {310 150 85 20} down_box DOWN_BOX + } + Fl_Round_Button btnDTRplusV { + label {DTR = +V} + callback {btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + tooltip {Initial voltage on DTR} xywh {407 150 100 20} down_box DOWN_BOX + } + Fl_Button btnInitHWPTT { + label Initialize + callback {progdefaults.initInterface(); +o->labelcolor(FL_FOREGROUND_COLOR); +progdefaults.changed = true;} + tooltip {Initialize the H/W PTT interface} xywh {411 217 113 24} + } + Fl_Round_Button btnUsePPortPTT { + label {Use parallel port PTT} + callback {btnTTYptt->value(false); +btnUseUHrouterPTT->value(false); + +progdefaults.TTYptt = false; +progdefaults.UsePPortPTT = o->value(); +progdefaults.UseUHrouterPTT = false; +btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + xywh {74 191 170 20} down_box DOWN_BOX selection_color 1 + } + Fl_Round_Button btnUseUHrouterPTT { + label {Use uHRouter PTT} + callback {btnTTYptt->value(false); +btnUsePPortPTT->value(false); + +progdefaults.TTYptt = false; +progdefaults.UsePPortPTT = false; +progdefaults.UseUHrouterPTT = o->value(); +btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + xywh {74 221 170 20} down_box DOWN_BOX selection_color 1 + } + Fl_Round_Button btnUseGPIOPTT { + label {Use GPIO PTT} + callback {btnTTYptt->value(false); +btnUsePPortPTT->value(false); +btnUseUHrouterPTT->value(false); + +progdefaults.TTYptt = false; +progdefaults.UsePPortPTT = false; +progdefaults.UseUHrouterPTT = false; +progdefaults.UseGPIOPTT = o->value(); + +btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + xywh {74 252 170 20} down_box DOWN_BOX selection_color 1 + } + Fl_Counter inpGPIOPort { + label {GPIO:} + callback {btnInitHWPTT->labelcolor(FL_RED); +btnInitHWPTT->redraw(); +progdefaults.changed = true;} + tooltip {Select GPIO port} xywh {286 252 65 20} type Simple align 4 minimum 0 maximum 31 step 1 value 17 + class Fl_Counter2 + } + } + Fl_Group grpPTTdelays { + label {PTT delays valid for all CAT/PTT types} + xywh {55 284 490 91} box ENGRAVED_FRAME align 21 + } { + Fl_Counter cntPTT_on_delay { + label {Start of transmit PTT delay} + callback {progdefaults.PTT_on_delay = o->value(); +progdefaults.changed = true;} + tooltip {Delay NN msec before starting audio} xywh {74 311 100 21} align 8 minimum 0 maximum 500 step 1 + code0 {o->value(progdefaults.PTT_on_delay);} + code1 {o->lstep(10);} + } + Fl_Counter cntPTT_off_delay { + label {PTT end of transmit delay} + callback {progdefaults.PTT_off_delay = o->value(); +progdefaults.changed = true;} + tooltip {Delay NN msec before releasing PTT} xywh {74 341 100 21} align 8 minimum 0 maximum 500 step 1 + code0 {o->value(progdefaults.PTT_off_delay);} + code1 {o->lstep(10);} + } + } + } Fl_Group tabXMLRPC { label {XML-RPC} open xywh {0 50 600 330} hide diff --git a/src/include/confdialog.h b/src/include/confdialog.h index 726b26c6..f030e879 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -427,22 +427,6 @@ extern Fl_Counter *cnt_dft_range; extern Fl_Check_Button *btn_use_relative_dB; extern Fl_Group *tabRig; extern Fl_Tabs *tabsRig; -extern Fl_Check_Button *btnPTTrightchannel; -extern Fl_Group *grpHWPTT; -extern Fl_Round_Button *btnTTYptt; -extern Fl_ComboBox *inpTTYdev; -extern Fl_Round_Button *btnRTSptt; -extern Fl_Round_Button *btnRTSplusV; -extern Fl_Round_Button *btnDTRptt; -extern Fl_Round_Button *btnDTRplusV; -extern Fl_Button *btnInitHWPTT; -extern Fl_Round_Button *btnUsePPortPTT; -extern Fl_Round_Button *btnUseUHrouterPTT; -extern Fl_Round_Button *btnUseGPIOPTT; -extern Fl_Counter2 *inpGPIOPort; -extern Fl_Group *grpPTTdelays; -extern Fl_Counter *cntPTT_on_delay; -extern Fl_Counter *cntPTT_off_delay; extern Fl_Check_Button *chkUSERIGCAT; extern Fl_Group *grpRigCAT; extern Fl_Output *txtXmlRigFilename; @@ -481,12 +465,29 @@ extern Fl_Counter2 *cntHamlibTimeout0; extern Fl_Input2 *inpHamlibConfig; extern Fl_Button *btnInitHAMLIB; extern Fl_ListBox *listbox_sideband; -extern Fl_Round_Button *btnHamlibCMDptt; +extern Fl_Check_Button *btnHamlibCMDptt; +extern Fl_Check_Button *btnHamlibPTT_ON_DATA; extern Fl_Check_Button *btnHamlibDTRplus; extern Fl_Check_Button *chkHamlibRTSplus; extern Fl_Check_Button *chkHamlibRTSCTSflow; extern Fl_Check_Button *chkHamlibXONXOFFflow; extern Fl_Button *btnRevertHAMLIB; +extern Fl_Check_Button *btnPTTrightchannel; +extern Fl_Group *grpHWPTT; +extern Fl_Round_Button *btnTTYptt; +extern Fl_ComboBox *inpTTYdev; +extern Fl_Round_Button *btnRTSptt; +extern Fl_Round_Button *btnRTSplusV; +extern Fl_Round_Button *btnDTRptt; +extern Fl_Round_Button *btnDTRplusV; +extern Fl_Button *btnInitHWPTT; +extern Fl_Round_Button *btnUsePPortPTT; +extern Fl_Round_Button *btnUseUHrouterPTT; +extern Fl_Round_Button *btnUseGPIOPTT; +extern Fl_Counter2 *inpGPIOPort; +extern Fl_Group *grpPTTdelays; +extern Fl_Counter *cntPTT_on_delay; +extern Fl_Counter *cntPTT_off_delay; extern Fl_Group *tabXMLRPC; extern Fl_Group *grpXMLRPC; extern Fl_Check_Button *chkUSEXMLRPC; diff --git a/src/include/configuration.h b/src/include/configuration.h index 1a96b937..3d5555a5 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -992,6 +992,9 @@ ELEM_(int, HamRigStopbits, "HAMRIGSTOPBITS", \ "Hamlib stopbits <1/2>.", \ 2) /* 600 baud */ \ + ELEM_(int, hamlib_ptt_on_data, "HAMLIBPTTONDATA", \ + "Hamlib PTT for xmt audio on data port", \ + 1) \ ELEM_(std::string, XmlRigFilename, "XMLRIGFILENAME", \ "RigCAT XML file name", \ "") \ diff --git a/src/rigcontrol/hamlib.cxx b/src/rigcontrol/hamlib.cxx index e4bfd57d..9b5aa2c6 100644 --- a/src/rigcontrol/hamlib.cxx +++ b/src/rigcontrol/hamlib.cxx @@ -387,7 +387,9 @@ void hamlib_set_ptt(int ptt) return; pthread_mutex_lock(&hamlib_mutex); try { - xcvr->setPTT(ptt ? RIG_PTT_ON : RIG_PTT_OFF); + xcvr->setPTT( ptt ? + (progdefaults.hamlib_ptt_on_data ? RIG_PTT_ON_DATA : RIG_PTT_ON_MIC) : + RIG_PTT_OFF ); hamlib_bypass = ptt ? true : false; } catch (const RigException& Ex) { From e756d9355f05a280b318709fa3a15c4e0e94b15f Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 10 Jan 2016 07:31:52 -0600 Subject: [PATCH 059/138] Tab key docs * Added illustration and emended text describing Tab key operation in the Tx text buffer. --- fldigi_doxygen/images/TxCursor.png | Bin 0 -> 12783 bytes .../user_src_docs/KeyboardAndKeys.txt | 23 +++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 fldigi_doxygen/images/TxCursor.png diff --git a/fldigi_doxygen/images/TxCursor.png b/fldigi_doxygen/images/TxCursor.png new file mode 100644 index 0000000000000000000000000000000000000000..2cccdd2ccbf6e78450965c8b93d578f2ba750fea GIT binary patch literal 12783 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/Meta-R will perform the same function as the Pause/Break key -
  • Tab moves the cursor to the end of the transmitted text (which - also pauses tx). A tab press at that position moves the cursor to the - character following the last one transmitted. CW operation is slightly - different, see the help for \ref cw_page .
  • +
  • Tab moves the text insert cursor to the end of the transmitted text + (which also pauses tx). Characters entered from the keyboard will be + transmitted as entered until the tx text entry point is returned to the + end of the tx buffer. A tab press at that position returns the cursor + to the end of the text buffer. Transmitted text and text pending transmit + are color coded red and black respectively (default colors): + +
    + \image html TxCursor.png "Tx Cursor Position" + \image latex TxCursor.png "Tx Cursor Position" width=2.5in +
    + + Be aware that fldigi will NEVER transmit past the text insert cursor! You + may be caught by that behavior if you are modifying the buffer and transmitting + at the same time. Or you may have accidentally mouse clicked in the middle of + the Tx text with the result that fldigi suddenly stops transmitting. In either + case the Tab key will return the text insert cursor to the end of the tx buffer. + + CW operation is slightly different, see the help for \ref cw_page .
  • Extended UTF-8 characters can be entered into all text entry controls using Ctrl + three digits. These characters can also be entered using From 8af53b665dd41b85d61fbceab945e952903004e9 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 10 Jan 2016 10:00:59 -0600 Subject: [PATCH 060/138] Mode Set * Changed mode_set logic to use std::string vice null terminated C string * Changed modes to size NUM_MODES vice NUM_RXTX_MODES. --- src/dialogs/fl_digi.cxx | 15 ++++++++++++++- src/include/globals.h | 2 +- src/misc/configuration.cxx | 19 +++++++++++-------- src/widgets/flmisc.cxx | 2 +- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 722c7162..435d8bba 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -4490,7 +4490,7 @@ static void cb_opmode_show(Fl_Widget* w, void*) while (item != last) { if (item->label() && item->callback() == cb_init_mode) { intptr_t mode = (intptr_t)item->user_data(); - if (mode < NUM_RXTX_MODES) { + if (mode < NUM_MODES) { if (progdefaults.visible_modes.test(mode)) item->show(); else @@ -4513,14 +4513,27 @@ static void cb_opmode_show(Fl_Widget* w, void*) getMenuItem("Olivia")->show(); else getMenuItem("Olivia")->hide(); + if (progdefaults.visible_modes.test(MODE_CONTESTIA)) getMenuItem("Contestia")->show(); else getMenuItem("Contestia")->hide(); + if (progdefaults.visible_modes.test(MODE_RTTY)) getMenuItem("RTTY")->show(); else getMenuItem("RTTY")->hide(); + + if (progdefaults.visible_modes.test(MODE_IFKP)) + getMenuItem("IFKP")->show(); + else + getMenuItem("IFKP")->hide(); + + if (progdefaults.visible_modes.test(MODE_FSQ)) + getMenuItem("FSQ")->show(); + else + getMenuItem("FSQ")->hide(); + menu_[m->value()].label(OPMODES_ALL); modes_hidden = true; } diff --git a/src/include/globals.h b/src/include/globals.h index dd73c48d..e4332609 100644 --- a/src/include/globals.h +++ b/src/include/globals.h @@ -275,7 +275,7 @@ std::ostream& operator<<(std::ostream& s, const qrg_mode_t& m); std::istream& operator>>(std::istream& s, qrg_mode_t& m); #include -class mode_set_t : public std::bitset { }; +class mode_set_t : public std::bitset {}; enum band_t { BAND_160M, BAND_80M, BAND_75M, BAND_60M, BAND_40M, BAND_30M, BAND_20M, diff --git a/src/misc/configuration.cxx b/src/misc/configuration.cxx index 089223a7..8e414efc 100644 --- a/src/misc/configuration.cxx +++ b/src/misc/configuration.cxx @@ -207,26 +207,29 @@ public: void write(ostream& out) const { out << "\n" << '<' << tag << '>'; - for (size_t i = 0; i < modes.size(); i++) + for (size_t i = 0; i < modes.size(); i++) { if (!modes.test(i)) out << mode_info[i].name << ','; + } out << ",\n\n"; } void read(const char* data) { + string sdata = data, smode, tstmode; modes.set(); - for( ; data ; ) - { - const char * comma = strchr( data, ',' ); - size_t tok_len = comma ? comma - data : strlen(data); + size_t p = sdata.find(","); + while ((p != string::npos) && (p != 0)) { + smode = sdata.substr(0, p); for (size_t i = 0; i < modes.size(); i++) { - if (!strncmp(mode_info[i].name, data, tok_len )) { - modes.set(i, 0); + tstmode = mode_info[i].name; + if (smode == tstmode) { + modes.set(i,0); break; } } - data = comma ? comma + 1 : NULL ; + sdata.erase(0, p+1); + p = sdata.find(","); } } mode_set_t& modes; diff --git a/src/widgets/flmisc.cxx b/src/widgets/flmisc.cxx index f4343639..becb93bb 100644 --- a/src/widgets/flmisc.cxx +++ b/src/widgets/flmisc.cxx @@ -253,7 +253,7 @@ Mode_Browser::Mode_Browser(void) int bw = 80, bh = 20, pad = 2; modes = new Fl_Check_Browser(pad, pad, w() - pad, h() - 2 * (bh + 2 * pad)); - for (int i = 0; i < NUM_RXTX_MODES; i++) + for (int i = 0; i < NUM_MODES; i++) modes->add(mode_info[i].name); modes->callback(modes_cb, this); modes->when(FL_WHEN_CHANGED); From 42809036b072280597fcc08734d7bfa999339008 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 10 Jan 2016 19:22:11 -0600 Subject: [PATCH 061/138] WEB query * Moved URL strings for various web call sign queries to progdefaults configuration. - updated hamqth to https address for browser lookup --- src/dialogs/confdialog.cxx | 68 ++++++++++++++++++++++++++++++++++--- src/dialogs/confdialog.fl | 37 +++++++++++++++----- src/include/confdialog.h | 3 ++ src/include/configuration.h | 12 +++++++ src/logbook/lookupcall.cxx | 49 +++++++++++++++----------- 5 files changed, 137 insertions(+), 32 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index 345466b5..e948b042 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -5113,6 +5113,27 @@ progdefaults.QRZWEB = HAMQTHHTML; progdefaults.changed = true; } +Fl_Input2 *inp_qrzurl=(Fl_Input2 *)0; + +static void cb_inp_qrzurl(Fl_Input2* o, void*) { + progdefaults.qrzurl = o->value(); +progdefaults.changed=true; +} + +Fl_Input2 *inp_hamcallurl=(Fl_Input2 *)0; + +static void cb_inp_hamcallurl(Fl_Input2* o, void*) { + progdefaults.hamcallurl = o->value(); +progdefaults.changed = true; +} + +Fl_Input2 *inp_hamqthurl=(Fl_Input2 *)0; + +static void cb_inp_hamqthurl(Fl_Input2* o, void*) { + progdefaults.hamqthurl = o->value(); +progdefaults.changed = true; +} + Fl_Round_Button *btnQRZXMLnotavailable=(Fl_Round_Button *)0; static void cb_btnQRZXMLnotavailable(Fl_Round_Button* o, void*) { @@ -11113,31 +11134,70 @@ and restarted if needed.")); { Fl_Group* o = new Fl_Group(34, 56, 538, 122, _("Web Browser lookup")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { Fl_Round_Button* o = btnQRZWEBnotavailable = new Fl_Round_Button(77, 82, 337, 20, _("None")); + { Fl_Round_Button* o = btnQRZWEBnotavailable = new Fl_Round_Button(77, 79, 337, 20, _("None")); btnQRZWEBnotavailable->tooltip(_("Do not use callsign lookup via web browser")); btnQRZWEBnotavailable->down_box(FL_DOWN_BOX); btnQRZWEBnotavailable->value(1); btnQRZWEBnotavailable->callback((Fl_Callback*)cb_btnQRZWEBnotavailable); o->value(progdefaults.QRZWEB == QRZWEBNONE); } // Fl_Round_Button* btnQRZWEBnotavailable - { Fl_Round_Button* o = btnQRZonline = new Fl_Round_Button(77, 106, 337, 20, _("QRZ online via default Internet Browser")); + { Fl_Round_Button* o = btnQRZonline = new Fl_Round_Button(77, 103, 337, 20, _("QRZ..............")); btnQRZonline->tooltip(_("Visit QRZ web site")); btnQRZonline->down_box(FL_DOWN_BOX); btnQRZonline->callback((Fl_Callback*)cb_btnQRZonline); o->value(progdefaults.QRZWEB == QRZHTML); } // Fl_Round_Button* btnQRZonline - { Fl_Round_Button* o = btnHAMCALLonline = new Fl_Round_Button(77, 130, 337, 20, _("HamCall online via default Internet Browser")); + { Fl_Round_Button* o = btnHAMCALLonline = new Fl_Round_Button(77, 127, 337, 20, _("HamCall......")); btnHAMCALLonline->tooltip(_("Visit Hamcall web site")); btnHAMCALLonline->down_box(FL_DOWN_BOX); btnHAMCALLonline->callback((Fl_Callback*)cb_btnHAMCALLonline); o->value(progdefaults.QRZWEB == HAMCALLHTML); } // Fl_Round_Button* btnHAMCALLonline - { Fl_Round_Button* o = btnHamQTHonline = new Fl_Round_Button(77, 154, 337, 20, _("HamQTH via default Internet Browser")); + { Fl_Round_Button* o = btnHamQTHonline = new Fl_Round_Button(77, 151, 337, 20, _("HamQTH.....")); btnHamQTHonline->tooltip(_("Visit hamQTH web site")); btnHamQTHonline->down_box(FL_DOWN_BOX); btnHamQTHonline->callback((Fl_Callback*)cb_btnHamQTHonline); o->value(progdefaults.QRZWEB == HAMQTHHTML); } // Fl_Round_Button* btnHamQTHonline + { Fl_Input2* o = inp_qrzurl = new Fl_Input2(185, 102, 369, 22); + inp_qrzurl->box(FL_DOWN_BOX); + inp_qrzurl->color(FL_BACKGROUND2_COLOR); + inp_qrzurl->selection_color(FL_SELECTION_COLOR); + inp_qrzurl->labeltype(FL_NORMAL_LABEL); + inp_qrzurl->labelfont(0); + inp_qrzurl->labelsize(14); + inp_qrzurl->labelcolor(FL_FOREGROUND_COLOR); + inp_qrzurl->callback((Fl_Callback*)cb_inp_qrzurl); + inp_qrzurl->align(Fl_Align(FL_ALIGN_LEFT)); + inp_qrzurl->when(FL_WHEN_RELEASE); + o->value(progdefaults.qrzurl.c_str()); + } // Fl_Input2* inp_qrzurl + { Fl_Input2* o = inp_hamcallurl = new Fl_Input2(185, 126, 369, 22); + inp_hamcallurl->box(FL_DOWN_BOX); + inp_hamcallurl->color(FL_BACKGROUND2_COLOR); + inp_hamcallurl->selection_color(FL_SELECTION_COLOR); + inp_hamcallurl->labeltype(FL_NORMAL_LABEL); + inp_hamcallurl->labelfont(0); + inp_hamcallurl->labelsize(14); + inp_hamcallurl->labelcolor(FL_FOREGROUND_COLOR); + inp_hamcallurl->callback((Fl_Callback*)cb_inp_hamcallurl); + inp_hamcallurl->align(Fl_Align(FL_ALIGN_LEFT)); + inp_hamcallurl->when(FL_WHEN_RELEASE); + o->value(progdefaults.hamcallurl.c_str()); + } // Fl_Input2* inp_hamcallurl + { Fl_Input2* o = inp_hamqthurl = new Fl_Input2(185, 150, 369, 22); + inp_hamqthurl->box(FL_DOWN_BOX); + inp_hamqthurl->color(FL_BACKGROUND2_COLOR); + inp_hamqthurl->selection_color(FL_SELECTION_COLOR); + inp_hamqthurl->labeltype(FL_NORMAL_LABEL); + inp_hamqthurl->labelfont(0); + inp_hamqthurl->labelsize(14); + inp_hamqthurl->labelcolor(FL_FOREGROUND_COLOR); + inp_hamqthurl->callback((Fl_Callback*)cb_inp_hamqthurl); + inp_hamqthurl->align(Fl_Align(FL_ALIGN_LEFT)); + inp_hamqthurl->when(FL_WHEN_RELEASE); + o->value(progdefaults.hamqthurl.c_str()); + } // Fl_Input2* inp_hamqthurl o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(34, 180, 538, 195, _("Data base lookup")); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index ec93c637..0ca2e0d1 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -359,7 +359,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} Fl_Window {} { label {Fldigi configuration} open - xywh {611 168 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible + xywh {958 64 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible } { Fl_Tabs tabsConfigure {open xywh {0 0 600 380} color 50 selection_color 50 @@ -6361,33 +6361,54 @@ if (progdefaults.kml_enabled) { callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZWEBNONE; progdefaults.changed = true;} - tooltip {Do not use callsign lookup via web browser} xywh {77 82 337 20} down_box DOWN_BOX value 1 + tooltip {Do not use callsign lookup via web browser} xywh {77 79 337 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.QRZWEB == QRZWEBNONE);} } Fl_Round_Button btnQRZonline { - label {QRZ online via default Internet Browser} + label {QRZ..............} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZHTML; progdefaults.changed = true;} - tooltip {Visit QRZ web site} xywh {77 106 337 20} down_box DOWN_BOX + tooltip {Visit QRZ web site} xywh {77 103 337 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == QRZHTML);} } Fl_Round_Button btnHAMCALLonline { - label {HamCall online via default Internet Browser} + label {HamCall......} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMCALLHTML; progdefaults.changed = true;} - tooltip {Visit Hamcall web site} xywh {77 130 337 20} down_box DOWN_BOX + tooltip {Visit Hamcall web site} xywh {77 127 337 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == HAMCALLHTML);} } Fl_Round_Button btnHamQTHonline { - label {HamQTH via default Internet Browser} + label {HamQTH.....} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMQTHHTML; progdefaults.changed = true;} - tooltip {Visit hamQTH web site} xywh {77 154 337 20} down_box DOWN_BOX + tooltip {Visit hamQTH web site} xywh {77 151 337 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == HAMQTHHTML);} } + Fl_Input inp_qrzurl { + callback {progdefaults.qrzurl = o->value(); +progdefaults.changed=true;} + xywh {185 102 369 22} + code0 {o->value(progdefaults.qrzurl.c_str());} + class Fl_Input2 + } + Fl_Input inp_hamcallurl { + callback {progdefaults.hamcallurl = o->value(); +progdefaults.changed = true;} + xywh {185 126 369 22} + code0 {o->value(progdefaults.hamcallurl.c_str());} + class Fl_Input2 + } + Fl_Input inp_hamqthurl { + callback {progdefaults.hamqthurl = o->value(); +progdefaults.changed = true;} + xywh {185 150 369 22} + code0 {o->value(progdefaults.hamqthurl.c_str());} + class Fl_Input2 + } } Fl_Group {} { label {Data base lookup} open diff --git a/src/include/confdialog.h b/src/include/confdialog.h index f030e879..b0c03948 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -629,6 +629,9 @@ extern Fl_Round_Button *btnQRZWEBnotavailable; extern Fl_Round_Button *btnQRZonline; extern Fl_Round_Button *btnHAMCALLonline; extern Fl_Round_Button *btnHamQTHonline; +extern Fl_Input2 *inp_qrzurl; +extern Fl_Input2 *inp_hamcallurl; +extern Fl_Input2 *inp_hamqthurl; extern Fl_Round_Button *btnQRZXMLnotavailable; extern Fl_Round_Button *btnQRZcdrom; extern Fl_Round_Button *btnQRZsub; diff --git a/src/include/configuration.h b/src/include/configuration.h index 3d5555a5..6815d8fe 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -897,6 +897,18 @@ " 4: callook free US calls xml service; 5: hamQTH free xml service.\n" \ " The default is none.", \ QRZXMLNONE) \ + ELEM_(std::string, hamcallurl, "HAMCALLURL", \ + "web address of hamcall", \ + "http://www.hamcall.net/") \ + ELEM_(std::string, hamqthurl, "HAMQTHURL", \ + "web address of hamqth", \ + "https://www.hamqth.com/") \ + ELEM_(std::string, qrzurl, "QRZURL", \ + "web address of QRZ.com", \ + "http://www.qrz.com/") \ + ELEM_(std::string, callookurl, "CALLOOKURL", \ + "web address of callook", \ + "http://callook.info/") \ ELEM_(int, QRZWEB, "QRZWEBTYPE", \ "Callsign browser query type. Values are as follows:\n" \ " 0: none; 1: QRZ web browser; 2: HamCall web browser\n" \ diff --git a/src/logbook/lookupcall.cxx b/src/logbook/lookupcall.cxx index 306702b0..b4c220de 100644 --- a/src/logbook/lookupcall.cxx +++ b/src/logbook/lookupcall.cxx @@ -683,7 +683,8 @@ void parse_callook(string& xmlpage) bool CALLOOKGetXML(string& xmlpage) { - string url = string("http://callook.info/").append(callsign).append("/xml"); + string url = progdefaults.callookurl; + url.append(callsign).append("/xml"); bool res = fetch_http(url, xmlpage, 5.0); LOG_VERBOSE("result = %d", res); return res; @@ -769,7 +770,14 @@ bool HAMCALLget(string& htmlpage) print_query("hamcall", url_detail); - return request_reply("www.hamcall.net", "http", url_detail, htmlpage, 5.0); + string url = progdefaults.hamcallurl; + size_t p = url.find("//"); + string service = url.substr(0, p); + url.erase(0, p+2); + size_t len = url.length(); + if (url[len-1]=='/') url.erase(len-1, 1); + return request_reply(url, service, url_detail, htmlpage, 5.0); +// return request_reply("www.hamcall.net", "http", url_detail, htmlpage, 5.0); } void HAMCALLquery() @@ -797,18 +805,21 @@ static string HAMQTH_reply = ""; bool HAMQTH_get_session_id() { - string url = ""; + string url = progdefaults.hamqthurl; string retstr = ""; size_t p1 = string::npos; size_t p2 = string::npos; - url.append("http://www.hamqth.com/xml.php?u=").append(progdefaults.QRZusername); + if (url.find("https") == 0) url.erase(4,1); // change to http + url.append("xml.php?u=").append(progdefaults.QRZusername); url.append("&p=").append(progdefaults.QRZuserpassword); HAMQTH_session_id.clear(); if (!fetch_http(url, retstr, 5.0)) { +printf("fetch_http( %s, retstr, 5.0) failed\n", url.c_str()); return false; } +printf("%s\n", retstr.c_str()); p1 = retstr.find(""); if (p1 != string::npos) { p2 = retstr.find(""); @@ -950,7 +961,7 @@ void parse_HAMQTH_html(const string& htmlpage) bool HAMQTHget(string& htmlpage) { - string url = ""; + string url = progdefaults.hamqthurl; bool ret; if (HAMQTH_session_id.empty()) { if (!HAMQTH_get_session_id()) { @@ -959,7 +970,8 @@ bool HAMQTHget(string& htmlpage) return false; } } - url.append("http://www.hamqth.com/xml.php?id=").append(HAMQTH_session_id); + if (url.find("https") == 0) url.erase(4,1); // change to http + url.append("xml.php?id=").append(HAMQTH_session_id); url.append("&callsign=").append(callsign); url.append("&prg=FLDIGI"); @@ -1017,26 +1029,23 @@ void HAMQTHquery() void QRZ_DETAILS_query() { - string qrzurl = "http://www.qrz.com/db/"; - qrzurl.append(callsign); - - cb_mnuVisitURL(0, (void*)qrzurl.c_str()); + string qrz = progdefaults.qrzurl; + qrz.append("db/").append(callsign); + cb_mnuVisitURL(0, (void*)qrz.c_str()); } void HAMCALL_DETAILS_query() { - string hamcallurl = "http://www.hamcall.net/call?callsign="; - hamcallurl.append(callsign); - - cb_mnuVisitURL(0, (void*)hamcallurl.c_str()); + string hamcall = progdefaults.hamcallurl; + hamcall.append("call?callsign=").append(callsign); + cb_mnuVisitURL(0, (void*)hamcall.c_str()); } void HAMQTH_DETAILS_query() { - string hamqthurl = "http://www.hamQTH.com/"; - hamqthurl.append(callsign); - - cb_mnuVisitURL(0, (void*)hamqthurl.c_str()); + string hamqth = progdefaults.hamqthurl; + hamqth.append(callsign); + cb_mnuVisitURL(0, (void*)hamqth.c_str()); } @@ -1142,10 +1151,10 @@ void CALLSIGNquery() } break; case CALLOOK: - LOG_INFO("%s","Request sent to\nhttp://callook.info..."); + LOG_INFO("Request sent to %s", progdefaults.hamcallurl.c_str()); break; case HAMQTH: - LOG_INFO("%s","Request sent to \nhttp://hamqth.com..."); + LOG_INFO("Request sent to %s", progdefaults.hamqthurl.c_str()); break; case QRZXMLNONE: break; From 397f570665ecee9956db46aee6ea9af0e6ddccf1 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 13 Jan 2016 10:12:54 -0600 Subject: [PATCH 062/138] Audio adjust * Added Tx/Rx audio adjustment details --- fldigi_doxygen/images/win10-fldigi-fft.png | Bin 0 -> 929 bytes fldigi_doxygen/images/win10-fldigi-signal.png | Bin 0 -> 1054 bytes .../images/win10-fldigi-wf-adjust.png | Bin 0 -> 1311 bytes fldigi_doxygen/images/win10-fldigi-wf.png | Bin 0 -> 8432 bytes fldigi_doxygen/images/win10-mic-advanced.png | Bin 0 -> 9083 bytes fldigi_doxygen/images/win10-mic-levels.png | Bin 0 -> 8638 bytes .../images/win10-mic-properties.png | Bin 0 -> 11888 bytes .../images/win10-rec-properties.png | Bin 0 -> 18612 bytes fldigi_doxygen/user_src_docs/Doxyfile | 3 +- fldigi_doxygen/user_src_docs/Menus.txt | 2 +- fldigi_doxygen/user_src_docs/audio-adjust.txt | 188 ++++++++++++++++++ .../user_src_docs/fldigi_configuration.txt | 1 + .../user_src_docs/fldigi_modems.txt | 1 - fldigi_doxygen/user_src_docs/index_order.txt | 3 +- fldigi_doxygen/user_src_docs/psk.txt | 2 +- fldigi_doxygen/user_src_docs/tune.txt | 74 ------- 16 files changed, 195 insertions(+), 79 deletions(-) create mode 100644 fldigi_doxygen/images/win10-fldigi-fft.png create mode 100644 fldigi_doxygen/images/win10-fldigi-signal.png create mode 100644 fldigi_doxygen/images/win10-fldigi-wf-adjust.png create mode 100644 fldigi_doxygen/images/win10-fldigi-wf.png create mode 100644 fldigi_doxygen/images/win10-mic-advanced.png create mode 100644 fldigi_doxygen/images/win10-mic-levels.png create mode 100644 fldigi_doxygen/images/win10-mic-properties.png create mode 100644 fldigi_doxygen/images/win10-rec-properties.png create mode 100644 fldigi_doxygen/user_src_docs/audio-adjust.txt delete mode 100644 fldigi_doxygen/user_src_docs/tune.txt diff --git a/fldigi_doxygen/images/win10-fldigi-fft.png b/fldigi_doxygen/images/win10-fldigi-fft.png new file mode 100644 index 0000000000000000000000000000000000000000..a0bea0414cf7bc40348ff92d7abc440ffe580446 GIT binary patch literal 929 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 e;it-*0M_8um8j1?W7xk};3zAAQdKha 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 WU61{^?X5w;OH1vcYO(T@(EkCiQ(>e4 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/win10-rec-properties.png b/fldigi_doxygen/images/win10-rec-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..06411bf4ee16a88aca681912364c8f3aae72228b GIT binary patch literal 18612 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 button - toggles the "Tune" mode which causes fldigi to insert a tone at the current waterfall frequency. The peak-to-peak amplitude of this tone is the standard by which you should - \ref tune_page "set your transmitter drive" or adjust your antenna + \ref audio_adjust_page "set your transmitter drive" or adjust your antenna matching network.
  • The right most button is normally not visible. This is the count-down timer button that is enabled when a macro button has been diff --git a/fldigi_doxygen/user_src_docs/audio-adjust.txt b/fldigi_doxygen/user_src_docs/audio-adjust.txt new file mode 100644 index 00000000..73846bd6 --- /dev/null +++ b/fldigi_doxygen/user_src_docs/audio-adjust.txt @@ -0,0 +1,188 @@ +/** +\page audio_adjust_page RX/TX Audio Adjustment + +\tableofcontents + +\section rx_audio Receive audio + +Setting the correct hardware, operating system, and fldigi received audio +levels is not difficult, but it is the one setup procedure most often done +incorrectly. The most commonly used sound card devices contain either a +16 or 24 bit analog to digital (a/d) converter. A 16 bit a/d can provide +approximately 90 db of signal conversion. For the 16 bit converter, if the +peak audio signal that the a/d can handle is +/- 1 volt then the minimum +discernable signal (1 bit) will be +/- 30.5 microvolts. If more than a +/- 1 volt +signal is applied to the a/d input then either one of two things may occur, +(1) the audio is clipped, or (2) the audio is wrapped, large positive signals +wrap to large negative signals and vice versa. + +The objective in adjusting the Rx audio is to use the full dynamic range of the +a/d without incurring overdrive. fldigi provides a number of display controls to +assist in setting up the Rx audio. There are two controls that ONLY adjust the +visual appearance of the waterfall and DO NOT effect the a/d or the signal decoders. +These controls are below and to the left of the waterfall, "Upper signal level (dB)", and +"Signal range (dB)". + +
    +\image html win10-fldigi-wf-adjust.png "Waterfall level/range controls" +\image latex win10-fldigi-wf-adjust.png "Waterfall level/range controls" width=1.5in +
    + +Change the waterfall display to the "Scope" view. Do this by pressing the "WF" button twice if +it is currently displaying the waterfall. You can also right click once on that button. That +button acts as a rotary and is left/right click sensitive. The display should show what looks +like an oscilloscope view of the received audio. This is the entire audio signal and not just +the signal that is currently decoded. + +
    +\image html win10-fldigi-signal.png "Scope view" +\image latex win10-fldigi-signal.png "Scope view" width=1.5in +
    + +If your sound card a/d (also referred to as codec) is functioning correctly there +should be no signal offset and the signal will be centered vertically about the y-axis. Set your +transceiver to a portion of the band with digital signals, 14.070 MHz is a good spot. Now adjust +the transceiver audio output and the operating system mixer controls so that the peak signals do +not exceed the upper/lower gray lines on the display. The diamond indicator to the left of the +fldigi AFC button will be colored as follows: +
      +
    • BLACK - no signal, or insufficient Rx audio
    • +
    • GREEN - signals are in the correct range
    • +
    • YELLOW - signals are exceed 75% of maximum, but are less than 90% of maximum
    • +
    • RED - signals exceed 90% of maximum a/d capability - WARNING WILL ROBINSON!
    • +
    +You can then proceed to adjust the waterfall/fft appearance when you have the audio Rx level adjusted correctly. + +The three signal views should be similar to this with the level/range controls set to 0 and 60 respectively. The +waterfall palette used is "default.pal", and the received signal is about 20 dB above the noise floor. +
    + + + + + + +
    + \image html win10-fldigi-wf.png "Waterfall" + \image latex win10-fldigi-wf.png "Waterfal" width=1.5in + + \image html win10-fldigi-fft.png "FFT" + \image latex win10-fldigi-fft.png "FFT" width=1.5in + + \image html win10-fldigi-signal.png "Scope" + \image latex win10-fldigi-signal.png "Scope" width=1.5in +
    +
    +\section rx_win10 Windows Audio Properties +A combination of the Windows operating system and certain audio codecs needs to be accommodated. The codecs +used by devices like the SignaLink-USB, the TS590S, and recent Icom transceivers are identified by the +Windows operating system as "microphone" devices. The Windows mixer controls for that device +are then set to insert about 30 dB of gain in the signal path. To compensate most users simply lower the +transceiver audio output. The result is very poor decoding. The correct procedure is to force the Windows +mixer controls to remove that 30 dB of gain. This procedure is for Windows 10, but is similar on Windows 7, +and Windows 8. + +Right click on the task bar speaker icon and select the "Recording devices" menu item. This will open the +Sound devices dialog: +
    +\image html win10-rec-properties.png "Sound Devices" +\image latex win10-rec-properties.png "Sound Devices" width=3.5in +
    +This is the dialog on my Windows 10 test computer with a SignaLink-USB connected to a USB hub. The +SignaLink-USB shows up as a Microphone USB Audio CODEC. Right click on the device entry and +select Properties. This opens up the Microphone Properties dialog: +
    +\image html win10-mic-properties.png "Microphone Properties" +\image latex win10-mic-properties.png "Microphone Properties" width=3.5in +
    +Select the "Levels" tab and set the level to as close to 0 dB as is available: +
    +\image html win10-mic-levels.png "Microphone Level" +\image latex win10-mic-levels.png "Microphone Level" width=3.5in +
    +Then select the "Advanced" tab and change the type of converter. +
    +\image html win10-mic-advanced.png "Microphone Advanced Tab" +\image latex win10-mic-advanced.png "Microphone Advanced Tab" width=3.5in +
    +Apply and save the changes. The last step is +usually needed to insure that the settings are not lost when the operating system is closed and restarted. + + +\section tx_audio Transmit audio + +Too often you see an overdriven signals on the digital sub-bands; +multiple audio sidebands on PSK, splatter from overdriven MFSK and +RTTY. There is absolutely no reason for a transceiver driven +by fldigi to exhibit this type of performance. You can set up +your computer / transceiver for good solid performance without excessive +drive. +
    + +The "TUNE" button generates a continuous single frequency audio signal +at the exact frequency to which the waterfall cursor has been set. The peak +amplitude of this signal is the peak amplitude of every modem signal +generated by fldigi. None will exceed this value, even the simultaneous +multi-tone modes like Throb. Every modern SSB transmitter uses some automatic +level control ALC for preventing overdrive for SSB voice. A little overdrive +on a voice channel can be tolerated to a degree. In fact, that is what +an analog RF compressor does, overdrive and then subsequent filtering. +But you absolutely cannot tolerate that with the digital modes. Here is the +way to set up your transceiver for a clean signal. I recommend starting out +with a dummy load, but an "off hour" for a band might work just as well if +you do not have a dummy load. +
    + +
      +
    • For Windows users
    • +
        +
      • Set your sound card output level to the minimum on the Windows + mixer
      • +
      +
    • For Linux users
    • +
        +
      • Set your PCM level to about 80%
      • +
      • Set your Transmit Level control for minimum output level.
      • +
      +
    • Set the fldigi transmit attenuator to -3 dB (control to the left of the AFC button)
    • +
    • Set the waterfall cursor to 1000 Hz
    • +
    • Enable the "Tune" mode in fldigi ... you do have CAT or PTT set up ...right?
    • +
    • Make sure your transceiver's speech compression control is OFF
    • +
    • Slowly bring up the Mixer audio out until your rig's ALC just starts + to function (a light blinking or a meter showing this condition).
    • +
    • Reduce the Mixer audio output until the ALC is disabled.
    • +
    • You are now transmitting at maximum output power without distortion.
    • +
    • You can use the fldigi transmit attenuator to make small adjustments + in the output power to compensate for variations in the SSB transmit filter.
    • +
    + +You can use any level below this and be assured that your output signal +will be clean. All digital signals that fldigi generates will be limited to +this peak-to-peak voltage. You should always use the minimum power necessary +to maintain good comms, remember that even if you are clean at 100 W you +signal will be so strong among the QRP signals that it will overpower the +AGC on many receivers that are working another digital station within the +same SSB bandwidth that you are on. You will appreciate this the first +time that you are working a weak PSK DX station and someone blasts through +and captures your AGC. +
    + +You should try the the above adjustments at different audio +frequencies. Transceivers that achieve the SSB filtering with crystal or +mechanical filters will have a considerable amount of variation across the +passband of the filter. This will show up as a varying amount of ALC that is +dependent on the audio frequency. Once you are comfortable with the process +you can very quickly repeat the "Tune" and set the power for the frequency +to which the waterfall is set. The fldigi transmit attenuator control should +have sufficient range to compensate for transmit SSB filter variation. You +do not want to transmit (or receive) near the cutoff frequencies of the SSB +filter. The transceiver filter will introduce both phase and amplitude +distortion over the signal bandwidth. +
    + +\ref tune_page "Return to Top of Page" +
    +\ref main_page "Return to Main Page" + + +*/ diff --git a/fldigi_doxygen/user_src_docs/fldigi_configuration.txt b/fldigi_doxygen/user_src_docs/fldigi_configuration.txt index 47cf277b..1882e18a 100644 --- a/fldigi_doxygen/user_src_docs/fldigi_configuration.txt +++ b/fldigi_doxygen/user_src_docs/fldigi_configuration.txt @@ -23,6 +23,7 @@ You should initially configure the following:
  • \subpage operator_configuration_page
  • \subpage sound_card_configuration_page
  • \subpage rig_control_page
  • +
  • \subpage audio_adjust_page
  • \subpage new_installation_page
  • \subpage config_io_page
  • diff --git a/fldigi_doxygen/user_src_docs/fldigi_modems.txt b/fldigi_doxygen/user_src_docs/fldigi_modems.txt index 6decc505..39cfedc2 100644 --- a/fldigi_doxygen/user_src_docs/fldigi_modems.txt +++ b/fldigi_doxygen/user_src_docs/fldigi_modems.txt @@ -17,7 +17,6 @@
  • \subpage rtty_page
  • \subpage thor_page
  • \subpage throb_page
  • -
  • \subpage tune_page
  • \subpage wefax_page
  • \subpage wwv_tx_mode
  • \subpage mode_table_page
  • diff --git a/fldigi_doxygen/user_src_docs/index_order.txt b/fldigi_doxygen/user_src_docs/index_order.txt index 21adf252..44afdbbd 100644 --- a/fldigi_doxygen/user_src_docs/index_order.txt +++ b/fldigi_doxygen/user_src_docs/index_order.txt @@ -1,6 +1,7 @@ fldigi_configuration.txt fldigi_developer.txt fldigi_logging.txt \ fldigi_macros.txt fldigi_modems.txt fldigi_operating.txt \ New-Install.txt thumb_drive.txt colorsandfonts.txt \ +audio-adjust.txt \ configcallsigndb.txt configContestia.txt configCW.txt \ configDomEX.txt configFSQ.txt configFH.txt ConfigID.txt \ configIFKP.txt ConfigMisc.txt \ @@ -14,7 +15,7 @@ InlineMacroTags.txt atMacroTags.txt advanced_qsy.txt execmacro.txt CW.txt \ DominoEX.txt hell.txt Contestia.txt MFSK.txt MT63.txt \ FSQ.txt IFKP.txt \ Navtex.txt psk.txt Olivia.txt RTTYFSK.txt Thor.txt \ -throb.txt tune.txt WEFAX.txt WWV-xmt.txt FrequencyAnalysis.txt \ +throb.txt WEFAX.txt WWV-xmt.txt FrequencyAnalysis.txt \ DigiscopeDisplay.txt DigiWWV.txt map.txt MousingKeyboardShortcuts.txt \ Multiples.txt Notifier.txt OperatingControls.txt RST-RSQ.txt \ Spotter.txt Synop.txt TransceiverControl.txt UTF8.txt \ diff --git a/fldigi_doxygen/user_src_docs/psk.txt b/fldigi_doxygen/user_src_docs/psk.txt index 23751225..66d6ce64 100644 --- a/fldigi_doxygen/user_src_docs/psk.txt +++ b/fldigi_doxygen/user_src_docs/psk.txt @@ -183,7 +183,7 @@ better decoding than CW. Setting up for a good clean on air signal that will receive the accolades of your QSO partners is easy. Follow the instructions on using the -\ref tune_page "Tune" button and you will have a clean on signal. +\ref audio_adjust_page "Tune" button and you will have a clean on signal.
    Good reception of PSK signals requires that the demodulator be phase locked diff --git a/fldigi_doxygen/user_src_docs/tune.txt b/fldigi_doxygen/user_src_docs/tune.txt deleted file mode 100644 index 5a8639f9..00000000 --- a/fldigi_doxygen/user_src_docs/tune.txt +++ /dev/null @@ -1,74 +0,0 @@ -/** -\page tune_page TUNE - Transmit a single tone carrier. - -\tableofcontents - -\section tune TUNE Mode - -Too often you see an overdriven signals on the digital sub-bands; -multiple audio sidebands on PSK, splatter from overdriven MFSK and -RTTY. There is absolutely no reason for a transceiver driven -by fldigi to exhibit this type of performance. You can set up -your computer / transceiver for good solid performance without excessive -drive. -
    - -The "TUNE" button generates a continuous single frequency audio signal -at the exact frequency to which the waterfall cursor has been set. The peak -amplitude of this signal is the peak amplitude of every modem signal -generated by fldigi. None will exceed this value, even the simultaneous -multi-tone modes like Throb. Every modern SSB transmitter uses some automatic -level control ALC for preventing overdrive for SSB voice. A little overdrive -on a voice channel can be tolerated to a degree. In fact, that is what -an analog RF compressor does, overdrive and then subsequent filtering. -But you absolutely cannot tolerate that with the digital modes. Here is the -way to set up your transceiver for a clean signal. I recommend starting out -with a dummy load, but an "off hour" for a band might work just as well if -you do not have a dummy load. -
    - -
      -
    • For Windows users
    • -
        -
      • Set your sound card output level to the minimum on the Windows - mixer
      • -
      -
    • For Linux users
    • -
        -
      • Set your PCM level to about 80%
      • -
      • Set your Transmit Level control for minimum output level.
      • -
      -
    • Enable the "Tune" mode in fldigi ... you do have CAT or PTT set up ...right?
    • -
    • Make sure your transceiver's speech compression control is OFF
    • -
    • Slowly bring up the Mixer audio out until your rig's ALC just starts - to function (a light blinking or a meter showing this condition).
    • -
    • Reduce the Mixer audio output until the ALC is disabled.
    • -
    • You are now transmitting at maximum output power without distortion.
    • -
    - -You can use any level below this and be assured that your output signal -will be clean. All digital signals that fldigi generates will be limited to -this peak-to-peak voltage. You should always use the minimum power necessary -to maintain good comms, remember that even if you are clean at 100 W you -signal will be so strong among the QRP signals that it will overpower the -AGC on many receivers that are working another digital station within the -same SSB bandwidth that you are on. You will appreciate this the first -time that you are working a weak PSK DX station and someone blasts through -and captures your AGC. -
    - -You should try the the above adjustments at different audio -frequencies. Transceivers that achieve the SSB filtering with crystal or -mechanical filters will have a considerable amount of variation across the -passband of the filter. This will show up as a varying amount of ALC that is -dependent on the audio frequency. Once you are comfortable with the process -you can very quickly repeat the "Tune" and set the power for the frequency -to which the waterfall is set. -
    - -\ref tune_page "Return to Top of Page" -
    -\ref main_page "Return to Main Page" - - -*/ From 68c5a6a08451eb5bac344a87a95f6e84832cfdc6 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 13 Jan 2016 22:02:44 -0600 Subject: [PATCH 063/138] PSKR/8 * Fix segfault if starting pskbrowser in any of the pskr or 8psk modes --- src/include/psk.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/include/psk.h b/src/include/psk.h index 54776403..469b79b8 100644 --- a/src/include/psk.h +++ b/src/include/psk.h @@ -201,7 +201,11 @@ public: void searchDown(); void searchUp(); - void clear_viewer() { pskviewer->clear(); } + void clear_viewer() { + if (pskviewer) pskviewer->clear(); +// if ((mode >= MODE_PSK31 && mode <= MODE_PSK125) || +// (mode >= MODE_QPSK31 && mode <= MODE_QPSK125)) pskviewer->clear(); + } void clear_ch(int n) { pskviewer->clearch(n); } int viewer_get_freq(int n) { if (pskviewer) pskviewer->get_freq(n); From ddb084c599471319a14548f2dd4fad01531910d6 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 13 Jan 2016 20:16:30 -0600 Subject: [PATCH 064/138] PSKR metric * Fixed erroneous metric computation when received signal is zero - error apparant when testing with CODEC that has no applied audio - bug report by Per Crusfalk, SM0RWO --- src/psk/psk.cxx | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/psk/psk.cxx b/src/psk/psk.cxx index af1270bf..7a75ab14 100644 --- a/src/psk/psk.cxx +++ b/src/psk/psk.cxx @@ -1228,22 +1228,26 @@ void psk::rx_symbol(cmplx symbol, int car) // simple low pass filter for quality of signal double decay = SQLDECAY; double attack = SQLDECAY; + double cval = cos(n*phase); + double sval = sin(n*phase); + if (_8psk) { attack *= 2; decay *= 4; } + if (_pskr) { - attack *= 2; decay *= 10; - } + quality = cmplx( + decayavg(quality.real(), cval, decay), + decayavg(quality.imag(), sval, decay)); + } else + quality = cmplx( + decayavg(quality.real(), cval, cval > quality.real() ? attack : decay), + decayavg(quality.imag(), sval, sval > quality.real() ? attack : decay)); - double cval = cos(n*phase); - double sval = sin(n*phase); - - quality = cmplx( - decayavg(quality.real(), cval, cval > quality.real() ? attack : decay), - decayavg(quality.imag(), sval, sval > quality.real() ? attack : decay)); metric = 100.0 * norm(quality); + if (_pskr && (averageamp < 3e-5)) metric = 0; if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { //s2n reporting: rescale depending on mode, clip after scaling From c0281eea3d48c6cf695a02d6a092baff852a2d77 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sat, 16 Jan 2016 13:29:11 -0600 Subject: [PATCH 065/138] HAMLIB CW RTTY * provide selectable sideband sense selection for CW and RTTY --- src/dialogs/confdialog.cxx | 147 +++++++++++++++++--------- src/dialogs/confdialog.fl | 47 ++++++--- src/include/confdialog.h | 5 +- src/include/configuration.h | 11 ++ src/include/rigsupport.h | 16 ++- src/rigcontrol/hamlib.cxx | 202 ++++++++++++++++++++---------------- src/rigcontrol/rigio.cxx | 4 +- 7 files changed, 267 insertions(+), 165 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index e948b042..7cc07a7d 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -3991,8 +3991,6 @@ o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true; } -Fl_ListBox *listbox_sideband=(Fl_ListBox *)0; - Fl_Check_Button *btnHamlibCMDptt=(Fl_Check_Button *)0; static void cb_btnHamlibCMDptt(Fl_Check_Button*, void*) { @@ -4058,6 +4056,27 @@ hamlib_restore_defaults(); #endif } +Fl_Check_Button *chk_hamlib_cw_is_lsb=(Fl_Check_Button *)0; + +static void cb_chk_hamlib_cw_is_lsb(Fl_Check_Button* o, void*) { + progdefaults.hamlib_cw_islsb = o->value(); +} + +Fl_Check_Button *chk_hamlib_rtty_is_usb=(Fl_Check_Button *)0; + +static void cb_chk_hamlib_rtty_is_usb(Fl_Check_Button* o, void*) { + progdefaults.hamlib_rtty_isusb = o->value(); +} + +Fl_ListBox *listbox_sideband=(Fl_ListBox *)0; + +Fl_Counter2 *val_hamlib_mode_delay=(Fl_Counter2 *)0; + +static void cb_val_hamlib_mode_delay(Fl_Counter2* o, void*) { + progdefaults.hamlib_mode_delay = (int)o->value(); +progdefaults.changed = true; +} + Fl_Check_Button *btnPTTrightchannel=(Fl_Check_Button *)0; static void cb_btnPTTrightchannel(Fl_Check_Button* o, void*) { @@ -9721,7 +9740,7 @@ le Earth)")); o->value(progdefaults.HamlibWait); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibWait - { Fl_ListBox* o = listbox_baudrate = new Fl_ListBox(476, 132, 99, 22, _("Baud rate:")); + { Fl_ListBox* o = listbox_baudrate = new Fl_ListBox(476, 123, 99, 22, _("Baud rate:")); listbox_baudrate->box(FL_DOWN_BOX); listbox_baudrate->color(FL_BACKGROUND2_COLOR); listbox_baudrate->selection_color(FL_BACKGROUND_COLOR); @@ -9737,7 +9756,7 @@ le Earth)")); o->labelsize(FL_NORMAL_SIZE); listbox_baudrate->end(); } // Fl_ListBox* listbox_baudrate - { Fl_Counter2* o = valHamRigStopbits = new Fl_Counter2(480, 168, 95, 21, _("Stopbits")); + { Fl_Counter2* o = valHamRigStopbits = new Fl_Counter2(480, 148, 95, 21, _("Stopbits")); valHamRigStopbits->type(1); valHamRigStopbits->box(FL_UP_BOX); valHamRigStopbits->color(FL_BACKGROUND_COLOR); @@ -9795,7 +9814,62 @@ le Earth)")); btnInitHAMLIB->tooltip(_("Initialize hamlib interface")); btnInitHAMLIB->callback((Fl_Callback*)cb_btnInitHAMLIB); } // Fl_Button* btnInitHAMLIB - { Fl_ListBox* o = listbox_sideband = new Fl_ListBox(431, 210, 144, 22, _("Sideband:")); + { Fl_Check_Button* o = btnHamlibCMDptt = new Fl_Check_Button(55, 211, 215, 20, _("PTT via Hamlib command")); + btnHamlibCMDptt->tooltip(_("PTT using hamlib command")); + btnHamlibCMDptt->down_box(FL_DOWN_BOX); + btnHamlibCMDptt->callback((Fl_Callback*)cb_btnHamlibCMDptt); + o->value(progdefaults.HamlibCMDptt); + } // Fl_Check_Button* btnHamlibCMDptt + { Fl_Check_Button* o = btnHamlibPTT_ON_DATA = new Fl_Check_Button(55, 236, 215, 20, _("Audio on Auxiliary Port")); + btnHamlibPTT_ON_DATA->tooltip(_("PTT enables auxiliary audio source")); + btnHamlibPTT_ON_DATA->down_box(FL_DOWN_BOX); + btnHamlibPTT_ON_DATA->callback((Fl_Callback*)cb_btnHamlibPTT_ON_DATA); + o->value(progdefaults.hamlib_ptt_on_data); + } // Fl_Check_Button* btnHamlibPTT_ON_DATA + { Fl_Check_Button* o = btnHamlibDTRplus = new Fl_Check_Button(55, 261, 90, 20, _("DTR +12")); + btnHamlibDTRplus->tooltip(_("Initial state of DTR")); + btnHamlibDTRplus->down_box(FL_DOWN_BOX); + btnHamlibDTRplus->callback((Fl_Callback*)cb_btnHamlibDTRplus); + o->value(progdefaults.HamlibDTRplus); + } // Fl_Check_Button* btnHamlibDTRplus + { Fl_Check_Button* o = chkHamlibRTSplus = new Fl_Check_Button(245, 261, 85, 20, _("RTS +12")); + chkHamlibRTSplus->tooltip(_("Initial state of RTS")); + chkHamlibRTSplus->down_box(FL_DOWN_BOX); + chkHamlibRTSplus->callback((Fl_Callback*)cb_chkHamlibRTSplus); + o->value(progdefaults.HamlibRTSplus); + } // Fl_Check_Button* chkHamlibRTSplus + { Fl_Check_Button* o = chkHamlibRTSCTSflow = new Fl_Check_Button(55, 287, 170, 20, _("RTS/CTS flow control")); + chkHamlibRTSCTSflow->tooltip(_("Rig requires RTS/CTS flow control")); + chkHamlibRTSCTSflow->down_box(FL_DOWN_BOX); + chkHamlibRTSCTSflow->callback((Fl_Callback*)cb_chkHamlibRTSCTSflow); + o->value(progdefaults.HamlibRTSCTSflow); + if (o->value()) chkHamlibRTSplus->deactivate(); + } // Fl_Check_Button* chkHamlibRTSCTSflow + { Fl_Check_Button* o = chkHamlibXONXOFFflow = new Fl_Check_Button(245, 287, 185, 20, _("XON/XOFF flow control")); + chkHamlibXONXOFFflow->tooltip(_("Rig requires Xon/Xoff flow control")); + chkHamlibXONXOFFflow->down_box(FL_DOWN_BOX); + chkHamlibXONXOFFflow->callback((Fl_Callback*)cb_chkHamlibXONXOFFflow); + o->value(progdefaults.HamlibXONXOFFflow); + } // Fl_Check_Button* chkHamlibXONXOFFflow + { btnRevertHAMLIB = new Fl_Button(381, 299, 113, 24, _("Revert")); + btnRevertHAMLIB->tooltip(_("Reset hamlib interface")); + btnRevertHAMLIB->callback((Fl_Callback*)cb_btnRevertHAMLIB); + btnRevertHAMLIB->hide(); + btnRevertHAMLIB->deactivate(); + } // Fl_Button* btnRevertHAMLIB + { Fl_Check_Button* o = chk_hamlib_cw_is_lsb = new Fl_Check_Button(435, 261, 142, 20, _("CW is LSB mode")); + chk_hamlib_cw_is_lsb->tooltip(_("Check if xcvr uses LSB for CW")); + chk_hamlib_cw_is_lsb->down_box(FL_DOWN_BOX); + chk_hamlib_cw_is_lsb->callback((Fl_Callback*)cb_chk_hamlib_cw_is_lsb); + o->value(progdefaults.hamlib_cw_islsb); + } // Fl_Check_Button* chk_hamlib_cw_is_lsb + { Fl_Check_Button* o = chk_hamlib_rtty_is_usb = new Fl_Check_Button(435, 287, 152, 20, _("RTTY is USB mode")); + chk_hamlib_rtty_is_usb->tooltip(_("Check if xcvr uses USB for RTTY")); + chk_hamlib_rtty_is_usb->down_box(FL_DOWN_BOX); + chk_hamlib_rtty_is_usb->callback((Fl_Callback*)cb_chk_hamlib_rtty_is_usb); + o->value(progdefaults.hamlib_rtty_isusb); + } // Fl_Check_Button* chk_hamlib_rtty_is_usb + { Fl_ListBox* o = listbox_sideband = new Fl_ListBox(431, 235, 144, 22, _("Sideband:")); listbox_sideband->box(FL_DOWN_BOX); listbox_sideband->color(FL_BACKGROUND2_COLOR); listbox_sideband->selection_color(FL_BACKGROUND_COLOR); @@ -9808,49 +9882,26 @@ le Earth)")); o->labelsize(FL_NORMAL_SIZE); listbox_sideband->end(); } // Fl_ListBox* listbox_sideband - { Fl_Check_Button* o = btnHamlibCMDptt = new Fl_Check_Button(55, 211, 215, 20, _("PTT via Hamlib command")); - btnHamlibCMDptt->tooltip(_("PTT using hamlib command")); - btnHamlibCMDptt->down_box(FL_DOWN_BOX); - btnHamlibCMDptt->callback((Fl_Callback*)cb_btnHamlibCMDptt); - o->value(progdefaults.HamlibCMDptt); - } // Fl_Check_Button* btnHamlibCMDptt - { Fl_Check_Button* o = btnHamlibPTT_ON_DATA = new Fl_Check_Button(55, 234, 215, 20, _("Audio on Auxiliary Port")); - btnHamlibPTT_ON_DATA->tooltip(_("PTT enables auxiliary audio source")); - btnHamlibPTT_ON_DATA->down_box(FL_DOWN_BOX); - btnHamlibPTT_ON_DATA->callback((Fl_Callback*)cb_btnHamlibPTT_ON_DATA); - o->value(progdefaults.hamlib_ptt_on_data); - } // Fl_Check_Button* btnHamlibPTT_ON_DATA - { Fl_Check_Button* o = btnHamlibDTRplus = new Fl_Check_Button(55, 257, 90, 20, _("DTR +12")); - btnHamlibDTRplus->tooltip(_("Initial state of DTR")); - btnHamlibDTRplus->down_box(FL_DOWN_BOX); - btnHamlibDTRplus->callback((Fl_Callback*)cb_btnHamlibDTRplus); - o->value(progdefaults.HamlibDTRplus); - } // Fl_Check_Button* btnHamlibDTRplus - { Fl_Check_Button* o = chkHamlibRTSplus = new Fl_Check_Button(345, 257, 85, 20, _("RTS +12")); - chkHamlibRTSplus->tooltip(_("Initial state of RTS")); - chkHamlibRTSplus->down_box(FL_DOWN_BOX); - chkHamlibRTSplus->callback((Fl_Callback*)cb_chkHamlibRTSplus); - o->value(progdefaults.HamlibRTSplus); - } // Fl_Check_Button* chkHamlibRTSplus - { Fl_Check_Button* o = chkHamlibRTSCTSflow = new Fl_Check_Button(55, 280, 170, 20, _("RTS/CTS flow control")); - chkHamlibRTSCTSflow->tooltip(_("Rig requires RTS/CTS flow control")); - chkHamlibRTSCTSflow->down_box(FL_DOWN_BOX); - chkHamlibRTSCTSflow->callback((Fl_Callback*)cb_chkHamlibRTSCTSflow); - o->value(progdefaults.HamlibRTSCTSflow); - if (o->value()) chkHamlibRTSplus->deactivate(); - } // Fl_Check_Button* chkHamlibRTSCTSflow - { Fl_Check_Button* o = chkHamlibXONXOFFflow = new Fl_Check_Button(345, 280, 185, 20, _("XON/XOFF flow control")); - chkHamlibXONXOFFflow->tooltip(_("Rig requires Xon/Xoff flow control")); - chkHamlibXONXOFFflow->down_box(FL_DOWN_BOX); - chkHamlibXONXOFFflow->callback((Fl_Callback*)cb_chkHamlibXONXOFFflow); - o->value(progdefaults.HamlibXONXOFFflow); - } // Fl_Check_Button* chkHamlibXONXOFFflow - { btnRevertHAMLIB = new Fl_Button(381, 299, 113, 24, _("Revert")); - btnRevertHAMLIB->tooltip(_("Reset hamlib interface")); - btnRevertHAMLIB->callback((Fl_Callback*)cb_btnRevertHAMLIB); - btnRevertHAMLIB->hide(); - btnRevertHAMLIB->deactivate(); - } // Fl_Button* btnRevertHAMLIB + { Fl_Counter2* o = val_hamlib_mode_delay = new Fl_Counter2(480, 210, 95, 21, _("Mode delay")); + val_hamlib_mode_delay->tooltip(_("Delay NN msec after executing mode change")); + val_hamlib_mode_delay->type(1); + val_hamlib_mode_delay->box(FL_UP_BOX); + val_hamlib_mode_delay->color(FL_BACKGROUND_COLOR); + val_hamlib_mode_delay->selection_color(FL_INACTIVE_COLOR); + val_hamlib_mode_delay->labeltype(FL_NORMAL_LABEL); + val_hamlib_mode_delay->labelfont(0); + val_hamlib_mode_delay->labelsize(14); + val_hamlib_mode_delay->labelcolor(FL_FOREGROUND_COLOR); + val_hamlib_mode_delay->minimum(0); + val_hamlib_mode_delay->maximum(2000); + val_hamlib_mode_delay->step(100); + val_hamlib_mode_delay->value(200); + val_hamlib_mode_delay->callback((Fl_Callback*)cb_val_hamlib_mode_delay); + val_hamlib_mode_delay->align(Fl_Align(FL_ALIGN_LEFT)); + val_hamlib_mode_delay->when(FL_WHEN_CHANGED); + o->value(progdefaults.hamlib_mode_delay); + o->labelsize(FL_NORMAL_SIZE); + } // Fl_Counter2* val_hamlib_mode_delay grpHamlib->end(); } // Fl_Group* grpHamlib tabHamlib->end(); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 0ca2e0d1..a6411fec 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -4907,7 +4907,7 @@ btnRevertHAMLIB->activate();} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} open - xywh {476 132 99 22} box DOWN_BOX color 7 align 4 + xywh {476 123 99 22} box DOWN_BOX color 7 align 4 code0 {o->add(szBaudRates);} code1 {o->index(progdefaults.HamRigBaudrate); o->labelsize(FL_NORMAL_SIZE);} @@ -4918,7 +4918,7 @@ btnRevertHAMLIB->activate();} open callback {progdefaults.HamRigStopbits = (int)o->value(); btnRevertHAMLIB->activate(); progdefaults.changed = true;} - xywh {480 168 95 21} type Simple align 4 minimum 1 maximum 2 step 1 value 1 + xywh {480 148 95 21} type Simple align 4 minimum 1 maximum 2 step 1 value 1 code0 {o->value(progdefaults.HamRigStopbits);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 @@ -4951,12 +4951,6 @@ o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} tooltip {Initialize hamlib interface} xywh {462 330 113 24} } - Fl_Group listbox_sideband { - label {Sideband:} open - xywh {431 210 144 22} box DOWN_BOX color 7 align 4 - code0 {o->labelsize(FL_NORMAL_SIZE);} - class Fl_ListBox - } {} Fl_Check_Button btnHamlibCMDptt { label {PTT via Hamlib command} callback {btnInitHAMLIB->labelcolor(FL_RED); @@ -4968,7 +4962,7 @@ btnRevertHAMLIB->activate();} Fl_Check_Button btnHamlibPTT_ON_DATA { label {Audio on Auxiliary Port} callback {progdefaults.hamlib_ptt_on_data = o->value();} - tooltip {PTT enables auxiliary audio source} xywh {55 234 215 20} down_box DOWN_BOX + tooltip {PTT enables auxiliary audio source} xywh {55 236 215 20} down_box DOWN_BOX code0 {o->value(progdefaults.hamlib_ptt_on_data);} } Fl_Check_Button btnHamlibDTRplus { @@ -4976,7 +4970,7 @@ btnRevertHAMLIB->activate();} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} - tooltip {Initial state of DTR} xywh {55 257 90 20} down_box DOWN_BOX + tooltip {Initial state of DTR} xywh {55 261 90 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibDTRplus);} } Fl_Check_Button chkHamlibRTSplus { @@ -4986,7 +4980,7 @@ btnRevertHAMLIB->activate();} btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} - tooltip {Initial state of RTS} xywh {345 257 85 20} down_box DOWN_BOX + tooltip {Initial state of RTS} xywh {245 261 85 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibRTSplus);} } Fl_Check_Button chkHamlibRTSCTSflow { @@ -4999,7 +4993,7 @@ btnRevertHAMLIB->activate();} btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} - tooltip {Rig requires RTS/CTS flow control} xywh {55 280 170 20} down_box DOWN_BOX + tooltip {Rig requires RTS/CTS flow control} xywh {55 287 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibRTSCTSflow);} code1 {if (o->value()) chkHamlibRTSplus->deactivate();} } @@ -5010,7 +5004,7 @@ btnRevertHAMLIB->activate();} btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); btnRevertHAMLIB->activate();} - tooltip {Rig requires Xon/Xoff flow control} xywh {345 280 185 20} down_box DOWN_BOX + tooltip {Rig requires Xon/Xoff flow control} xywh {245 287 185 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibXONXOFFflow);} } Fl_Button btnRevertHAMLIB { @@ -5022,6 +5016,33 @@ hamlib_restore_defaults(); \#endif} tooltip {Reset hamlib interface} xywh {381 299 113 24} hide deactivate } + Fl_Check_Button chk_hamlib_cw_is_lsb { + label {CW is LSB mode} + callback {progdefaults.hamlib_cw_islsb = o->value();} + tooltip {Check if xcvr uses LSB for CW} xywh {435 261 142 20} down_box DOWN_BOX + code0 {o->value(progdefaults.hamlib_cw_islsb);} + } + Fl_Check_Button chk_hamlib_rtty_is_usb { + label {RTTY is USB mode} + callback {progdefaults.hamlib_rtty_isusb = o->value();} + tooltip {Check if xcvr uses USB for RTTY} xywh {435 287 152 20} down_box DOWN_BOX + code0 {o->value(progdefaults.hamlib_rtty_isusb);} + } + Fl_Group listbox_sideband { + label {Sideband:} open + xywh {431 235 144 22} box DOWN_BOX color 7 align 4 + code0 {o->labelsize(FL_NORMAL_SIZE);} + class Fl_ListBox + } {} + Fl_Counter val_hamlib_mode_delay { + label {Mode delay} + callback {progdefaults.hamlib_mode_delay = (int)o->value(); +progdefaults.changed = true;} + tooltip {Delay NN msec after executing mode change} xywh {480 210 95 21} type Simple align 4 minimum 0 maximum 2000 step 100 value 200 + code0 {o->value(progdefaults.hamlib_mode_delay);} + code1 {o->labelsize(FL_NORMAL_SIZE);} + class Fl_Counter2 + } } } Fl_Group {} { diff --git a/src/include/confdialog.h b/src/include/confdialog.h index b0c03948..5c4b7e55 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -464,7 +464,6 @@ extern Fl_Counter2 *valHamRigStopbits; extern Fl_Counter2 *cntHamlibTimeout0; extern Fl_Input2 *inpHamlibConfig; extern Fl_Button *btnInitHAMLIB; -extern Fl_ListBox *listbox_sideband; extern Fl_Check_Button *btnHamlibCMDptt; extern Fl_Check_Button *btnHamlibPTT_ON_DATA; extern Fl_Check_Button *btnHamlibDTRplus; @@ -472,6 +471,10 @@ extern Fl_Check_Button *chkHamlibRTSplus; extern Fl_Check_Button *chkHamlibRTSCTSflow; extern Fl_Check_Button *chkHamlibXONXOFFflow; extern Fl_Button *btnRevertHAMLIB; +extern Fl_Check_Button *chk_hamlib_cw_is_lsb; +extern Fl_Check_Button *chk_hamlib_rtty_is_usb; +extern Fl_ListBox *listbox_sideband; +extern Fl_Counter2 *val_hamlib_mode_delay; extern Fl_Check_Button *btnPTTrightchannel; extern Fl_Group *grpHWPTT; extern Fl_Round_Button *btnTTYptt; diff --git a/src/include/configuration.h b/src/include/configuration.h index 6815d8fe..fe52acd0 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -1007,6 +1007,17 @@ ELEM_(int, hamlib_ptt_on_data, "HAMLIBPTTONDATA", \ "Hamlib PTT for xmt audio on data port", \ 1) \ + ELEM_(bool, hamlib_cw_islsb, "HAMLIB_CW_ISLSB", \ + "Hamlib xcvr uses LSB for CW", \ + false) \ + ELEM_(bool, hamlib_rtty_isusb, "HAMLIB_RTTY_ISUSB", \ + "Hamlib xcvr uses USB for RTTY", \ + false) \ + ELEM_(int, hamlib_mode_delay, "HAMRIG_MODE_DELAY", \ + "wait NN msec after sending mode change\n" \ + "before next transceiver CAT query\n" \ + "0 - 2000 in 100 msec increments", \ + 200) \ ELEM_(std::string, XmlRigFilename, "XMLRIGFILENAME", \ "RigCAT XML file name", \ "") \ diff --git a/src/include/rigsupport.h b/src/include/rigsupport.h index eaf0b972..bec3b759 100644 --- a/src/include/rigsupport.h +++ b/src/include/rigsupport.h @@ -73,17 +73,20 @@ extern bool ModeIsLSB(std::string); extern bool init_Hamlib_RigDialog(); extern void selMode(rmode_t m); extern std::string modeString(rmode_t m); +extern bool hamlib_USB(); +extern bool hamlib_active(); #endif // xmlrpc_rig specific extern bool connected_to_flrig; + extern void xmlrpc_rig_set_qsy(long long rfc); +extern bool xmlrpc_USB(); -//using namespace XmlRpc; -//using namespace std; - +extern void FLRIG_set_flrig_ab(int n); extern void FLRIG_start_flrig_thread(); + extern void stop_flrig_thread(); extern void reconnect_to_flrig(); extern void set_flrig_ptt(int on); @@ -91,14 +94,7 @@ extern void set_flrig_freq(long int fr); extern void set_flrig_mode(const char *md); extern void set_flrig_bw(int bw1, int bw2 = 0); extern void set_flrig_notch(); -extern bool xmlrpc_USB(); -extern void FLRIG_set_flrig_ab(int n); - -//------------------------------------------------------------------------------ -// flrig xmlrpc client support -//------------------------------------------------------------------------------ -extern bool connected_to_flrig; //------------------------------------------------------------------------------ #endif diff --git a/src/rigcontrol/hamlib.cxx b/src/rigcontrol/hamlib.cxx index 9b5aa2c6..dae03c61 100644 --- a/src/rigcontrol/hamlib.cxx +++ b/src/rigcontrol/hamlib.cxx @@ -376,6 +376,7 @@ void hamlib_close(void) bool hamlib_active(void) { + if (!xcvr) return false; return (xcvr->isOnLine()); } @@ -385,25 +386,24 @@ void hamlib_set_ptt(int ptt) return; if (!hamlib_ptt) return; - pthread_mutex_lock(&hamlib_mutex); - try { - xcvr->setPTT( ptt ? - (progdefaults.hamlib_ptt_on_data ? RIG_PTT_ON_DATA : RIG_PTT_ON_MIC) : - RIG_PTT_OFF ); - hamlib_bypass = ptt ? true : false; - } - catch (const RigException& Ex) { - show_error("Rig PTT", Ex.what()); - hamlib_ptt = false; - } - pthread_mutex_unlock(&hamlib_mutex); + guard_lock hamlib(&hamlib_mutex); + try { + xcvr->setPTT( ptt ? + (progdefaults.hamlib_ptt_on_data ? RIG_PTT_ON_DATA : RIG_PTT_ON_MIC) : + RIG_PTT_OFF ); + hamlib_bypass = ptt ? true : false; + } + catch (const RigException& Ex) { + show_error("Rig PTT", Ex.what()); + hamlib_ptt = false; + } } void hamlib_set_qsy(long long f) { if (xcvr->isOnLine() == false) return; - pthread_mutex_lock(&hamlib_mutex); + guard_lock hamlib(&hamlib_mutex); double fdbl = f; hamlib_qsy = false; try { @@ -415,61 +415,62 @@ void hamlib_set_qsy(long long f) show_error("QSY", Ex.what()); hamlib_passes = 0; } - pthread_mutex_unlock(&hamlib_mutex); } int hamlib_setfreq(long f) { if (xcvr->isOnLine() == false) return -1; - pthread_mutex_lock(&hamlib_mutex); - try { - LOG_DEBUG("%ld", f); - xcvr->setFreq(f); - } - catch (const RigException& Ex) { - show_error("SetFreq", Ex.what()); - hamlib_passes = 0; - } - pthread_mutex_unlock(&hamlib_mutex); + guard_lock hamlib(&hamlib_mutex); + try { + LOG_DEBUG("%ld", f); + xcvr->setFreq(f); + } + catch (const RigException& Ex) { + show_error("SetFreq", Ex.what()); + hamlib_passes = 0; + } return 1; } +static int hamlib_wait = 0; + int hamlib_setmode(rmode_t m) { if (need_mode == false) return -1; if (xcvr->isOnLine() == false) return -1; - pthread_mutex_lock(&hamlib_mutex); - try { - hamlib_rmode = xcvr->getMode(hamlib_pbwidth); - xcvr->setMode(m, hamlib_pbwidth); - hamlib_rmode = m; - } - catch (const RigException& Ex) { - show_error("Set Mode", Ex.what()); - hamlib_passes = 0; - } - pthread_mutex_unlock(&hamlib_mutex); + guard_lock hamlib(&hamlib_mutex); + try { + hamlib_rmode = xcvr->getMode(hamlib_pbwidth); + xcvr->setMode(m, hamlib_pbwidth); + hamlib_rmode = m; + } + catch (const RigException& Ex) { + show_error("Set Mode", Ex.what()); + hamlib_passes = 0; + } + hamlib_wait = progdefaults.hamlib_mode_delay / 100; return 1; } +// width control via hamlib is not implemented + int hamlib_setwidth(pbwidth_t w) { if (xcvr->isOnLine() == false) return -1; - pthread_mutex_lock(&hamlib_mutex); - try { - hamlib_rmode = xcvr->getMode(hamlib_pbwidth); - xcvr->setMode(hamlib_rmode, w); - hamlib_pbwidth = w; - } - catch (const RigException& Ex) { - show_error("Set Width", Ex.what()); - hamlib_passes = 0; - } - pthread_mutex_unlock(&hamlib_mutex); + guard_lock hamlib(&hamlib_mutex); + try { + hamlib_rmode = xcvr->getMode(hamlib_pbwidth); + xcvr->setMode(hamlib_rmode, w); + hamlib_pbwidth = w; + } + catch (const RigException& Ex) { + show_error("Set Width", Ex.what()); + hamlib_passes = 0; + } return 1; } @@ -483,13 +484,41 @@ pbwidth_t hamlib_getwidth() return hamlib_pbwidth; } +bool hamlib_USB() +{ + if (hamlib_wait) return wf->USB(); + bool islsb = false; + if (progdefaults.HamlibSideband == SIDEBAND_RIG) { + islsb = (hamlib_rmode == RIG_MODE_LSB || + hamlib_rmode == RIG_MODE_PKTLSB || + hamlib_rmode == RIG_MODE_ECSSLSB); + if (hamlib_rmode == RIG_MODE_CW) { + if (progdefaults.hamlib_cw_islsb) islsb = true; + else islsb = false; + } + if (hamlib_rmode == RIG_MODE_CWR) { + if (progdefaults.hamlib_cw_islsb) islsb = false; + else islsb = true; + } + if (hamlib_rmode == RIG_MODE_RTTY) { + if (progdefaults.hamlib_rtty_isusb) islsb = false; + else islsb = true; + } + if (hamlib_rmode == RIG_MODE_RTTYR) { + if (progdefaults.hamlib_rtty_isusb) islsb = true; + else islsb = false; + } + } else if (progdefaults.HamlibSideband == SIDEBAND_LSB) + islsb = true; + return !islsb; +} + static void *hamlib_loop(void *args) { SET_THREAD_ID(RIGCTL_TID); long int freq = 0L; rmode_t numode = RIG_MODE_NONE; - bool freqok = false, modeok = false; for (;;) { MilliSleep(100); @@ -497,66 +526,55 @@ static void *hamlib_loop(void *args) break; if (hamlib_bypass) continue; -// hamlib locked while accessing hamlib serial i/o - pthread_mutex_lock(&hamlib_mutex); + if (hamlib_wait) { + hamlib_wait--; + continue; + } - if (need_freq) { - freq_t f; - try { - f = xcvr->getFreq(); - freq = (long int) f; - freqok = true; - if (freq == 0) { - pthread_mutex_unlock(&hamlib_mutex); - continue; + { + guard_lock hamlib(&hamlib_mutex); + if (need_freq) { + freq_t f; + try { + f = xcvr->getFreq(); + freq = (long int) f; + if (freq == 0) continue; + hamlib_freq = freq; + show_frequency(hamlib_freq); + wf->rfcarrier(hamlib_freq); + } + catch (const RigException& Ex) { + show_error(__func__, "Rig not responding: freq"); } - } - catch (const RigException& Ex) { - show_error(__func__, "Rig not responding: freq"); - freqok = false; } } if (hamlib_exit) break; + if (hamlib_bypass) + continue; - if (need_mode && hamlib_rmode == numode) { - try { - numode = xcvr->getMode(hamlib_pbwidth); - modeok = true; - } - catch (const RigException& Ex) { - show_error(__func__, "Rig not responding: mode"); - modeok = false; + { + guard_lock hamlib(&hamlib_mutex); + if (need_mode) { + try { + numode = xcvr->getMode(hamlib_pbwidth); + if (numode != hamlib_rmode) { + hamlib_rmode = numode; + show_mode(modeString(hamlib_rmode)); + wf->USB(hamlib_USB()); + } + } + catch (const RigException& Ex) { + show_error(__func__, "Rig not responding: mode"); + } } } - pthread_mutex_unlock(&hamlib_mutex); if (hamlib_exit) break; if (hamlib_bypass) continue; - if (freqok && freq && (freq != hamlib_freq)) { - hamlib_freq = freq; - show_frequency(hamlib_freq); - wf->rfcarrier(hamlib_freq); - } - - if (modeok && (hamlib_rmode != numode)) { - hamlib_rmode = numode; - show_mode(modeString(hamlib_rmode)); - if (progdefaults.HamlibSideband != SIDEBAND_RIG) - wf->USB(progdefaults.HamlibSideband == SIDEBAND_USB); - else - wf->USB(!(hamlib_rmode == RIG_MODE_LSB || - hamlib_rmode == RIG_MODE_CWR || - hamlib_rmode == RIG_MODE_PKTLSB || - hamlib_rmode == RIG_MODE_ECSSLSB || - hamlib_rmode == RIG_MODE_RTTY)); - } - - if (hamlib_exit) - break; } hamlib_closed = true; diff --git a/src/rigcontrol/rigio.cxx b/src/rigcontrol/rigio.cxx index 05026959..9b4e075e 100644 --- a/src/rigcontrol/rigio.cxx +++ b/src/rigcontrol/rigio.cxx @@ -1285,7 +1285,9 @@ void rigCAT_set_qsy(long long f) bool ModeIsLSB(string s) { if (connected_to_flrig) return !xmlrpc_USB(); - +#if USE_HAMLIB + if (hamlib_active()) return !hamlib_USB(); +#endif list::iterator pM = LSBmodes.begin(); while (pM != LSBmodes.end() ) { if (*pM == s) From f5e3186dd8a8580947ddd497f8299b2680bfdcd9 Mon Sep 17 00:00:00 2001 From: David Freese Date: Mon, 18 Jan 2016 19:59:07 -0600 Subject: [PATCH 066/138] LOG RECORD exports * Added these log entry variables to the export environment list - FLDIGI_LOG_STATE - FLDIGI_LOG_COUNTRY - FLDIGI_LOG_SERNO_IN - FLDIGI_LOG_SERNO_OUT - FLDIGI_XCHG_IN - FLDIGI_XCHG_OUT - FLDIGI_VE_PROV * Added LOGBOOK log entry variables to the export environment list - FLDIGI_LOGBOOK_CALL - FLDIGI_LOGBOOK_NAME - FLDIGI_LOGBOOK_DATE - FLDIGI_LOGBOOK_TIME_ON - FLDIGI_LOGBOOK_DATE_OFF - FLDIGI_LOGBOOK_TIME_OFF - FLDIGI_LOGBOOK_RST_IN - FLDIGI_LOGBOOK_RST_OUT - FLDIGI_LOGBOOK_FREQUENCY - FLDIGI_LOGBOOK_MODE - FLDIGI_LOGBOOK_STATE - FLDIGI_LOGBOOK_VE_PROV - FLDIGI_LOGBOOK_COUNTRY - FLDIGI_LOGBOOK_SERNO_IN - FLDIGI_LOGBOOK_SERNO_OUT - FLDIGI_LOGBOOK_XCHG_IN - FLDIGI_LOGBOOK_XCHG_OUT - FLDIGI_LOGBOOK_QTH - FLDIGI_LOGBOOK_LOCATOR - FLDIGI_LOGBOOK_QSL_R - FLDIGI_LOGBOOK_QSL_S - FLDIGI_LOGBOOK_NOTES - FLDIGI_LOGBOOK_TX_PWR - FLDIGI_LOGBOOK_COUNTY - FLDIGI_LOGBOOK_IOTA - FLDIGI_LOGBOOK_DXCC - FLDIGI_LOGBOOK_QSL_VIA - FLDIGI_LOGBOOK_CONTINENT - FLDIGI_LOGBOOK_CQZ - FLDIGI_LOGBOOK_ITUZ * Enable temp/log.adif for all OS, was just WIN and OS X --- src/logger/logger.cxx | 4 -- src/misc/macros.cxx | 131 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 119 insertions(+), 16 deletions(-) diff --git a/src/logger/logger.cxx b/src/logger/logger.cxx index 9c271a92..7f49a381 100644 --- a/src/logger/logger.cxx +++ b/src/logger/logger.cxx @@ -61,8 +61,6 @@ static string notes; //============================================================================= -//#if defined(__WOE32__) || defined(__APPLE__) - static string adif; void writeADIF () { @@ -131,8 +129,6 @@ void submit_ADIF(cQsoRec &rec) writeADIF(); } -//#endif - //--------------------------------------------------------------------- // the following IPC message is compatible with xlog remote data spec. //--------------------------------------------------------------------- diff --git a/src/misc/macros.cxx b/src/misc/macros.cxx index 6421bb2b..5733d859 100644 --- a/src/misc/macros.cxx +++ b/src/misc/macros.cxx @@ -2782,21 +2782,81 @@ void set_macro_env(void) #ifndef __WOE32__ pSKEDH, FLDIGI_RX_IPC_KEY, FLDIGI_TX_IPC_KEY, #endif - FLDIGI_XMLRPC_ADDRESS, FLDIGI_XMLRPC_PORT, - FLDIGI_ARQ_ADDRESS, FLDIGI_ARQ_PORT, + FLDIGI_XMLRPC_ADDRESS, + FLDIGI_XMLRPC_PORT, + FLDIGI_ARQ_ADDRESS, + FLDIGI_ARQ_PORT, - FLDIGI_VERSION_ENVVAR, FLDIGI_PID, FLDIGI_CONFIG_DIR, + FLDIGI_VERSION_ENVVAR, + FLDIGI_PID, + FLDIGI_CONFIG_DIR, - FLDIGI_MY_CALL, FLDIGI_MY_NAME, FLDIGI_MY_LOCATOR, + FLDIGI_MY_CALL, + FLDIGI_MY_NAME, + FLDIGI_MY_LOCATOR, - FLDIGI_MODEM, FLDIGI_MODEM_LONG_NAME, FLDIGI_DIAL_FREQUENCY, - FLDIGI_AUDIO_FREQUENCY, FLDIGI_FREQUENCY, + FLDIGI_MODEM, + FLDIGI_MODEM_LONG_NAME, + FLDIGI_DIAL_FREQUENCY, + FLDIGI_AUDIO_FREQUENCY, + FLDIGI_FREQUENCY, FLDIGI_MACRO_FILE, + FLDIGI_LOG_FILE, - FLDIGI_LOG_FREQUENCY, FLDIGI_LOG_TIME_ON, FLDIGI_LOG_TIME_OFF, FLDIGI_LOG_CALL, FLDIGI_LOG_NAME, - FLDIGI_LOG_RST_IN, FLDIGI_LOG_RST_OUT, FLDIGI_LOG_QTH, FLDIGI_LOG_LOCATOR, - FLDIGI_LOG_NOTES, FLDIGI_AZ, ENV_SIZE + FLDIGI_LOG_FREQUENCY, + FLDIGI_LOG_DATE, + FLDIGI_LOG_DATE_OFF, + FLDIGI_LOG_TIME_ON, + FLDIGI_LOG_TIME_OFF, + FLDIGI_LOG_CALL, + FLDIGI_LOG_NAME, + FLDIGI_LOG_RST_IN, + FLDIGI_LOG_RST_OUT, + FLDIGI_LOG_QTH, + FLDIGI_LOG_LOCATOR, + FLDIGI_LOG_NOTES, + FLDIGI_LOG_STATE, + FLDIGI_LOG_COUNTRY, + FLDIGI_LOG_SERNO_IN, + FLDIGI_LOG_SERNO_OUT, + FLDIGI_XCHG_IN, + FLDIGI_XCGH_OUT, + FLDIGI_VE_PROV, + FLDIGI_AZ, + + FLDIGI_LOGBOOK_CALL, + FLDIGI_LOGBOOK_NAME, + FLDIGI_LOGBOOK_DATE, + FLDIGI_LOGBOOK_TIME_ON, + FLDIGI_LOGBOOK_DATE_OFF, + FLDIGI_LOGBOOK_TIME_OFF, + FLDIGI_LOGBOOK_RST_IN, + FLDIGI_LOGBOOK_RST_OUT, + FLDIGI_LOGBOOK_FREQUENCY, + FLDIGI_LOGBOOK_MODE, + FLDIGI_LOGBOOK_STATE, + FLDIGI_LOGBOOK_VE_PROV, + FLDIGI_LOGBOOK_COUNTRY, + FLDIGI_LOGBOOK_SERNO_IN, + FLDIGI_LOGBOOK_SERNO_OUT, + FLDIGI_LOGBOOK_XCHG_IN, + FLDIGI_LOGBOOK_XCHG_OUT, + FLDIGI_LOGBOOK_QTH, + FLDIGI_LOGBOOK_LOCATOR, + FLDIGI_LOGBOOK_QSL_R, + FLDIGI_LOGBOOK_QSL_S, + FLDIGI_LOGBOOK_NOTES, + FLDIGI_LOGBOOK_TX_PWR, + FLDIGI_LOGBOOK_COUNTY, + FLDIGI_LOGBOOK_IOTA, + FLDIGI_LOGBOOK_DXCC, + FLDIGI_LOGBOOK_QSL_VIA, + FLDIGI_LOGBOOK_CONTINENT, + FLDIGI_LOGBOOK_CQZ, + FLDIGI_LOGBOOK_ITUZ, + + ENV_SIZE }; struct { @@ -2831,7 +2891,10 @@ void set_macro_env(void) { "FLDIGI_MACRO_FILE", progStatus.LastMacroFile.c_str() }, { "FLDIGI_LOG_FILE", progdefaults.logbookfilename.c_str() }, + { "FLDIGI_LOG_FREQUENCY", inpFreq->value() }, + { "FLDIGI_LOG_DATE", inpDate_log->value() }, + { "FLDIGI_LOG_DATE_OFF", inpDateOff_log->value() }, { "FLDIGI_LOG_TIME_ON", inpTimeOn->value() }, { "FLDIGI_LOG_TIME_OFF", inpTimeOff->value() }, { "FLDIGI_LOG_CALL", inpCall->value() }, @@ -2841,7 +2904,46 @@ void set_macro_env(void) { "FLDIGI_LOG_QTH", inpQth->value() }, { "FLDIGI_LOG_LOCATOR", inpLoc->value() }, { "FLDIGI_LOG_NOTES", inpNotes->value() }, - { "FLDIGI_AZ", inpAZ->value() } + { "FLDIGI_LOG_STATE", inpState->value() }, + { "FLDIGI_LOG_COUNTRY", inpCountry->value() }, + { "FLDIGI_LOG_SERNO_IN", inpSerNo->value() }, + { "FLDIGI_LOG_SERNO_OUT", outSerNo->value() }, + { "FLDIGI_XCHG_IN", inpXchgIn->value() }, + { "FLDIGI_XCHG_OUT", inpSend1->value() }, + { "FLDIGI_VE_PROV", inpVEprov->value() }, + { "FLDIGI_AZ", inpAZ->value() }, + + { "FLDIGI_LOGBOOK_CALL", inpCall_log->value() }, + { "FLDIGI_LOGBOOK_NAME", inpName_log->value () }, + { "FLDIGI_LOGBOOK_DATE", inpDate_log->value() }, + { "FLDIGI_LOGBOOK_TIME_ON", inpTimeOn_log->value() }, + { "FLDIGI_LOGBOOK_DATE_OFF", inpDateOff_log->value() }, + { "FLDIGI_LOGBOOK_TIME_OFF", inpTimeOff_log->value() }, + { "FLDIGI_LOGBOOK_RST_IN", inpRstR_log->value() }, + { "FLDIGI_LOGBOOK_RST_OUT", inpRstS_log->value() }, + { "FLDIGI_LOGBOOK_FREQUENCY", inpFreq_log->value() }, + { "FLDIGI_LOGBOOK_MODE", inpMode_log->value() }, + { "FLDIGI_LOGBOOK_STATE", inpState_log->value() }, + { "FLDIGI_LOGBOOK_VE_PROV", inpVE_Prov_log->value() }, + { "FLDIGI_LOGBOOK_COUNTRY", inpCountry_log->value() }, + { "FLDIGI_LOGBOOK_SERNO_IN", inpSerNoIn_log->value() }, + { "FLDIGI_LOGBOOK_SERNO_OUT", inpSerNoOut_log->value() }, + { "FLDIGI_LOGBOOK_XCHG_IN", inpXchgIn_log->value() }, + { "FLDIGI_LOGBOOK_XCHG_OUT", inpMyXchg_log->value() }, + { "FLDIGI_LOGBOOK_QTH", inpQth_log->value() }, + { "FLDIGI_LOGBOOK_LOCATOR", inpLoc_log->value() }, + { "FLDIGI_LOGBOOK_QSL_R", inpQSLrcvddate_log->value() }, + { "FLDIGI_LOGBOOK_QSL_S", inpQSLsentdate_log->value() }, + { "FLDIGI_LOGBOOK_NOTES", inpNotes_log->value() }, + { "FLDIGI_LOGBOOK_TX_PWR", inpTX_pwr_log->value() }, + { "FLDIGI_LOGBOOK_COUNTY", inpCNTY_log->value() }, + { "FLDIGI_LOGBOOK_IOTA", inpIOTA_log->value() }, + { "FLDIGI_LOGBOOK_DXCC", inpDXCC_log->value() }, + { "FLDIGI_LOGBOOK_QSL_VIA", inpQSL_VIA_log->value() }, + { "FLDIGI_LOGBOOK_CONTINENT", inpCONT_log->value() }, + { "FLDIGI_LOGBOOK_CQZ", inpCQZ_log->value() }, + { "FLDIGI_LOGBOOK_ITUZ", inpITUZ_log->value() } + }; #ifndef __WOE32__ @@ -2886,8 +2988,13 @@ void set_macro_env(void) unsetenv("MALLOC_PERTURB_"); #endif - for (size_t j = 0; j < ENV_SIZE; j++) - setenv(env[j].var, env[j].val, 1); + string temp; + size_t pch; + for (size_t j = 0; j < ENV_SIZE; j++) { + temp = env[j].val; + while ((pch = temp.find("\n")) != string::npos) temp[pch] = ';'; + setenv(env[j].var, temp.c_str(), 1); + } string path = getenv("PATH"); string mypath = ScriptsDir; From ebc00ed17d194c2782c7bb5ecf8d8b28b325cf6d Mon Sep 17 00:00:00 2001 From: David Freese Date: Tue, 19 Jan 2016 21:41:35 -0600 Subject: [PATCH 067/138] OS-X start_process * Add App recognition --- src/main.cxx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main.cxx b/src/main.cxx index 78c4ff66..39132dfb 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -222,6 +222,16 @@ void start_process(string executable) CloseHandle(pi.hThread); free(cmd); #else +#ifdef __APPLE__ + if (executable.find(".app") == (executable.length() - 4)) { + std::string progname = executable; + size_t p = progname.find("/", 1); + if (p != std::string::npos) progname.erase(0,p+1); + p = progname.find("-"); + if (p != std::string::npos) progname.erase(p); + executable.append("/Contents/MacOS/").append(progname); + } +#endif switch (fork()) { case -1: LOG_PERROR("fork"); From e821e49c5b9be2742259a658467fc42a4ff8c090 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 20 Jan 2016 06:39:40 -0600 Subject: [PATCH 068/138] Contest fields * Adjust width of exchange in logging field --- src/dialogs/fl_digi.cxx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 435d8bba..c759cea5 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -5921,23 +5921,27 @@ void create_fl_digi_main_primary() { QsoInfoFrame1A->end(); QsoInfoFrame1B = new Fl_Group ( - rightof(btnQRZ) + pad, - y3, + rightof(btnQRZ) + pad, y3, wf1, Hentry + pad); outSerNo1 = new Fl_Input2( - inpFreq1->x(), y3, 40, Hentry, "#out"); + inpFreq1->x(), y3, 40, Hentry, + "# S"); outSerNo1->align(FL_ALIGN_LEFT); outSerNo1->tooltip(_("Sent serial number (read only)")); outSerNo1->type(FL_NORMAL_OUTPUT); inpSerNo1 = new Fl_Input2( - rightof(outSerNo1) + pad, y3, 40, Hentry, "#in"); + rightof(outSerNo1) + pad, y3, + 40, Hentry, + "# R"); inpSerNo1->align(FL_ALIGN_LEFT); inpSerNo1->tooltip(_("Received serial number")); inpXchgIn1 = new Fl_Input2( - rightof(inpSerNo1) + pad + 10, y3, 237, Hentry, "Xch"); + rightof(inpSerNo1) + pad + 14, y3, + inpAZ->x() + inpAZ->w() - (rightof(inpSerNo1) + pad + 14), Hentry, + "Xch"); inpXchgIn1->align(FL_ALIGN_LEFT); inpXchgIn1->tooltip(_("Contest exchange in")); From 10266d2ecb5e6cc9379bae8224edbeb05b9b5ea3 Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 20 Jan 2016 14:12:31 -0600 Subject: [PATCH 069/138] Exit delays * thread shut down processes to provide additional logging info * speed up shut down process --- src/logbook/adif_io.cxx | 2 + src/rigcontrol/rigio.cxx | 91 ++++++++++++++--------------------- src/rigcontrol/xmlrpc_rig.cxx | 15 ++++-- src/trx/trx.cxx | 4 ++ 4 files changed, 53 insertions(+), 59 deletions(-) diff --git a/src/logbook/adif_io.cxx b/src/logbook/adif_io.cxx index e09d1bd1..ad55d1b4 100644 --- a/src/logbook/adif_io.cxx +++ b/src/logbook/adif_io.cxx @@ -622,12 +622,14 @@ void ADIF_RW_close(void) pthread_mutex_lock(&ADIF_RW_mutex); ADIF_RW_EXIT = true; + LOG_INFO("%s", "Exiting ADIF_RW_thread"); pthread_cond_signal(&ADIF_RW_cond); pthread_mutex_unlock(&ADIF_RW_mutex); pthread_join(*ADIF_RW_thread, NULL); delete ADIF_RW_thread; ADIF_RW_thread = 0; + LOG_INFO("%s", "ADIF_RW_thread closed"); } static void ADIF_RW_init() diff --git a/src/rigcontrol/rigio.cxx b/src/rigcontrol/rigio.cxx index 9b4e075e..c24d4c2a 100644 --- a/src/rigcontrol/rigio.cxx +++ b/src/rigcontrol/rigio.cxx @@ -319,18 +319,18 @@ long long fm_freqdata(DATA d, size_t p) long long rigCAT_getfreq(int retries, bool &failed, int waitval) { + failed = false; + if (nonCATrig || rigCAT_exit) { + failed = true; + return progStatus.noCATfreq; + } + XMLIOS modeCmd; list::iterator itrCmd; string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long long f = 0; - failed = false; - if (nonCATrig) { - failed = true; - return progStatus.noCATfreq; - } - itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "GETFREQ") @@ -429,20 +429,15 @@ retry_get_freq: ; void rigCAT_setfreq(long long f) { - { - guard_lock ser_guard( &rigCAT_mutex ); - if (rigCAT_exit) return; - } + if (nonCATrig || rigCAT_exit) + return; + XMLIOS modeCmd; list::iterator itrCmd; string strCmd; progStatus.noCATfreq = f; - if (nonCATrig) { - return; - } - // LOG_DEBUG("set frequency %lld", f); itrCmd = commands.begin(); @@ -496,10 +491,12 @@ void rigCAT_setfreq(long long f) string rigCAT_getmode() { - { - guard_lock ser_guard( &rigCAT_mutex ); - if (rigCAT_exit) return ""; - } + if (nonCATrig) + return progStatus.noCATmode; + if (rigCAT_exit) return ""; + +// guard_lock ser_guard( &rigCAT_mutex ); + XMLIOS modeCmd; list::iterator itrCmd; list::iterator mode; @@ -507,9 +504,6 @@ string rigCAT_getmode() string strCmd, mData; size_t len; - if (nonCATrig) - return progStatus.noCATmode; - itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "GETMODE") @@ -609,10 +603,8 @@ retry_get_mode: ; void rigCAT_setmode(const string& md) { - { - guard_lock ser_guard( &rigCAT_mutex ); - if (rigCAT_exit) return; - } + if (rigCAT_exit) return; + XMLIOS modeCmd; list::iterator itrCmd; string strCmd; @@ -685,10 +677,9 @@ void rigCAT_setmode(const string& md) string rigCAT_getwidth() { - { - guard_lock ser_guard( &rigCAT_mutex ); - if (rigCAT_exit) return ""; - } + if (rigCAT_exit || nonCATrig) + return progStatus.noCATwidth; + XMLIOS modeCmd; list::iterator itrCmd; list::iterator bw; @@ -696,9 +687,6 @@ string rigCAT_getwidth() string strCmd, mData; size_t len = 0, p = 0, pData = 0; - if (nonCATrig) - return progStatus.noCATwidth; - itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "GETBW") @@ -798,19 +786,15 @@ retry_get_width: ; void rigCAT_setwidth(const string& w) { - { - guard_lock ser_guard( &rigCAT_mutex ); - if (rigCAT_exit) return; - } - XMLIOS modeCmd; - list::iterator itrCmd; - string strCmd; - - if (nonCATrig) { + if (nonCATrig || rigCAT_exit) { progStatus.noCATwidth = w; return; } + XMLIOS modeCmd; + list::iterator itrCmd; + string strCmd; + itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == "SETBW") @@ -876,10 +860,8 @@ void rigCAT_setwidth(const string& w) void rigCAT_pttON() { - { - guard_lock ser_guard( &rigCAT_mutex ); - if (rigCAT_exit) return; - } + if (rigCAT_exit) return; + XMLIOS modeCmd; list::iterator itrCmd; string strCmd; @@ -932,10 +914,8 @@ void rigCAT_pttON() void rigCAT_pttOFF() { - { - guard_lock ser_guard( &rigCAT_mutex ); - if (rigCAT_exit) return; - } + if (rigCAT_exit) return; + XMLIOS modeCmd; list::iterator itrCmd; string strCmd; @@ -987,10 +967,8 @@ void rigCAT_pttOFF() void rigCAT_sendINIT(const string& icmd, int multiplier) { - { - guard_lock ser_guard( &rigCAT_mutex ); - if (rigCAT_exit) return; - } + if (rigCAT_exit) return; + XMLIOS modeCmd; list::iterator itrCmd; string strCmd; @@ -1312,7 +1290,7 @@ static void *rigCAT_loop(void *args) guard_lock ser_guard( &rigCAT_mutex ); if (rigCAT_exit == true) { - LOG_INFO("%s", "Exit rigCAT loop"); + LOG_INFO("%s", "Exited rigCAT loop"); return NULL; } @@ -1322,6 +1300,7 @@ static void *rigCAT_loop(void *args) } freq = rigCAT_getfreq(progdefaults.RigCatRetries, failed); + if (rigCAT_exit) continue; if ((freq > 0) && (freq != llFreq)) { llFreq = freq; @@ -1330,12 +1309,16 @@ static void *rigCAT_loop(void *args) } sWidth = rigCAT_getwidth(); + if (rigCAT_exit) continue; + if (sWidth.size() && sWidth != sRigWidth) { sRigWidth = sWidth; show_bw(sWidth); } sMode = rigCAT_getmode(); + if (rigCAT_exit) continue; + if (sMode.size() && sMode != sRigMode) { sRigMode = sMode; if (ModeIsLSB(sMode)) diff --git a/src/rigcontrol/xmlrpc_rig.cxx b/src/rigcontrol/xmlrpc_rig.cxx index 9887a66d..0d2ec476 100644 --- a/src/rigcontrol/xmlrpc_rig.cxx +++ b/src/rigcontrol/xmlrpc_rig.cxx @@ -853,7 +853,7 @@ bool flrig_get_xcvr() // xmlrpc read polling thread //====================================================================== static bool run_flrig_thread = true; -static int poll_interval = 1000; // 100 // milliseconds +static int poll_interval = 100; // 1 second //---------------------------------------------------------------------- // Set QSY to true if xmlrpc client connection is OK @@ -881,13 +881,13 @@ void flrig_connection() method_str.append(" ").append(result[i]).append("\n"); LOG_INFO("%s", method_str.c_str()); connected_to_flrig = true; - poll_interval = 100; + poll_interval = 20; // every 200 msec flrig_get_xcvr(); Fl::awake(flrig_setQSY); } else { LOG_VERBOSE("%s", "Waiting for flrig"); connected_to_flrig = false; - poll_interval = 5000; + poll_interval = 500; // every 5 seconds } } catch (...) { // LOG_ERROR("%s", "failure in flrig_client"); @@ -919,7 +919,10 @@ void connect_to_flrig() void * flrig_thread_loop(void *d) { for(;;) { - MilliSleep(poll_interval );//progStatus.poll_interval); + for (int i = 0; i < poll_interval; i++) { + if (!run_flrig_thread) break; + MilliSleep(10); + } if (!run_flrig_thread) break; @@ -951,7 +954,7 @@ void * flrig_thread_loop(void *d) void FLRIG_start_flrig_thread() { flrig_thread = new pthread_t; - poll_interval = 1000; + poll_interval = 100; if (pthread_create(flrig_thread, NULL, flrig_thread_loop, NULL)) { LOG_ERROR("%s", "flrig_thread create"); exit(EXIT_FAILURE); @@ -960,11 +963,13 @@ void FLRIG_start_flrig_thread() void stop_flrig_thread() { + LOG_INFO("%s", "stopping flrig thread"); flrig_client->close(); pthread_mutex_lock(&mutex_flrig); run_flrig_thread = false; pthread_mutex_unlock(&mutex_flrig); pthread_join(*flrig_thread, NULL); + LOG_INFO("%s", "flrig thread closed"); } void reconnect_to_flrig() diff --git a/src/trx/trx.cxx b/src/trx/trx.cxx index c489b667..06f4e72a 100644 --- a/src/trx/trx.cxx +++ b/src/trx/trx.cxx @@ -682,11 +682,13 @@ void trx_start(void) //============================================================================= void trx_close() { + LOG_INFO("%s", "closing trx thread"); int count = 1000; active_modem->set_stopflag(true); while (trx_state != STATE_RX && count--) MilliSleep(10); if (trx_state != STATE_RX) { + LOG_INFO("%s", "trx_state != STATE_RX"); exit(1); } count = 1000; @@ -694,6 +696,7 @@ void trx_close() while (trx_state != STATE_ENDED && count--) MilliSleep(10); if (trx_state != STATE_ENDED) { + LOG_INFO("%s", "trx_state != STATE_ENDED"); exit(2); } #if USE_NAMED_SEMAPHORES @@ -709,6 +712,7 @@ void trx_close() delete scard; scard = 0; } + LOG_INFO("%s", "trx thread closed"); } //============================================================================= From ae9e1a2b426b182e92ebdf5f1643eba579793494 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 21 Jan 2016 15:54:35 -0600 Subject: [PATCH 070/138] Version 3.23.07 * Maintenance release --- ChangeLog | 24 +++++++++++++++++++++++- configure.ac | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 08fdde1f..ec231b61 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,27 @@ -2015-11-26 David Freese + +=Version 3.23.07= + +2016-01-20 David Freese + + 10266d2: Exit delays + e821e49: Contest fields + ebc00ed: OS-X start_process + f5e3186: LOG RECORD exports + c0281ee: HAMLIB CW RTTY + ddb084c: PSKR metric + 68c5a6a: PSKR/8 + 397f570: Audio adjust + 4280903: WEB query + 8af53b6: Mode Set + e756d93: Tab key docs + 2fb5648: hamlib PTT_ON_DATA + 22514a5: Macro Tool Bar + 94f8362: XmlRpc client update + 2652387: Log Notes + e9e8b36: Misc Updates + 78baf6c: Set Frequency + 14a2618: Rx SaveAs 16ede08: flrig xmlrpc diff --git a/configure.ac b/configure.ac index 474195cf..1eea480c 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) m4_define(FLDIGI_MINOR, [23]) -m4_define(FLDIGI_PATCH, [.06]) +m4_define(FLDIGI_PATCH, [.07]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.5]) From 8bcc9e84bf325d0740bc915c20dcca44029a4a23 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 28 Jan 2016 11:14:43 -0600 Subject: [PATCH 071/138] RigCAT modifications * Separated no xcvr functions from rigcat loop operation * Corrected hamlib start/stop process to prevent lockup when xcvr is not responding to CAT commands - hamlib still creates a zombie process when trying to access a bogus serial interface such as a bell modem * Added string / hex data LOG view true/false * Added variable loop timing 100...20000 default 100 msec * Corrected use of BW-REPLY and MODE-REPLY in xml def file * Added ability to read and display Smeter and Pwr meter * Added debugging statements to exit functions * Fixed aberrant save frequencies2.txt file behavior * Added manual notch read/write using waterfall notch filter interface * Added power level control for xcvrs with that CAT command - set power level also used for logging * Updated tutorial on transceiver xml definition file structure. * Added bool specifier - use during development of an xml file --- fldigi_doxygen/images/rigcat-1.png | Bin 0 -> 5893 bytes fldigi_doxygen/images/rigcat-2.png | Bin 0 -> 6442 bytes fldigi_doxygen/images/rigcat-3.png | Bin 0 -> 5346 bytes fldigi_doxygen/images/rigcat-4.png | Bin 0 -> 5793 bytes fldigi_doxygen/user_src_docs/rigxml.txt | 838 ++++++++++---- src/Makefile.am | 1 + src/dialogs/fl_digi.cxx | 69 +- src/include/fl_digi.h | 10 +- src/include/pwrmeter.h | 9 + src/include/rigclass.h | 2 +- src/include/rigio.h | 20 +- src/include/rigsupport.h | 2 +- src/include/rigxml.h | 51 +- src/include/smeter.h | 9 + src/misc/configuration.cxx | 44 +- src/misc/xmlrpc.cxx | 17 +- src/rigcontrol/hamlib.cxx | 19 +- src/rigcontrol/norig.cxx | 120 ++ src/rigcontrol/ptt.cxx | 1 + src/rigcontrol/rigclass.cxx | 12 +- src/rigcontrol/rigio.cxx | 1328 ++++++++++++++++++++--- src/rigcontrol/rigsupport.cxx | 54 +- src/rigcontrol/rigxml.cxx | 125 +++ src/rigcontrol/serial.cxx | 7 +- src/rigcontrol/xmlrpc_rig.cxx | 16 +- src/widgets/pwrmeter.cxx | 26 +- src/widgets/smeter.cxx | 12 + 27 files changed, 2287 insertions(+), 505 deletions(-) create mode 100644 fldigi_doxygen/images/rigcat-1.png create mode 100644 fldigi_doxygen/images/rigcat-2.png create mode 100644 fldigi_doxygen/images/rigcat-3.png create mode 100644 fldigi_doxygen/images/rigcat-4.png create mode 100644 src/rigcontrol/norig.cxx diff --git a/fldigi_doxygen/images/rigcat-1.png b/fldigi_doxygen/images/rigcat-1.png new file mode 100644 index 0000000000000000000000000000000000000000..caf1606cf40ecc5fffec14b9a56d71d12af604bb GIT binary patch literal 5893 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 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/rigcat-2.png b/fldigi_doxygen/images/rigcat-2.png new file mode 100644 index 0000000000000000000000000000000000000000..87cf2d908afe66cb2050d86b6f68c053462813e0 GIT binary patch literal 6442 zcmV+_8P(>AP)a}5ab!{kO z0R$BhK@fE*(tAsv`$r%XLOLWN-19zpG-q=1{XR1D&8c$^lAienKp>FL3W4|Ejwk^5eb3+E^uX_8vTGkAR<9vMHd3;%n$?Vrd~_+@E$*ioEX{eeIrt8m} zP}dZjU8$mrHhhfUyngEU<1DoL7}-z#abD1W4qv~UBp9C^3?n1jyLEiZ1wHqczlY}! zYc7g9qW}Q**GDl+M|cid`>24Wu!syGQmz5@`l$?cO|i+N>x3w``fd2$*qhHjl`vJJ z$NUoR7xGroZ!>Z(%p4RL`GF%fW9mV_K|Z&Y7p0cp53m+rgsRt1WvFY4O+H;GL{$s> z^T~}Hlcb&!(V(@jw@lf5yBa%Ux~ty_6j*<4muRqpkx`)3Z =Mzsl=CR+AWO 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 Ef@05_GXMYp literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/rigcat-3.png b/fldigi_doxygen/images/rigcat-3.png new file mode 100644 index 0000000000000000000000000000000000000000..04a3826d4f40ca3fa389f56de596016dae3e99c1 GIT binary patch literal 5346 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 literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/images/rigcat-4.png b/fldigi_doxygen/images/rigcat-4.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3b8e5713204351746a1656f0345e2079554e15 GIT binary patch literal 5793 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 Tnvst~W`Ke$NTyuc+c|Fv;& literal 0 HcmV?d00001 diff --git a/fldigi_doxygen/user_src_docs/rigxml.txt b/fldigi_doxygen/user_src_docs/rigxml.txt index d846a32f..5d056ec4 100644 --- a/fldigi_doxygen/user_src_docs/rigxml.txt +++ b/fldigi_doxygen/user_src_docs/rigxml.txt @@ -8,288 +8,368 @@ This document describes the contents of the rig definition file \"rig.xml\". A number of transceivers have rig definition files written and tested which you may use. These are found in the xmls directory on this -site: xml archives. +site: xml archives. You will find subdirectories by manufacturer which contain files named by rig type, ie: TS-850.xml. If you create, test and verify the proper operation for a transceiver not yet posted please share that with -others by sending it as an attachment to w1hkj@w1hkj.com and I will +others by sending it as an attachment to feedback [at] w1hkj [dot] com and I will post it on the web site. You are encouraged to study the various rig definition files to learn more about how they are organized. Comments are contained within the tag pair: - -\ --\> -
    - +
    +\
    + 0,0; 255,100 
    +
    +
    +
    +  0,0; 16,1; 32,4; 48,7;
    +  64,12; 80,18; 96,24; 112,32;
    +  128,40; 144,50; 160,61; 176,73; 
    +  192,85; 208,100
    +
    +
    +
    + 0,0; 255,100 
    +
    + +The query and respective responses are coded as any other command/reply pair: + +For the FT-950: + +
    +
    +  SMETER
    +  7
    +  RM1
    +  
    +    DECIMAL
    +    3
    +  
    +  ;
    +
    +
    +
    +  GET_SMETER
    +  4
    +  RM1;
    +  SMETER
    +
    +
    +
    +  PWRMETER
    +  7
    +  RM5
    +  
    +    DECIMAL
    +    3
    +  
    +  ;
    +
    +
    +
    +  GET_PWRMETER
    +  4
    +  RM5;
    +  PWRMETER
    +
    +
    + +and for the IC-706MkIIG: + +
    +
    +    SMETER
    +    10
    +    FE FE E0 58 15 02
    +    
    +        BCD
    +         3 
    +         255 
    +         0 
    +         1 
    +     
    +    FD
    +
    +
    +
    +    GET SMETER
    +    7
    +    FE FE 58 E0 15 02 FD
    +    SMETER
    +
    +
    + +\section notch_control Notch Control + +The transceiver manual notch can be both read and controlled using rigCAT. + +There are a few requirements that may not be met by all transceivers. +
    +
      +
    • it must support a CAT manual notch on/off string
    • +
    • it must support a CAT manual notch value string
    • +
    • the conversion between notch audio frequency and the CAT value must +be bilateral.
    • +
    +
    +Here is an example for the FT-950: + +
    +
    +  1,10; 300,3000;
    +
    +
    +
    +    SET_NOTCH_ON
    +    8
    +    BP00001;
    +
    +
    +
    +    SET_NOTCH_OFF
    +    8
    +    BP00000;
    +
    +
    +
    +    SET_NOTCH_VAL
    +    8
    +    BP01
    +    
    +        DECIMAL
    +        3
    +    
    +    ;
    +
    +
    +
    +  NOTCH_ON
    +  8
    +  BP00001;
    +
    +
    +
    +  GET_NOTCH_ON
    +  5
    +  BP00;
    +  NOTCH_ON
    +
    +
    +
    +  NOTCH
    +  8
    +  BP01
    +  
    +    DECIMAL
    +    3
    +  
    +  ;
    +
    +
    +
    +  GET_NOTCH
    +  5
    +  BP01;
    +  NOTCH
    +
    +
    + +The notch is controlled from fldigi using the alt-ctl-left-click on the waterfall. +The same keyboard-mouse combination is used to both set and clear the notch. Point +the cursor to an offending signal, and then use the keyboard-mouse combination to +set the manual notch at that frequency. Repeat the keyboard-mouse combination anywhere +in the waterfall to clear the notch. The SET notch is indicated by a dashed vertical +line on the waterfall display at the audio frequency being notched. You should also +see a pronounced reduction in signal at that point. fldigi will also annunciate any +transceiver changes made to the manual notch. + +\section power_level Power Level Control + +rigCAT can control the power level of the transceiver if that is a supported CAT command. +The definitions for the power level are similar to the notch in that the conversion +should be bilateral. + +Another example using the FT-950 transceiver: + +
    +
    +  0,0; 100,100;
    +
    +
    +
    +  PWRLEVEL
    +  6
    +  PC
    +  
    +    DECIMAL
    +    3
    +  
    +  ;
    +
    +
    +
    +  GET_PWRLEVEL
    +  3
    +  PC;
    +  PWRLEVEL
    +
    +
    +
    +  SET_PWRLEVEL
    +    6
    +    PC
    +    
    +        DECIMAL
    +        3
    +    
    +    ;
    +
    +
    + +The rigCAT controls for +
      +
    • Transceiver-Mode
    • +
    • Transceiver-Bandwidth
    • +
    • Smeter
    • +
    • Power-Meter and
    • +
    • Power-Level
    • +
    +all share a common space on the main fldigi display. +
    +\image html rigcat-1.png "Mode/Bandwidth controls" +\image latex rigcat-1.png "Mode/Bandwidth controls" width=2.0in +
    +\image html rigcat-2.png "S-meter" +\image latex rigcat-2.png "S-meter" width=2.0in +
    +\image html rigcat-3.png "Power-meter" +\image latex rigcat-3.png "Power-meter" width=2.0in +
    +\image html rigcat-4.png "Power Level" +\image latex rigcat-4.png "Power Level" width=2.0in +
    +
    +The transition between Mode/Bandwidth and the other control/displays is +made using the button just to the right of the bandwidth control. + +The transition from either S-meter or Power-meter to the Power Level is +make by left clicking on the S-meter or Power-meter. + +\section debugging Debugging + +To assist in debugging an xml file you may place the following statement +within the body of the ... pair. + +true + +fldigi will then record critical events as they occur during the execution +of the rigCAT loop. Remove the debug statement from the xml when the +file has been proven and before publishing. + +You can use the xml remarks brackets +
    +\h=jo6Bs8_YMwNg)KNg3d;
    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∓chg>sA_-gkB37XCQG(3C6Qsa0G7d$S^`UG
    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
    
    diff --git a/fldigi_doxygen/images/thor-pic-transmission.png b/fldigi_doxygen/images/thor-pic-transmission.png
    new file mode 100644
    index 0000000000000000000000000000000000000000..596644b8657ca42d37110847d0cdadc356d5da68
    GIT binary patch
    literal 45382
    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�U2-7Pa$L0)v1D?iGjL$9(bs4+A3113=uYr*
    z&H}M`0AgI+p2e+~I3XUJXD+wr5D@h2FqG(nr=oq>hIAydMyreL2r{BiRN3-6>c
    zoDS%4?oL?~EJAN|nAnti0+mhrlrR1aL1?EoP?v*8mEhS3`_83TnOjz+X5t%_V|1i$
    zM&DGKPWFLY=fMxP+isEU5?s3yz4p#+FGruK_Cz&SVK7I`=M}EwT!@#{Gc~6XR2T;#
    zt{t#g@}v-Vcn|RH;MTHsk*(Q)8zHsVMPgc?*Z-QC#nR+V7tDxd222gN
    zQCwc22P%xs+DD=OUfsbAQi}(dIZ_Qq;hUY;&8#-?HddhsnF+Jt
    z)(BkM$vU6a3;K~CPZVJyW^NA5ed}#pfyeMZ&Zj~-R(JN@E;Rj#8Gnupku2M`3Wct+?#Cg1EAn}28b7Tc<
    zD!QRX!#L@4N%JsE=9mt{C3wwv
    z4AT9{d^ZWfV+IoEv#`KvshW`RmhZS}JQ7~xm{KI-w`wLW?@_=5usN;G43fLw$)w(yJK$41?T#P-H7!C;FjgU0+xb`UfSFPfG|
    zi^BCq9aTWTOKp9Yu&D9msWz^$sdZqKF8DRpJ$NgY9(LE`a5aA$QQBxLA|qU6Ccx>x)#~ikrqyGkdLqxLNjcYGo+ZRgED7QX{p>kO8ve2)E
    z-lBbE&YAnN3o7+;=uOZSJNC8NaOj;;2Q*E)x?%Kwy>138W$ZU|VRTd8a_B(I%<-QU
    zp6bl_;q94OpIOvi=k*)#;9U%hpM3H8JJq{07n!q1A6&{khxfx|8zCC~>oXlhiM_er
    zn9^a51Mk7T?<Otfz2SV1A1yR~7jXS3yS9~BEI(^E5t!aP>*
    zhmvO%!ua?wP65<|#nxY>@Zf_Cxb`};ci?sXX6)#2QgNL*z*O$_>I-v2+86Ij>+YUjMj=g(tobeUDD9@$t&87oZ8~
    z0NvJCMT+^>%)`?2i?S@|?Qc?v2fIjrgYtAfePwyE@
    z@#?`A?=@e}KT+>7-Je1+rDa`W*Dt!1TQ8@^?lpYP6ovMkd6l+)d#d>;h4yTHC#BZy
    zei+Jo?BHUj`b`Z;D(G|YY@f{Z?$lmpBkO3;R@E!W203rgaMRY$4ObJm;jly!7<}
    zA-|+0`1L@O`e|@2j{55FvoqgtFw9tj;rGv+cIRtq
    z^|rjvOB~$NJ#jR->OG)GW0fIP#e56+okoiuL>B%xaNA(Y{RmZgmbd#B9;4I60>sAp
    z{gmRPwN#MnLs6%EImmp5Oc0M@%dB_mJB;*l-E{{zS!fx0a-?$0m1PDP_C9;LZeipP
    zRRLtX7=wjua(mI35(yPnnP6X3t6ZuSdV(u9Jyq;2Y{VR5YESDLry_La(ml-<@sat1x&#!yrn-9L
    zveHJ*-sw|bOS~L7;CGYaQRev`lln)=zGpIb(s8|f@d)PeR}M!elOHQH33|<&)5-gctjp<))`Y>YWKYf#6hX400qa49=>b{X0e7P7T>nhOw#rPt;HtUqCwt&g
    zTUdxR2ahd-6WI+7dR}qHr2nqoDHS%vNI=)E5clGT>wTB=*V{Qk(-j4u!}~4HHWm=u
    zQhh$VoNmJ`v;BIihu>i&=S_Y%81@5a}(^H;VAMV_f(!?~T)
    z}@cIiWMWxym>!|)M>=Ym(URp}M070#k^8hq|?X7C!MpPS
    
    literal 0
    HcmV?d00001
    
    diff --git a/fldigi_doxygen/user_src_docs/IFKP.txt b/fldigi_doxygen/user_src_docs/IFKP.txt
    index c7684f3f..7a5a2360 100644
    --- a/fldigi_doxygen/user_src_docs/IFKP.txt
    +++ b/fldigi_doxygen/user_src_docs/IFKP.txt
    @@ -309,6 +309,55 @@ mode when the image transmission is completed.
     \image latex ifkp-WF-image-mode.png "Image Mode Waterfall" width=3.5in
     
    +There is an alternate way of sending an image, but one which only transmits a color +image with no provision for slant correction. This may be more convenient +for sharing images when you do not need the additional utility of the image dialog. +
    + +Open a file folder to the location of your image files that are suitable for MFSK +transmission. These images should be constrained to be 240 x 200 or less for +reasonable transmit times. Optionally prepare fldigi for the MFSK image +transmission by entering some suitable text to precede the transmission. +You may be sending the image, blossoms.jpg, for example. +
    + +
    +\image html blossoms.png "image in files folder" +\image latex blossoms.png "image in files folder" width=3.0in +
    + +One might enter: + +\image html blossoms-1.png "" +\image latex blossoms-1.png "" width=4.0in + +Then drag and drop the the image file from the files folder to the transmit +text panel in fldigi. The program will automatically resize the image to the +nearest scale-aspect ratio less than or equal to the actual image size. +
    + +The TX panel text will then change to + +\image html blossoms-2.png "" +\image latex blossoms-2.png "" width=4.0in + +The ^! is the character sequence used by the fldigi TX parser to indicate +that there is a pending execution command. In this case it is to transmit +the blossoms.jpg file. +
    + +Add some suitable ending text and the sequence ^r to the next line and +then press the T/R button (if not already transmitting). At the end of the +image the TX parser will find the ^r and return the program to the receive +mode. + +The Rx panel will echo the transmitted data: +
    +\image html thor-pic-transmission.png "" +\image latex thor-pic-transmission.png "" width=4.0in + +The transmit progress dialog will close at the conclusion of the image transmission. + Receive Image Reception is completely automatic. The decoder will identify the picture start, diff --git a/fldigi_doxygen/user_src_docs/MFSK.txt b/fldigi_doxygen/user_src_docs/MFSK.txt index cb036f44..3b31e739 100644 --- a/fldigi_doxygen/user_src_docs/MFSK.txt +++ b/fldigi_doxygen/user_src_docs/MFSK.txt @@ -27,7 +27,6 @@ This is an example of properly tuned MFSK16 signal with a s/n of approximately 9 dB.
    - \image html mfsk-9db.png " MFSK16 signal" \image latex mfsk-9db.png " MFSK16 signal" width=6.0in
    @@ -61,15 +60,6 @@ is subject to burst and phase noise on the transmission path. It can provide excellent photo transmission on a really good path.
    -\image html mfskpix-bee.png "Received MFSK Image" -\image latex mfskpix-bee.png "Received MFSK Image" width=2.0in -
    - -This is an example of a photo received on a bench test. The received -image is an exact replica of the transmitted image. The color depth is -a full 24 bits. -
    - Images should be carefully selected for size before beginning a transmission. To calculate the transmit time for an image use the following formula: @@ -100,12 +90,11 @@ Received images are saved in the default folder $HOME/.fldigi/images \section mfsk_tx_image Transmitting an Image - \image html Xmt-Pix.png "Xmit Picture Dialog box" \image latex Xmt-Pix.png "Xmit Picture Dialog box" width=3.0in
    -You can only transmit an image while in the MFSK-16 mode. The +You can only transmit an image while in the MFSK-16/32/64/128 modes. The image can be prepared for transmission while in the receive mode. Right click in the transmit text box and select "Send Image" from the popup menu. This will open up the transmit image dialog which will be blank to start. @@ -159,28 +148,84 @@ will then have to toggle the T/R button if you want to return to receive.
    -\image html Xmt-Pix3.png "Received MFSK Image" -\image latex Xmt-Pix3.png "Received MFSK Image" width=1.5in +There is an alternate way of sending an image, but one which only transmits a color +image with no provision for slant correction. This may be more convenient +for sharing images when you do not need the additional utility of the image dialog.
    -The receiving program decodes the "Pic:110x119C;" as a color picture -110 wide by 119 high. Here is shown being received on a computer -running Vista Home Premium. +Open a file folder to the location of your image files that are suitable for MFSK +transmission. These images should be constrained to be 240 x 200 or less for +reasonable transmit times. Optionally prepare fldigi for the MFSK image +transmission by entering some suitable text to precede the transmission. +You may be sending the image, blossoms.jpg, for example.
    +
    +\image html blossoms.png "image in files folder" +\image latex blossoms.png "image in files folder" width=3.0in +
    -\image html Xmt-Pix4.png "Waterfall of a MFSK Image" -\image latex Xmt-Pix4.png "Waterfall of a MFSK Image" width=3.5in +One might enter: + +\image html blossoms-1.png "" +\image latex blossoms-1.png "" width=4.0in + +Then drag and drop the the image file from the files folder to the transmit +text panel in fldigi. +
    + +The TX panel text will then change to + +\image html blossoms-2.png "" +\image latex blossoms-2.png "" width=4.0in + +The ^! is the character sequence used by the fldigi TX parser to indicate +that there is a pending execution command. In this case it is to transmit +the blossoms.jpg file. +
    + +Add some suitable ending text and the sequence ^r to the next line and +then press the T/R button (if not already transmitting). At the end of the +image the TX parser will find the ^r and return the program to the receive +mode. + +The Rx panel will echo the transmitted data: +
    +\image html blossoms-3.png "" +\image latex blossoms-3.png "" width=4.0in + +The image progress dialog will close at the end of the image transfer. + +\section mfsk_rx_image Receiving an Image + +The receiving program decodes the "Pic:240x160C;" as a color picture +240 wide by 160 high. +
    +\image html Xmt-Pix2.png "Received MFSK Image" +\image latex Xmt-Pix2.png "Received MFSK Image" width=3.0in +
    This is what the waterfall will look like during the reception of an -MFSK-16 image. +MFSK-64 image.
    +
    +\image html Xmt-Pix3.png "MFSK Image - Waterfall" +\image latex Xmt-Pix3.png "MFSK Image - Waterfall" width=4.5in +
    The actual spectrum signature will vary with the image bytes being -transmitted. The waterfall scale is in the x4 mode and the above -photo was being transmitted in 24 bit color for this screenshot. The +transmitted. The image was being transmitted in 24 bit color for this screenshot. The waterfall clearly shows that the image transmission is within the bandwidth -occupied by MFSK-16. +occupied by MFSK-64. + +Received images are automatically saved to the images folder and annotated with +a date-time stamp. + +
    +\image html MFSK-rx-images.png "MFSK Rx Images" +\image latex MFSK-rx-images.png "MFSK Rx Images" width=4.5in +
    +
    \section mfsk_picture_slant Picture with a slant @@ -203,9 +248,8 @@ move the mouse to bottom left or right corner of the slanted images (the corner that clearly visible). Then left click on that corner. The program will correct for the slant. The correction will not be perfect but it may help to make the image more -viewable. -
    - +viewable. Right click to undo the slant correction. Slant corrections are +not saved to the Rx image file.
    \ref mfsk_page "Return to Top of Page" diff --git a/fldigi_doxygen/user_src_docs/Thor.txt b/fldigi_doxygen/user_src_docs/Thor.txt index f216c24f..85379713 100644 --- a/fldigi_doxygen/user_src_docs/Thor.txt +++ b/fldigi_doxygen/user_src_docs/Thor.txt @@ -146,6 +146,55 @@ Transmission begins when you press the "Xmt" button. fldigi will insert the tex preamble and immediately begin the image transmission. fldigi returns to the receive mode when the image transmission is completed. +There is an alternate way of sending an image, but one which only transmits a color +image with no provision for slant correction. This may be more convenient +for sharing images when you do not need the additional utility of the image dialog. +
    + +Open a file folder to the location of your image files that are suitable for MFSK +transmission. These images should be constrained to be 240 x 200 or less for +reasonable transmit times. Optionally prepare fldigi for the MFSK image +transmission by entering some suitable text to precede the transmission. +You may be sending the image, blossoms.jpg, for example. +
    + +
    +\image html blossoms.png "image in files folder" +\image latex blossoms.png "image in files folder" width=3.0in +
    + +One might enter: + +\image html blossoms-1.png "" +\image latex blossoms-1.png "" width=4.0in + +Then drag and drop the the image file from the files folder to the transmit +text panel in fldigi. The program will automatically resize the image to the +nearest scale-aspect ratio less than or equal to the actual image size. +
    + +The TX panel text will then change to + +\image html blossoms-2.png "" +\image latex blossoms-2.png "" width=4.0in + +The ^! is the character sequence used by the fldigi TX parser to indicate +that there is a pending execution command. In this case it is to transmit +the blossoms.jpg file. +
    + +Add some suitable ending text and the sequence ^r to the next line and +then press the T/R button (if not already transmitting). At the end of the +image the TX parser will find the ^r and return the program to the receive +mode. + +The Rx panel will echo the transmitted data: +
    +\image html thor-pic-transmission.png "" +\image latex thor-pic-transmission.png "" width=4.0in + +The transmit progress dialog will close at the conclusion of the image transmission. + Receive Image Reception is completely automatic. The decoder will identify the picture start, @@ -153,7 +202,7 @@ and record the picture. In doing so, it automatically opens a separate "thor Rx
    \image html thor-image-partial.png "Image Reception" -\image latex thor-image-partial.png "Image Reception" width=3.5in +\image latex thor-image-partial.png "Image Reception" width=6.0in
    Demodulation uses a phase detection algorithm based on quadrature demodulation diff --git a/src/ifkp/ifkp-pic.cxx b/src/ifkp/ifkp-pic.cxx index 33c00776..69ffb1cb 100644 --- a/src/ifkp/ifkp-pic.cxx +++ b/src/ifkp/ifkp-pic.cxx @@ -116,7 +116,7 @@ void ifkp_updateRxPic(unsigned char data, int pos) for (int i = 0; i < ifkp::IMAGEspp; i++) ifkp_rawvideo[RAWSTART + ifkp::IMAGEspp*ifkp_numpixels + i] = data; ifkp_numpixels++; - if (ifkp_numpixels >= (RAWSIZE - RAWSTART - ifkp::IMAGEspp)) + if (ifkp_numpixels >= (RAWSIZE - RAWSTART - ifkp::IMAGEspp)) ifkp_numpixels = RAWSIZE - RAWSTART - ifkp::IMAGEspp; } @@ -473,6 +473,145 @@ void ifkp_createTxViewer() } + +void ifkp_load_scaled_image(std::string fname) +{ + + if (!ifkppicTxWin) ifkp_createTxViewer(); + + int D = 0; + unsigned char *img_data; + int W = 160; + int H = 120; + int winW = 644; + int winH = 512; + int ifkppicX = 0; + int ifkppicY = 0; + string picmode = "pic% \n"; + + if (ifkpTxImg) { + ifkpTxImg->release(); + ifkpTxImg = 0; + } + + ifkpTxImg = Fl_Shared_Image::get(fname.c_str()); + if (!ifkpTxImg) + return; + + int iW = ifkpTxImg->w(); + int iH = ifkpTxImg->h(); + int aspect = 0; + + if (iW > iH ) { + if (iW >= 640) { + W = 640; H = 480; + winW = 644; winH = 484; + aspect = 4; + picmode[4] = 'V'; + } + else if (iW >= 320) { + W = 320; H = 240; + winW = 324; winH = 244; + aspect = 2; + picmode[4] = 'L'; + } + else { + W = 160; H = 120; + winW = 164; winH = 124; + aspect = 1; + picmode[4] = 'S'; + } + } else { + if (iH >= 300) { + W = 240; H = 300; + winW = 244; winH = 304; + aspect = 5; + picmode[4] = 'P'; + } + else if (iH >= 150) { + W = 120; H = 150; + winW = 124; winH = 154; + aspect = 7; + picmode[4] = 'M'; + } + else { + W = 59; H = 74; + winW = 67; winH = 82; + aspect = 0; + picmode[4] = 'T'; + } + } + + { + Fl_Image *temp; + selifkppicSize->value(aspect); + temp = ifkpTxImg->copy(W, H); + ifkpTxImg->release(); + ifkpTxImg = (Fl_Shared_Image *)temp; + } + + if (ifkpTxImg->count() > 1) { + ifkpTxImg->release(); + ifkpTxImg = 0; + return; + } + + ifkppicTx->hide(); + ifkppicTx->clear(); + + img_data = (unsigned char *)ifkpTxImg->data()[0]; + + D = ifkpTxImg->d(); + + if (ifkpxmtimg) delete [] ifkpxmtimg; + + ifkpxmtimg = new unsigned char [W * H * 3]; + if (D == 3) + memcpy(ifkpxmtimg, img_data, W*H*3); + else if (D == 4) { + int i, j, k; + for (i = 0; i < W*H; i++) { + j = i*3; k = i*4; + ifkpxmtimg[j] = img_data[k]; + ifkpxmtimg[j+1] = img_data[k+1]; + ifkpxmtimg[j+2] = img_data[k+2]; + } + } else if (D == 1) { + int i, j; + for (i = 0; i < W*H; i++) { + j = i * 3; + ifkpxmtimg[j] = ifkpxmtimg[j+1] = ifkpxmtimg[j+2] = img_data[i]; + } + } else + return; + + char* label = strdup(fname.c_str()); + ifkppicTxWin->copy_label(basename(label)); + free(label); + +// load the ifkppicture widget with the rgb image + + ifkppicTxWin->size(winW, winH); + ifkppicX = (winW - W) / 2; + ifkppicY = (winH - H) / 2; + ifkppicTx->resize(ifkppicX, ifkppicY, W, H); + + selifkppicSize->hide(); + btnifkppicTransmit->hide(); + btnifkppicTxLoad->hide(); + btnifkppicTxClose->hide(); + btnifkppicTxSendAbort->hide(); + + ifkppicTx->video(ifkpxmtimg, W * H * 3); + ifkppicTx->show(); + + ifkppicTxWin->show(); + + active_modem->ifkp_send_image(picmode); + + return; +} + void ifkp_showTxViewer(char c) { if (!ifkppicTxWin) ifkp_createTxViewer(); @@ -494,7 +633,7 @@ void ifkp_showTxViewer(char c) break; case 'L' : case 'l' : - W = 320; H = 240; winW = 324; winH = 274; + W = 320; H = 240; winW = 324; winH = 274; selifkppicSize->value(2); break; case 'F' : @@ -641,7 +780,7 @@ int ifkp_load_avatar(std::string image_fname, int W, int H) shared_avatar_img = Fl_Shared_Image::get(fname.c_str(), W, H); // force image to be retrieved from hard drive vice shared image memory - shared_avatar_img->reload(); + shared_avatar_img->reload(); if (!shared_avatar_img) { ifkp_avatar->video(tux_img, W * H * 3); @@ -732,7 +871,7 @@ void ifkp_update_avatar(unsigned char data, int pos) ifkp_numpixels++; - if (ifkp_numpixels >= (RAWSIZE - RAWSTART - ifkp::IMAGEspp)) + if (ifkp_numpixels >= (RAWSIZE - RAWSTART - ifkp::IMAGEspp)) ifkp_numpixels = RAWSIZE - RAWSTART - ifkp::IMAGEspp; } @@ -820,4 +959,3 @@ void cb_ifkp_send_avatar( Fl_Widget *w, void *) ifkp_avatar->save_png(fname.c_str()); } } - diff --git a/src/ifkp/ifkp.cxx b/src/ifkp/ifkp.cxx index 9aceb041..6fd52e70 100644 --- a/src/ifkp/ifkp.cxx +++ b/src/ifkp/ifkp.cxx @@ -770,7 +770,10 @@ void ifkp::send_image() } } -void ifkp::ifkp_send_image() { +std::string img_str; + +void ifkp::ifkp_send_image(std::string image_str) { + img_str = image_str; TX_IMAGE = true; start_tx(); } @@ -787,17 +790,29 @@ int ifkp::tx_process() send_char(0); send_char(0); } + int c = get_tx_char(); - if (c == GET_TX_CHAR_ETX) { + +// if (c == GET_TX_CHAR_ETX || enable_image) { + if (TX_IMAGE || TX_AVATAR) { + if (img_str.length()) { + for (size_t n = 0; n < img_str.length(); n++) + send_char(img_str[n]); + } if (TX_IMAGE) send_image(); if (TX_AVATAR) send_avatar(); send_char(0); stopflag = false; TX_IMAGE = false; TX_AVATAR = false; - return -1; + if (img_str.length()) { + ifkppicTxWin->hide(); + img_str.clear(); + } + return 0; } - if ( stopflag ) { // aborts transmission + if ( stopflag || c == GET_TX_CHAR_ETX) { // aborts transmission + send_char(0); TX_IMAGE = false; TX_AVATAR = false; stopflag = false; diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index 9f0029ec..a5a4db0d 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -242,6 +242,7 @@ extern void cbSELCAL(Fl_Widget *w, void *d); extern void cbFSQCALL(Fl_Widget *w, void *d); extern void ifkp_showTxViewer(char C = 'T'); +extern void ifkp_load_scaled_image(std::string); extern Fl_Double_Window *ifkppicRxWin; extern Fl_Double_Window *ifkppicTxWin; @@ -554,5 +555,6 @@ extern void thor_update_avatar(unsigned char data, int pos); extern int thor_get_avatar_pixel(int pos, int color); extern void cb_thor_send_avatar( Fl_Widget *w, void *); extern picture *thor_avatar; +extern void thor_load_scaled_image(std::string fname); #endif diff --git a/src/include/ifkp.h b/src/include/ifkp.h index 1b49dd1d..44a4e27b 100644 --- a/src/include/ifkp.h +++ b/src/include/ifkp.h @@ -171,7 +171,7 @@ static int IMAGEspp; void send_image(); void send_avatar(); void ifkp_send_avatar(); - void ifkp_send_image(); + void ifkp_send_image(std::string s = ""); }; diff --git a/src/include/macros.h b/src/include/macros.h index cdad9217..cf6461d4 100644 --- a/src/include/macros.h +++ b/src/include/macros.h @@ -98,4 +98,6 @@ void Rx_queue_execute(); bool queue_must_rx(); void idleTimer(void *); +extern void TxQueINSERTIMAGE(std::string s); + #endif diff --git a/src/include/modem.h b/src/include/modem.h index 97d77768..8dfdfa29 100644 --- a/src/include/modem.h +++ b/src/include/modem.h @@ -150,10 +150,10 @@ public: virtual void send_color_image(std::string) {} virtual void send_Grey_image(std::string) {} - virtual void ifkp_send_image(){} + virtual void ifkp_send_image(std::string s = ""){} virtual void ifkp_send_avatar(){} - virtual void thor_send_image(){} + virtual void thor_send_image(std::string s = ""){} virtual void thor_send_avatar(){} void set_stopflag(bool b) { stopflag = b;}; diff --git a/src/include/thor.h b/src/include/thor.h index f406e9ba..649f5d23 100644 --- a/src/include/thor.h +++ b/src/include/thor.h @@ -252,6 +252,7 @@ public: void send_avatar(); void thor_send_avatar(); void thor_send_image(); + void thor_send_image(std::string s = ""); }; diff --git a/src/mfsk/mfsk.cxx b/src/mfsk/mfsk.cxx index aef3116f..327cffaf 100644 --- a/src/mfsk/mfsk.cxx +++ b/src/mfsk/mfsk.cxx @@ -1022,6 +1022,8 @@ void mfsk::send_epilogue() flush_xmt_filter(64); } +static bool close_after_transmit = false; + void mfsk::clearbits() { int data = enc->encode(0); @@ -1137,6 +1139,8 @@ int mfsk::tx_process() btnpicTxSendGrey->show(); btnpicTxLoad->show(); btnpicTxClose->show(); + if (close_after_transmit) picTxWin->hide(); + close_after_transmit = false; abortxmt = false; rxstate = RX_STATE_DATA; memset(picheader, ' ', PICHEADER - 1); @@ -1151,6 +1155,7 @@ int mfsk::tx_process() void mfsk::send_color_image(std::string s) { if (load_image(s.c_str())) { + close_after_transmit = true; pic_TxSendColor(); } } @@ -1158,6 +1163,7 @@ void mfsk::send_color_image(std::string s) void mfsk::send_Grey_image(std::string s) { if (load_image(s.c_str())) { + close_after_transmit = true; pic_TxSendGrey(); } } diff --git a/src/misc/macros.cxx b/src/misc/macros.cxx index 5733d859..20c5788a 100644 --- a/src/misc/macros.cxx +++ b/src/misc/macros.cxx @@ -1892,6 +1892,74 @@ static void pTxQueIMAGE(std::string &s, size_t &i, size_t endbracket) s.replace(i, endbracket - i + 1, "^!"); } +static void doINSERTIMAGE(std::string s) +{ + if (s.length() > 0) { + + bool Greyscale = false; + size_t p = string::npos; + string fname = s.substr(7); + p = fname.find(">"); + fname.erase(p); + p = fname.find("G,"); + if (p == string::npos) p = fname.find("g,"); + if (p != string::npos) { + Greyscale = true; + fname.erase(p,2); + } + while (fname[0] == ' ') fname.erase(0,1); + if (s.empty()) return; + + trx_mode md = active_modem->get_mode(); + if ((md == MODE_MFSK16 || md == MODE_MFSK32 || + md == MODE_MFSK64 || md == MODE_MFSK128) && + active_modem->get_cap() & modem::CAP_IMG) { + Greyscale ? + active_modem->send_Grey_image(fname) : + active_modem->send_color_image(fname); + } + else if (md == MODE_IFKP) { + ifkp_load_scaled_image(fname); + } + else if (md >= MODE_THOR_FIRST && md <= MODE_THOR_LAST) + thor_load_scaled_image(fname); + } + que_ok = true; +} + +void TxQueINSERTIMAGE(std::string s) +{ + trx_mode active_mode = active_modem->get_mode(); + if (! (active_mode == MODE_MFSK16 || + active_mode == MODE_MFSK32 || + active_mode == MODE_MFSK64 || + active_mode == MODE_MFSK128 || + active_mode == MODE_IFKP || + (active_mode >= MODE_THOR_FIRST && active_mode <= MODE_THOR_LAST) ) && + active_modem->get_cap() & modem::CAP_IMG) + return; + + string scmd = ""; + scmd.insert(7,s); + + struct CMDS cmd = { scmd, doINSERTIMAGE }; + push_txcmd(cmd); + + string itext = s; + size_t p = itext.rfind("\\"); + if (p == string::npos) p = itext.rfind("/"); + if (p != string::npos) itext.erase(0, p+1); + p = itext.rfind("."); + if (p != string::npos) itext.erase(p); + itext.insert(0, "\nImage: "); + itext.append(" ^!"); + + if (active_mode == MODE_IFKP) + ifkp_tx_text->add_text(itext); + else + TransmitText->add_text(itext); +} + #include #include "re.h" diff --git a/src/thor/thor-pic.cxx b/src/thor/thor-pic.cxx index 5b0233fd..7def7dc1 100644 --- a/src/thor/thor-pic.cxx +++ b/src/thor/thor-pic.cxx @@ -28,6 +28,7 @@ #include "fileselect.h" #include "qrunner.h" +void thor_createTxViewer(); Fl_Double_Window *thorpicRxWin = (Fl_Double_Window *)0; picture *thorpicRx = (picture *)0; @@ -291,6 +292,145 @@ void thor_clear_rximage() // image transmit functions //------------------------------------------------------------------------------ +void thor_load_scaled_image(std::string fname) +{ + + if (!thorpicTxWin) thor_createTxViewer(); + + int D = 0; + unsigned char *img_data; + int W = 160; + int H = 120; + int winW = 644; + int winH = 512; + int thorpicX = 0; + int thorpicY = 0; + string picmode = "pic% \n"; + + if (thorTxImg) { + thorTxImg->release(); + thorTxImg = 0; + } + + thorTxImg = Fl_Shared_Image::get(fname.c_str()); + if (!thorTxImg) + return; + + int iW = thorTxImg->w(); + int iH = thorTxImg->h(); + int aspect = 0; + + if (iW > iH ) { + if (iW >= 640) { + W = 640; H = 480; + winW = 644; winH = 484; + aspect = 4; + picmode[4] = 'V'; + } + else if (iW >= 320) { + W = 320; H = 240; + winW = 324; winH = 244; + aspect = 2; + picmode[4] = 'L'; + } + else { + W = 160; H = 120; + winW = 164; winH = 124; + aspect = 1; + picmode[4] = 'S'; + } + } else { + if (iH >= 300) { + W = 240; H = 300; + winW = 244; winH = 304; + aspect = 5; + picmode[4] = 'P'; + } + else if (iH >= 150) { + W = 120; H = 150; + winW = 124; winH = 154; + aspect = 7; + picmode[4] = 'M'; + } + else { + W = 59; H = 74; + winW = 67; winH = 82; + aspect = 0; + picmode[4] = 'T'; + } + } + + { + Fl_Image *temp; + selthorpicSize->value(aspect); + temp = thorTxImg->copy(W, H); + thorTxImg->release(); + thorTxImg = (Fl_Shared_Image *)temp; + } + + if (thorTxImg->count() > 1) { + thorTxImg->release(); + thorTxImg = 0; + return; + } + + thorpicTx->hide(); + thorpicTx->clear(); + + img_data = (unsigned char *)thorTxImg->data()[0]; + + D = thorTxImg->d(); + + if (thorxmtimg) delete [] thorxmtimg; + + thorxmtimg = new unsigned char [W * H * 3]; + if (D == 3) + memcpy(thorxmtimg, img_data, W*H*3); + else if (D == 4) { + int i, j, k; + for (i = 0; i < W*H; i++) { + j = i*3; k = i*4; + thorxmtimg[j] = img_data[k]; + thorxmtimg[j+1] = img_data[k+1]; + thorxmtimg[j+2] = img_data[k+2]; + } + } else if (D == 1) { + int i, j; + for (i = 0; i < W*H; i++) { + j = i * 3; + thorxmtimg[j] = thorxmtimg[j+1] = thorxmtimg[j+2] = img_data[i]; + } + } else + return; + + char* label = strdup(fname.c_str()); + thorpicTxWin->copy_label(basename(label)); + free(label); + +// load the thorpicture widget with the rgb image + + thorpicTxWin->size(winW, winH); + thorpicX = (winW - W) / 2; + thorpicY = (winH - H) / 2; + thorpicTx->resize(thorpicX, thorpicY, W, H); + + selthorpicSize->hide(); + btnthorpicTransmit->hide(); + btnthorpicTxLoad->hide(); + btnthorpicTxClose->hide(); + btnthorpicTxSendAbort->hide(); + + thorpicTx->video(thorxmtimg, W * H * 3); + thorpicTx->show(); + + thorpicTxWin->show(); + + active_modem->thor_send_image(picmode); + + return; +} + + int thor_load_image(const char *n) { int D = 0; diff --git a/src/thor/thor.cxx b/src/thor/thor.cxx index b4491204..6d3dbf42 100644 --- a/src/thor/thor.cxx +++ b/src/thor/thor.cxx @@ -1190,6 +1190,8 @@ void thor::flushtx() bitstate = 0; } +static bool hide_after_sending = false; + int thor::tx_process() { int i = 0; @@ -1246,6 +1248,8 @@ int thor::tx_process() sendchar(imageheader[n], 0); flushtx(); send_image(); + if (hide_after_sending) thorpicTxWin->hide(); + hide_after_sending = false; txstate = TX_STATE_DATA; break; case TX_STATE_AVATAR: @@ -1353,10 +1357,11 @@ void thor::send_image() { } -void thor::thor_send_image() { - if (txstate == TX_STATE_RECEIVE) { +void thor::thor_send_image(std::string image_str) { + if (!image_str.empty()) hide_after_sending = true; + imageheader = image_str; + if (txstate == TX_STATE_RECEIVE) start_tx(); - } } void thor::send_avatar() diff --git a/src/widgets/FTextRXTX.cxx b/src/widgets/FTextRXTX.cxx index 4efd2f50..8f69ea51 100644 --- a/src/widgets/FTextRXTX.cxx +++ b/src/widgets/FTextRXTX.cxx @@ -764,8 +764,8 @@ void FTextRX::dxcc_tooltip(void* obj) Fl_Menu_Item FTextTX::menu[] = { { icons::make_icon_label(_("Transmit"), tx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Receive"), rx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, - { icons::make_icon_label(_("Abort"), process_stop_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, - { icons::make_icon_label(_("Send image..."), image_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, + { icons::make_icon_label(_("Abort"), process_stop_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, + { icons::make_icon_label(_("Send image..."), image_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { 0 }, // EDIT_MENU_CUT { 0 }, // EDIT_MENU_COPY diff --git a/src/widgets/FTextView.cxx b/src/widgets/FTextView.cxx index 1e622f25..fcf2fa8c 100644 --- a/src/widgets/FTextView.cxx +++ b/src/widgets/FTextView.cxx @@ -46,6 +46,7 @@ #include "ascii.h" #include "icons.h" #include "gettext.h" +#include "macros.h" #include "FTextView.h" @@ -810,8 +811,33 @@ int FTextEdit::handle_dnd_drop(void) len -= 7; } #endif + +#ifndef BUILD_FLARQ + if ((text.find("jpg") != string::npos) || + (text.find("JPG") != string::npos) || + (text.find("jpeg") != string::npos) || + (text.find("JPEG") != string::npos) || + (text.find("png") != string::npos) || + (text.find("PNG") != string::npos) || + (text.find("bmp") != string::npos) || + (text.find("BMP") != string::npos) ) { + + LOG_INFO("DnD image %s", text.c_str()); + + if ((p = text.find("file://")) != string::npos) + text.erase(0, p + strlen("file://")); + if ((p = text.find('\r')) != string::npos) + text.erase(p); + if ((p = text.find('\n')) != string::npos) + text.erase(p); + if (text[text.length()-1] == 0) text.erase(text.length() -1); + TxQueINSERTIMAGE(text); + return 1; + } +#endif + // paste everything verbatim if we cannot read the first file -LOG_INFO("DnD file %s", text.c_str()); + LOG_INFO("DnD file %s", text.c_str()); if (readFile(text.c_str()) == -1 && len == text.length()) return FTextBase::handle(FL_PASTE); text.erase(0, p + sizeof(sep) - 1); From 91ddd6c9967c67ff2651254beecfad808d5477e3 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sun, 27 Mar 2016 14:41:07 -0500 Subject: [PATCH 095/138] WF only * correct for missing reference to power level control --- src/dialogs/fl_digi.cxx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 1cbc9ea9..40dc4b97 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -7557,6 +7557,11 @@ void noop_controls() // create and then hide all controls not being used qso_btnAct = new Fl_Button(defwidget); qso_btnAct->hide(); qso_inpAct = new Fl_Input2(defwidget); qso_inpAct->hide(); + pwrmeter = new PWRmeter(defwidget); pwrmeter->hide(); + smeter = new Smeter(defwidget); smeter->hide(); + pwr_level = new Fl_Value_Slider2(defwidget); pwr_level->hide(); + set_pwr_level = new Fl_Button(defwidget); set_pwr_level->hide(); + dummywindow->end(); dummywindow->hide(); From 58b394025646c88c5a4915f375e2c0caecdc27e9 Mon Sep 17 00:00:00 2001 From: David Freese Date: Mon, 28 Mar 2016 19:30:50 -0500 Subject: [PATCH 096/138] Export ADIF_NAME * added FLDIGI_MODEM_ADIF_NAME export variable to environment exports. --- src/misc/macros.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/misc/macros.cxx b/src/misc/macros.cxx index 20c5788a..2029d0e7 100644 --- a/src/misc/macros.cxx +++ b/src/misc/macros.cxx @@ -2865,6 +2865,7 @@ void set_macro_env(void) FLDIGI_MODEM, FLDIGI_MODEM_LONG_NAME, + FLDIGI_MODEM_ADIF_NAME, FLDIGI_DIAL_FREQUENCY, FLDIGI_AUDIO_FREQUENCY, FLDIGI_FREQUENCY, @@ -2951,6 +2952,8 @@ void set_macro_env(void) { "FLDIGI_MODEM", mode_info[active_modem->get_mode()].sname }, { "FLDIGI_MODEM_LONG_NAME", mode_info[active_modem->get_mode()].name }, + { "FLDIGI_MODEM_ADIF_NAME", mode_info[active_modem->get_mode()].adif_name }, + { "FLDIGI_DIAL_FREQUENCY", "" }, { "FLDIGI_AUDIO_FREQUENCY", "" }, { "FLDIGI_FREQUENCY", "" }, From fc97b4af8ee87c1c1f3a114e696eba2c94401ec5 Mon Sep 17 00:00:00 2001 From: David Freese Date: Tue, 29 Mar 2016 17:53:21 -0500 Subject: [PATCH 097/138] FSQ variable Rx * Enable FSQ variable RX * Enable allcall(#) menu item for sending file to allcall --- src/dialogs/fl_digi.cxx | 2 +- src/fsq/fsq.cxx | 26 +++++++++++++------------- src/include/fsq.h | 1 + src/trx/modem.cxx | 6 ++++-- src/waterfall/waterfall.cxx | 2 +- 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 40dc4b97..66248a1f 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -9391,7 +9391,7 @@ static const Fl_Menu_Item *heard_popup; static const Fl_Menu_Item all_popup[] = { { "Copy", 0, cb_heard_copy, 0 }, { "Copy All", 0, cb_heard_copy_all, 0 , FL_MENU_DIVIDER }, - { "Send File To... (#)", 0, 0, 0, FL_MENU_DIVIDER }, + { "Send File To... (#)", 0, cb_heard_send_file, 0, FL_MENU_DIVIDER }, { "Send Image To... (%)", 0, cb_heard_send_image, 0 }, { 0, 0, 0, 0 } }; diff --git a/src/fsq/fsq.cxx b/src/fsq/fsq.cxx index bc95d07d..e8b81f5c 100644 --- a/src/fsq/fsq.cxx +++ b/src/fsq/fsq.cxx @@ -62,6 +62,8 @@ static int symlen = 4096; // nominal symbol length; 3 baud #define SQLFILT_SIZE 200 #define NIT std::string::npos +#define txcenterfreq 1500.0 + static const char *FSQBOL = " \n"; static const char *FSQEOL = "\n "; static const char *FSQEOT = " \b "; @@ -140,7 +142,7 @@ void printit(double speed, int bandwidth, int symlen, int bksize, int peak_hits, fsq::fsq(trx_mode md) : modem() { - modem::set_freq(1500); + modem::set_freq(1500); // default Rx/Tx center frequency mode = md; samplerate = SR; @@ -217,7 +219,6 @@ fsq::~fsq() void fsq::tx_init(SoundBase *sc) { - set_freq(1500); scard = sc; tone = prevtone = 0; txphase = 0; @@ -230,7 +231,7 @@ void fsq::tx_init(SoundBase *sc) void fsq::rx_init() { - set_freq(1500); + set_freq(frequency); bandwidth = 33 * spacing * samplerate / FSQ_SYMLEN; bkptr = 0; peak_counter = 0; @@ -264,10 +265,13 @@ void fsq::init() void fsq::set_freq(double f) { - frequency = 1500; modem::set_freq(frequency); + frequency = f; + modem::set_freq(frequency); basetone = ceil(1.0*(frequency - bandwidth / 2) * FSQ_SYMLEN / samplerate); + tx_basetone = ceil((get_txfreq() - bandwidth / 2) * FSQ_SYMLEN / samplerate ); int incr = basetone % spacing; basetone -= incr; + tx_basetone -= incr; } void fsq::show_mode() @@ -300,10 +304,7 @@ void fsq::adjust_for_speed() void fsq::restart() { - modem::set_freq(1500); - basetone = ceil(1.0*(frequency - bandwidth / 2) * FSQ_SYMLEN / samplerate); - int incr = basetone % spacing; - basetone -= incr; + set_freq(frequency); peak_hits = progdefaults.fsqhits; adjust_for_speed(); @@ -1153,7 +1154,6 @@ void fsq::recvpic(double smpl) int fsq::rx_process(const double *buf, int len) { if (peak_hits != progdefaults.fsqhits) restart(); -// if (fsq_frequency != progdefaults.fsq_frequency) restart(); if (movavg_size != progdefaults.fsq_movavg) restart(); if (speed != progdefaults.fsqbaud) restart(); if (heard_log_fname != progdefaults.fsq_heard_log || @@ -1230,14 +1230,14 @@ void fsq::flush_buffer() void fsq::send_tone(int tone) { double phaseincr; - double frequency; + double freq; if (speed != progdefaults.fsqbaud) restart(); - frequency = (basetone + tone * spacing) * samplerate / FSQ_SYMLEN; + freq = (tx_basetone + tone * spacing) * samplerate / FSQ_SYMLEN; if (grpNoise->visible() && btnOffsetOn->value()==true) - frequency += ctrl_freq_offset->value(); - phaseincr = 2.0 * M_PI * frequency / samplerate; + freq += ctrl_freq_offset->value(); + phaseincr = 2.0 * M_PI * freq / samplerate; prevtone = tone; int send_symlen = symlen; diff --git a/src/include/fsq.h b/src/include/fsq.h index 353c1e72..c35f27b9 100644 --- a/src/include/fsq.h +++ b/src/include/fsq.h @@ -142,6 +142,7 @@ protected: int fsq_frequency; // 0 / 1 int spacing; int basetone; + int tx_basetone; double speed; double metric; bool ch_sqlch_open; diff --git a/src/trx/modem.cxx b/src/trx/modem.cxx index 0a358e8f..f9bda135 100644 --- a/src/trx/modem.cxx +++ b/src/trx/modem.cxx @@ -279,6 +279,7 @@ double modem::get_txfreq(void) const return 0; else if (mailserver && progdefaults.PSKmailSweetSpot) return progdefaults.PSKsweetspot; + if (get_mode() == MODE_FSQ) return 1500; return tx_frequency; } @@ -286,6 +287,7 @@ double modem::get_txfreq_woffset(void) const { if (mailserver && progdefaults.PSKmailSweetSpot) return (progdefaults.PSKsweetspot - progdefaults.TxOffset); + if (get_mode() == MODE_FSQ) return (1500 - progdefaults.TxOffset); return (tx_frequency - progdefaults.TxOffset); } @@ -718,7 +720,7 @@ void modem::cwid_send_symbol(int bits) sample = 0, currsym = bits & 1; - freq = tx_frequency - progdefaults.TxOffset; + freq = get_txfreq() - progdefaults.TxOffset; if ((currsym == 1) && (cwid_lastsym == 0)) cwid_phaseacc = 0.0; @@ -843,7 +845,7 @@ void modem::wfid_make_tones(int numchars) { double f, flo, fhi; int vwidth = (numchars*NUMCOLS + (numchars-1)*CHARSPACE - 1); - f = tx_frequency + TONESPACING * vwidth/2.0; + f = get_txfreq() + TONESPACING * vwidth/2.0; fhi = f + TONESPACING; flo = fhi - (vwidth + 2) * TONESPACING; for (int i = 1; i <= NUMCOLS * numchars; i++) { diff --git a/src/waterfall/waterfall.cxx b/src/waterfall/waterfall.cxx index aa12dcd1..4717cd53 100644 --- a/src/waterfall/waterfall.cxx +++ b/src/waterfall/waterfall.cxx @@ -304,7 +304,7 @@ void WFdisp::makeMarker() makeMarker_(marker_width, &RGBmarker, carrierfreq, clrMin, clrM, clrMax); - if (unlikely(active_modem->freqlocked())) { + if (unlikely(active_modem->freqlocked() || mode == MODE_FSQ)) { int txfreq = static_cast(active_modem->get_txfreq()); adjust_color_inv(RGBmarker.R, RGBmarker.G, RGBmarker.B, FL_BLACK, FL_RED); makeMarker_( static_cast(bandwidth / 2.0 + 1), From 8446e6e1c5583801d029a20b64cce6c517f10e50 Mon Sep 17 00:00:00 2001 From: David Freese Date: Fri, 1 Apr 2016 15:32:23 -0500 Subject: [PATCH 098/138] Version 3.23.09 * Maintenance release --- ChangeLog | 29 +++++++++++++++++++++++++- configure.ac | 2 +- fldigi_doxygen/user_src_docs/index.txt | 2 +- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 78911ee9..0e19e038 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,37 @@ +=Version 3.23.09= + +2016-03-29 David Freese + + fc97b4a: FSQ variable Rx + 58b3940: Export ADIF_NAME + 91ddd6c: WF only + 92c3c36: DnD Image + 0ebcc2a: Frequencies2 use string + 20ac527: Documentation + 8eb05e6: View noise + 7cd0d8d: About + 9ed6cc3: NAVTEX update + +2016-03-07 Kamal Mostafa + + 6da8d51: Sanitize tile_x, tile_y startup values + +2016-03-05 David Freese + + b1d12b8: RxID enhancement + f7662df: TX timer + 4e055b4: rigcat mod + 4c9f140: PSK IMD + + =Version 3.23.08= + 2016-02-21 Rik van Riel - bbbeed4: NAVTEX update + f80745e: NAVTEX update 2016-02-16 David Freese diff --git a/configure.ac b/configure.ac index a382da68..a7c20beb 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) m4_define(FLDIGI_MINOR, [23]) -m4_define(FLDIGI_PATCH, [.08]) +m4_define(FLDIGI_PATCH, [.09]) m4_define(FLARQ_MAJOR, [4]) m4_define(FLARQ_MINOR, [3]) m4_define(FLARQ_PATCH, [.5]) diff --git a/fldigi_doxygen/user_src_docs/index.txt b/fldigi_doxygen/user_src_docs/index.txt index 9cf6a20f..25f3aa3a 100644 --- a/fldigi_doxygen/user_src_docs/index.txt +++ b/fldigi_doxygen/user_src_docs/index.txt @@ -18,7 +18,7 @@ /*! -\mainpage FLDIGI Users Manual - Version 3.23.08 +\mainpage FLDIGI Users Manual - Version 3.23.09 \anchor main_page
    From 2a3f4d4a15e1bf085fc1ac0b541898bfad936774 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sat, 2 Apr 2016 08:26:15 -0500 Subject: [PATCH 099/138] PTT delays * Corrected reversed on/off sense * Increased max delay to 5000 msec * Changed increments to 10 / 100 msec --- src/dialogs/confdialog.cxx | 12 ++++++------ src/dialogs/confdialog.fl | 10 +++++----- src/rigcontrol/ptt.cxx | 7 ++++--- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index d495480b..b6acc636 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -10198,22 +10198,22 @@ le Earth)")); { Fl_Counter* o = cntPTT_on_delay = new Fl_Counter(74, 311, 100, 21, _("Start of transmit PTT delay")); cntPTT_on_delay->tooltip(_("Delay NN msec before starting audio")); cntPTT_on_delay->minimum(0); - cntPTT_on_delay->maximum(500); - cntPTT_on_delay->step(1); + cntPTT_on_delay->maximum(5000); + cntPTT_on_delay->step(10); cntPTT_on_delay->callback((Fl_Callback*)cb_cntPTT_on_delay); cntPTT_on_delay->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.PTT_on_delay); - o->lstep(10); + o->lstep(100); } // Fl_Counter* cntPTT_on_delay { Fl_Counter* o = cntPTT_off_delay = new Fl_Counter(74, 341, 100, 21, _("PTT end of transmit delay")); cntPTT_off_delay->tooltip(_("Delay NN msec before releasing PTT")); cntPTT_off_delay->minimum(0); - cntPTT_off_delay->maximum(500); - cntPTT_off_delay->step(1); + cntPTT_off_delay->maximum(5000); + cntPTT_off_delay->step(10); cntPTT_off_delay->callback((Fl_Callback*)cb_cntPTT_off_delay); cntPTT_off_delay->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.PTT_off_delay); - o->lstep(10); + o->lstep(100); } // Fl_Counter* cntPTT_off_delay grpPTTdelays->end(); } // Fl_Group* grpPTTdelays diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index d82100b7..96b68bbb 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -5304,24 +5304,24 @@ progdefaults.changed = true;} } } Fl_Group grpPTTdelays { - label {PTT delays valid for all CAT/PTT types} + label {PTT delays valid for all CAT/PTT types} open xywh {55 284 490 91} box ENGRAVED_FRAME align 21 } { Fl_Counter cntPTT_on_delay { label {Start of transmit PTT delay} callback {progdefaults.PTT_on_delay = o->value(); progdefaults.changed = true;} - tooltip {Delay NN msec before starting audio} xywh {74 311 100 21} align 8 minimum 0 maximum 500 step 1 + tooltip {Delay NN msec before starting audio} xywh {74 311 100 21} align 8 minimum 0 maximum 5000 step 10 code0 {o->value(progdefaults.PTT_on_delay);} - code1 {o->lstep(10);} + code1 {o->lstep(100);} } Fl_Counter cntPTT_off_delay { label {PTT end of transmit delay} callback {progdefaults.PTT_off_delay = o->value(); progdefaults.changed = true;} - tooltip {Delay NN msec before releasing PTT} xywh {74 341 100 21} align 8 minimum 0 maximum 500 step 1 + tooltip {Delay NN msec before releasing PTT} xywh {74 341 100 21} align 8 minimum 0 maximum 5000 step 10 code0 {o->value(progdefaults.PTT_off_delay);} - code1 {o->lstep(10);} + code1 {o->lstep(100);} } } } diff --git a/src/rigcontrol/ptt.cxx b/src/rigcontrol/ptt.cxx index c84e27e1..368c6fa1 100644 --- a/src/rigcontrol/ptt.cxx +++ b/src/rigcontrol/ptt.cxx @@ -120,10 +120,8 @@ void PTT::reset(ptt_t dev) void PTT::set(bool ptt) { // add milliseconds - no audio to clear virtual audio card used by Flex systems - if (ptt && progdefaults.PTT_off_delay) + if (!ptt && progdefaults.PTT_off_delay) MilliSleep(progdefaults.PTT_off_delay); - if (!ptt && progdefaults.PTT_on_delay) - MilliSleep(progdefaults.PTT_on_delay); if (active_modem == cw_modem && ((progdefaults.useCWkeylineRTS) || progdefaults.useCWkeylineDTR == true)) @@ -158,6 +156,9 @@ void PTT::set(bool ptt) break; #endif } + if (ptt && progdefaults.PTT_on_delay) + MilliSleep(progdefaults.PTT_on_delay); + if (ptt) start_tx_timer(); else stop_tx_timer(); } From 9c04f07877bb02416216208184b7498db0c96f40 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 7 Apr 2016 20:59:50 -0500 Subject: [PATCH 100/138] focus behavior * remove focus grab behavior of FreqControl widget --- src/rigcontrol/FreqControl.cxx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/rigcontrol/FreqControl.cxx b/src/rigcontrol/FreqControl.cxx index 40cfb9c6..6b628c59 100644 --- a/src/rigcontrol/FreqControl.cxx +++ b/src/rigcontrol/FreqControl.cxx @@ -405,7 +405,7 @@ void cFreqControl::cancel_kb_entry(void) int cFreqControl::handle(int event) { - static Fl_Widget* fw = NULL; +// static Fl_Widget* fw = NULL; int d; switch (event) { @@ -415,18 +415,18 @@ int cFreqControl::handle(int event) case FL_UNFOCUS: return 1; case FL_ENTER: - fw = Fl::focus(); - if (fw != NULL) // if NULL then fldigi did not have focus - take_focus(); +// fw = Fl::focus(); +// if (fw != NULL) // if NULL then fldigi did not have focus +// take_focus(); break; case FL_LEAVE: - if (fw) - fw->take_focus(); - if (Fl::has_timeout((Fl_Timeout_Handler)blink_point, this)) - cancel_kb_entry(); - clear_focus(); - updatevalue(); - return 1; +// if (fw) +// fw->take_focus(); +// if (Fl::has_timeout((Fl_Timeout_Handler)blink_point, this)) +// cancel_kb_entry(); +// clear_focus(); +// updatevalue(); +// return 1; break; case FL_KEYBOARD: From 76ab77cd0c6b4d5f5315d695b39e2f4151221a7a Mon Sep 17 00:00:00 2001 From: David Freese Date: Tue, 12 Apr 2016 13:38:23 -0500 Subject: [PATCH 101/138] FLARQ * auto i/o - Added socket interface to allow separate program to access - CONNECT - DISCONNECT - CONNECTION_STATE - SEND_TEXT - RECEIVE_TEXT Allows similarly modified flmsg to send/recv messages using flarq / ARQ transport protocol. * ARQ reset - force complete reset of all ARQ processes - drops link without any indicator to connected station - equivalent of stopping and restarting flarq - courtesy demands that you inform the CONNECTED station to also kill the connection at that end of the link. - use Control-Left_click on the "CONNECT / DISCONNECT" button to initiate the forced reset. * Update ARQ icons * Disable auto-open flmsg when flmsg->flarq->fldigi data path is active. --- data/flarq.pdf | 2287 ++++++++++++++++++++++++++++ data/flarq.xpm | 1181 +++----------- data/mac/flarq.icns | Bin 40835 -> 84251 bytes data/win32/flarq.ico | Bin 12206 -> 370070 bytes m4/build.m4 | 8 +- src/Makefile.am | 18 +- src/flarq-src/arq.cxx | 219 +-- src/flarq-src/flarq.cxx | 73 +- src/flarq-src/include/arq.h | 117 +- src/flarq-src/include/flarq.h | 9 + src/flarq-src/include/xml_server.h | 51 + src/flarq-src/xml_server.cxx | 216 +++ src/logger/rx_extract.cxx | 46 +- 13 files changed, 3077 insertions(+), 1148 deletions(-) create mode 100644 data/flarq.pdf create mode 100644 src/flarq-src/include/xml_server.h create mode 100644 src/flarq-src/xml_server.cxx diff --git a/data/flarq.pdf b/data/flarq.pdf new file mode 100644 index 00000000..01a119bd --- /dev/null +++ b/data/flarq.pdf @@ -0,0 +1,2287 @@ +%PDF-1.3 % +1 0 obj <> endobj 55 0 obj <>stream + + + + + application/pdf + + + FLARQ + + + + + Adobe Illustrator CS3 + 2014-11-12T19:50:39-06:00 + 2014-11-12T19:50:39-06:00 + 2014-11-12T19:50:39-06:00 + + + + 200 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADIAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq/wD/ 2Q== + + + + + + uuid:1DB51073376CE41187B9A68C8BD3AFDD + uuid:cf805a65-6155-fc48-92e2-0728527871f8 + + uuid:1CB51073376CE41187B9A68C8BD3AFDD + uuid:1BB51073376CE41187B9A68C8BD3AFDD + + + + Print + + + 1 + False + False + + 6.000000 + 6.000000 + Inches + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 39 + 37 + 37 + + + CMYK Red + RGB + PROCESS + 203 + 34 + 41 + + + CMYK Yellow + RGB + PROCESS + 255 + 241 + 45 + + + CMYK Green + RGB + PROCESS + 51 + 163 + 87 + + + CMYK Cyan + RGB + PROCESS + 0 + 171 + 235 + + + CMYK Blue + RGB + PROCESS + 51 + 52 + 141 + + + CMYK Magenta + RGB + PROCESS + 201 + 0 + 135 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 162 + 36 + 48 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 206 + 66 + 57 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 210 + 91 + 48 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 223 + 145 + 47 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 231 + 174 + 74 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 245 + 236 + 73 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 221 + 63 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 157 + 196 + 77 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 110 + 178 + 83 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 81 + 146 + 75 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 56 + 104 + 61 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 107 + 179 + 118 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 91 + 165 + 155 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 100 + 167 + 222 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 70 + 116 + 183 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 51 + 59 + 139 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 42 + 39 + 96 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 90 + 48 + 140 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 125 + 43 + 138 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 135 + 36 + 97 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 186 + 33 + 90 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 203 + 45 + 120 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 188 + 178 + 154 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 147 + 131 + 120 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 110 + 101 + 89 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 86 + 76 + 68 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 182 + 152 + 109 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 156 + 123 + 83 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 127 + 94 + 64 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 107 + 78 + 46 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 87 + 59 + 28 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 57 + 40 + 28 + + + + + + Print Color Group + 1 + + + + C=0 M=30 Y=70 K=0 + RGB + PROCESS + 235 + 184 + 104 + + + C=5 M=70 Y=90 K=0 + RGB + PROCESS + 204 + 109 + 58 + + + C=5 M=90 Y=75 K=0 + RGB + PROCESS + 197 + 66 + 70 + + + C=30 M=0 Y=95 K=0 + RGB + PROCESS + 196 + 213 + 75 + + + C=60 M=5 Y=95 K=0 + RGB + PROCESS + 137 + 181 + 83 + + + C=30 M=0 Y=10 K=0 + RGB + PROCESS + 188 + 222 + 227 + + + C=60 M=10 Y=5 K=0 + RGB + PROCESS + 124 + 181 + 219 + + + C=80 M=5 Y=10 K=0 + RGB + PROCESS + 81 + 174 + 213 + + + + + + Grayscale + 1 + + + + K=100 + GRAY + PROCESS + 255 + + + K=90 + GRAY + PROCESS + 229 + + + K=80 + GRAY + PROCESS + 203 + + + K=70 + GRAY + PROCESS + 178 + + + K=60 + GRAY + PROCESS + 152 + + + K=50 + GRAY + PROCESS + 127 + + + K=40 + GRAY + PROCESS + 101 + + + K=30 + GRAY + PROCESS + 76 + + + K=20 + GRAY + PROCESS + 50 + + + K=10 + GRAY + PROCESS + 25 + + + K=5 + GRAY + PROCESS + 12 + + + + + + + + + Adobe PDF library 8.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 2 0 obj <> endobj 5 0 obj <>/ArtBox[0.0 0.0 432.0 432.0]/MediaBox[0.0 0.0 432.0 432.0]/Thumb 54 0 R/TrimBox[0.0 0.0 432.0 432.0]/Resources<>/Properties<>/MC1<>/ProcSet[/PDF/ImageC]/ExtGState<>>>/AIType/HiddenLayer>>/MC2<>/MC3<>/MC4<>/MC5<>/MC6<>>>/ExtGState<>>>/Type/Page/LastModified(D:20141112195038-06'00')>> endobj 50 0 obj <>stream +HtWˎ$W $QAttFz 2wDf3X`g>"#_C޿Y~zC~Q ?%4i@ˬi*e1EfmmE@Jj}ԳG҂=o+5 ktJ ;i!59JJV攪φ3 i%CL9-@'uR7W?"XZ*d4\\feaxP+IM +w֮~"#`5kzYhSTU` 8cYI.9"cAhŒF}Vcܺ}|V{I; K]?#^=hCMe/tfu`g/]Fw7:_?߶p +ay.o4' je0V;, lvT=֌+FZ? Y`qD}N-00{=;[^o hm^x92xU +fi={r]7~a_q&n@ZaH =b;#׭"f.2H\IY#Bq^Q@SZINߏ)T$v%l e~`Z65danHdKEuL[  viM "LYJv+,RP$H?Bցy+ݳ .uM\ZQ 7`Her09b8k>?|+O8 y} ` m +{D&8w+X,WWj`: *^ !ekAܘވE8c`M9 +@!P e8gAXR\3XT=DY *8ԓ`NeSf|A :gP4I *\#Fi NryFl]0leroaw'(vX*=' W~HM3ł`DtCV, TƃoNJvcEԆm=, ;7Үš Fl*fzJߋAS!a{)H0.}7|dceքW׌o3rX2ːQ’G&^*A=@x (N1MwEYz/YǜgR5Ui.O5MvH Rʁ_\<rAG,H<gD6UÂǂpCRLo4Z09Hz#9!R,3tr Teõ;42ܼnp\yJXxu0̆D: +iYVSLșqOpuw Է Ԡ|2Z#C"7;CڲeouRy> Ԥid" ,TSA'g8M,e[GO }5ncYdč.ۊ]. 3sKF-i3-9(#KwUFSwZm1>F*.55$URQ<5#r6iRx-@(| nwg$l:$т.exU#j& PS5HreÀ=#,堌0#:*q}O9bA|ZydI&<>&!WǬA0l! >+ FD0*ُlϭȂ0)䳛g$sD'!N 0,+W!&kTlb`[^!E5B ¶M 5%G&N.Yi0Mtc|VHivZpJ3(M2\S<r˫O%_RKͩ܆뵨Ӡ*6GzBJVOrMPD|P&-PxXȶB6ttfÊ<8ad=pv\V-x&y&MtǚFPxm[^ +<3q'&$ y\0I 0Gp|q@DȂP).kk"V%݊`z7Ac0Iw%VS"WМ R. +!je[!6Of'Q"zt,n[ p_ӬΔdK2Gh>DiS$pBȸ=GSؖ? j6L+r"*6j639,t+.bzk9bܱy2J+hZ҄?A=,B[n biE>SJ4ţ*TPATЧ]LP+]Wf CE@Nz}LN1^EXJ^|"na,$qR?[dK KqWw Au!j_*e'`B5UMHaICj5rnoBmuWTĒ*<-$V̯8.P rLt2@e ⹺’>B)eA ,fn Xt1 5LMC^rR[/#2-e+ּ{sd>|rl! n}95E+CZh`R `fje8 +0{v endstream endobj 54 0 obj <>stream +8;Z\t4d+hJ&4SgK<*M.BMDj2+fOqHE*;L;/+G)b4,Da9\pA;FT62#-Fr'XKFm_ZC8 +O%1GRS=f>X@Q3Yf5RkW8)nt;M53!$%TDd-c2LN_]Je@:MJ*YYZ0I.h14:M5SqQB:2 +l>-5pR'kIkk?pVrFknQ%obGLek-e8#TX3V-[bGt]*g&Ih)LOT?[79[W#do*:dYI\I +N(TlXQkl%Fb;\XXPQZ*%RG0#Pq;eS0P<##Dg$^H1AYu>nkhle(Z)%-#+i5MtZ=P5c +cHY%EGJ:?QhVS;@@r,D+ZCEb`k[LMFQ"B+V6*\F`7&N].='Up0FYNBAO+KEW'sqW +EHC*;.1ueuXBab\:1GbBQT=)]p!HebBYKI0j\baE@+MKR7i9kn5YCS'2k`.%o?+H\ +Hu-@*d"#Q$6Ao?nlAfP'_%p,J]>,#`2PtMt=="R&2T=HLN@TjDB*ui!4&Kb"[-F%D +])?cFA7r(Il.MLQI?(\:WL$43lp^&DhS(g@]E2@7M^tt[.uT#*nl`LpY&"&(h8dKL +@Pk*qfH]a"s8*LY\d;I:rm.6]0QCh(0N?CpGb4Gan&2sA!:VrPYl~> endstream endobj 33 0 obj <> endobj 32 0 obj <>stream +q +0 46 432 340 re +W n +q +/GS0 gs +451 0 0 340 -8.5 46 cm +/Im0 Do +Q +Q + endstream endobj 49 0 obj <> endobj 31 0 obj <>/Height 340/Type/XObject>>stream +HYsFFqB82x&mUjQ$@5/I$MxOb5&]~/_ +Bkeb/ґo}ʤ\^e-EV&KnŮCR5P{^y'|:$[3k6|J~-dU 3Juedw2R3H;Vy#sMIiK-T愰K8GIei}'޿7efEmnJS.eNZTzyiΚ.Ң0^+.jtK?SvLfEJ_-I]ZצȽ52 9RP% w"E*}ތus^Jɦd]i 2̧]ʜhC*R:dJ=,uX̩a2'a< +'zrכk]JIdE],^M_i6| sRfgȔbUVNYAl;U{tM *@iG^g?i"y?<]~JM863]LiB /,*Kvl3oUar9^iṪ}w '*]eixJJ82K]mb),NQ+ף.t] vTLKͻ~G$iROB {NIR8DYW5n{JI)Rf7nj}`M&088=.cۉC袖יr TTeI!Y̢r:Peo8]q:lHp'Qwœ!Rf'l%kB(m]sܪC*-z5*UErDU*YXGN=tpA \\ݛ9^] b}YD&QܮR]OiGNRM2M4EI2%*4ױ?p8{JUȝ0g Cյ@0 +Z}Z*=KV5*eqSJUu|:.'zr./i"8&~4-yН0 yR(GIk u/R]JWu=_Q%UrӨɣz,jP瑚Gu"yaGG+l>qa,Nxy=ޙGI]AL,!(^[s+wt.]Si]EUq3&S1cUӈ&Y¦ +=x&ҕғr%w!iЫ++Ƹ8X`=E8!|DAݳX{wJyRM[wȩ0 u>Yx45R9:=W6ʭKF kM\}q%.=wn +%Bj+ğq~._nT:3ITZgƦfYXZBƲpa$AaR#E) WeXkQg0J O{vU4RrnlJ6r밵TȬQ~: 8 ][ܸMiյavAJXaj(eWB!0v@yT/Ty.CݚAWOwQ]F˴߼3*-ӤJGUi,V9Ӹ 2RE]EzT5L]X?(8eFq8-ܦQ:Qjӿ2_:3_wCNuIcZIٔ,)iVwR]Uu.Ѷ0%J-ҪۄIb)Y!԰Ʌ?qqqW##t)h'^;٣vch(È߾+KkȲe*в#Jw56]*ƝPU;UPa9 dܤc&$Yl(㸗4*'% kyDK#vA"y֤Xm{,I:ǎU;t.%*!gҤ*[W2.T˭G >ؽ +!@rqBு%YE$ME (r;3u^{k*33ɈLvTǏC +Zu,n'r2ק&k60ʼ>^6JJE<_2Cit;kߌ910E LGCc6pK]$].\S=gұ"%ݢ =2kox=P̨̩T JUc|Ne((wĚIFbbmڃ@~ "Kz +T!Įs0ٌHɴb1'8[̮iF~tJ 8zw꣞ݮ;ԶDy=YgΤZݦ[:VVwU Af{ˈma0Cz{cb- d(xUÏ .G%y/A_ =t?JgP: @E=멪Ѽ]}]خhUUUMr" ?(b3#1m'+XDA:Q8d{ boǎ1ձ_gku@>q/ioRr򾆛d?&%{%g)ngL,5|F "0Hd1!h6o~|z(}U0{W1J,JZ/4r vtUjeLՅnΊK]uO WgH^)2/ߍ% xm&o4YAC ,GvZ>:,T 3\2NѶ>eUyL\d:$[_XJJ[5K|W*]7ԮSSv (GCjE6YNuHb˒1 +z STNbѵn[SobbEPJdt6u%D0N!@͚?ODFPkvZ$^9Kϣt~Q) w ]'V;SUK):I :/qY1q 3 D䣇K17%[d"1i/zX쨉VuM{O?˒;˻֗}Jҫf_|yj/ VjѾMt80ll=ee.tuR?:Dr'? (:gvK*Dpv +IE$Ȋsy]r|"sőRt$.&6@eG)}YYi@J"ƃjv6TBCoURw[-ޔҮnժZuy%xR<02(!)4&Rl;!v}~d|2FiUoG"gY0碈:&F,ba{_VzD,JzfY:FiҀ9z!SC(4ᦲF 4=ڣTyjSv'K.Id I)O +]d27bba4}!|#dh =k?wrqFЏ;+d#ј{n4ZDSJJ n +/KgP"F^~AcmBLt2e67.াZɦ427'ZgFu^=P<[dxP0&N@=ؐ%P:jXxa#TR$BwӡZ{CQz9KRپP:͙־; g*K#_fm#W4R&_EwBJafJ͖JNu-+oZlBMts6fZCHPCk_5hUQȩv3$ 0Fk,J|$/?~MzzY:r.3ĴS(9ZQGXT +W(Mnݸ6(])Jastե9*Mf}TU@ސu8Gfa1HT/HN; Ѭ4)B9 +6+vR,,Ofq8"P^NU=ԐU'dr J?-t q3`& 3O ?|OD<9<b96Sh MTk.X0co[70.(]Reb5cfo1Πv0=7s(m +382QhG8rPp%VzR4@nJ7u6) R @P,!#I$*=%SAhZ2Ĕ~p5`TivaVjRy}J~CTJ82Y2Ĉ69()VZL9j J5,Ci^!9?\U@ aļNb1bCj'sWTy Po +VCxb@QAeq{qܞZ~k8gNNiZjTcM6{⇶Jmn퓁NRJLGox3DžQOLi8 +,BihZd.S)WHR%uBj(=z5gk>.;-JDpjU\*TMb&E? P9^M-h.W3vE".!w9k7-~'oaxE'ql_y8upU@q~lY6<'%?|O. gD!jS15n +VP*φ`'}y Y-JMkյBJDp5ix%k7~M/[G"VyAe0*i& +5 Ujb7BqFL6uᕶ9%g98u>Mwv$𸝜$ӏKҘn@ ]Ѳ4hoސ? wg&Rg֋5H2F QlȊ e D1 cY,M%ZNZ+_#.a T8E!Z$rz,:R5]&W-h! ?/3_& 1a\4ΚQ-"(GHQ/nD8v ()a(Ҕ*E~~b&&Z/.̳Qf{)E[*W`^Tb1@Q=n_?4fONt a':nūO!,|Q4* + ,]R)vN*_K'\l[8ʴO/~60LUg)j& )Jh04kQ߫BJUi>34XH3n6z+ؠiPe|a%" \PuA9C-vE''&~`)JNpEt(Ip/ۯ;LY`9|Q* 6+il%8fl:d +={h0d0,)$3p2^%@)A-^7Q+P:\y%t5[U7j"O ;B@-Rcli +,FMn8tq1E0ygƖ`bTYZ4EӴ(+(-)314(`u>r`f*:bEr +H !oZ4q;v|'z<<>,GVlG( %Dvӝ sp kğA[R (HQ8CX +##!) R09()0$uMt#PꖩAXAQqP:P1%\E5WWi H 2i +V:tbP<<Ð-O{;;ev)kŸݺj|4\K(;Rs1MApiX_ s[QoE//~r^nNl+zpOہAiQ'ONr~Q53P&"cW`n؛_ejէ y߽C/uFR|hNd0/EM( c;#v\IqHsh$L=ig<ŶXpTאȣ4Փ +DC"/1^dL ҟXeK(-R)LY$sm*U.ZN"ȣ(h +BGo4’ԥ"P1^bH#eEUtU\Q8ELtHJ:s眦U.#*3A)9Kߞҙ˔jR鲈77 TQ@)fʎf-㒦 4z@6#*F!BWu [ݎ{Q +;J'+BJ+]0 K?W];@MS;#~~wR=`l5w?@;"6pq ;!A+8hxMgv`R)z ѵ*zG0Ϧ"_i> }0rmvgU_Y0߫c!)8 +J_?Q45g zN')Ʃ(b-KT +XͲjG 33jB+k_IĂxr:{%eJ)S23SI5\$u^Ooy0 +y0Тb\攊x/R"Z荛 wgjֻQmeG)u>oFkX )URï@K4 A ME*eZW$eJgEA >:0fVQdqGF? g'SK)VU%I4<3#lDeE4DQH@]Ki0v2ZWRE0Ɍ[:FZhu "(Mrˇ  EFƹp,nrυ UPLG,> rV tY5v\u;E5gV]w!4n.0*d-ILD/{߿Ux+ޜR)&eAӬ$hYSUS4meDPG,T^ M[M P)*gX,Qe˚WQ`P/7-t :gÛ+Yq͉-Y9y{{kn^|.k*ыiD+(} ;F<,t}2p3I͜`QGB),L.5w}WFOh1WKT'+$"GO,Y6sdz4;D9{j̣G!5MA(:ћFQ``S}ߘ"6 .f[_^_K+Wk`"ie/BtJ[=%Xi[2otVK*QZRGy;p:Mu[F٨;w\:aeҗ\(B7o/@hj+ITrJ]tJLͣtN.PyXc̷3 U Gۭ`t< +7C+[0DۀR8Hu:O&WRˀi4W,Q%' *qb41 ~a9YhN@c.MyGJTw@)?U~4JSPJc3IQB)Tx)g\CDAO±JI?Ci1NMhiDӘppJt=Bitxȋ9c߯v7un%Rcj{oF{puiuqGGYo{Y=(z;%vʼnt? +He|=>q"ðT5pGXj2Jǘ-SK"4QUTQ%YL/ǘ̉0= M0y1=lšBjؙΞ[h6ܮmFqY,QBJQ*J#V9MNJ2B#O%*br~`3;J)_S6QSE .]~'xf(f4ŒY0Z|!11?fG҈n1DICxD!5y}t=*b^fS7͓crlXZL&KS5 -p Rrd< H)9|A'Mt9;B*RC$MLyHڟ%ZL7G^\*Js,-E9|-ⳬRc8 1ls +|* qx=\Qk؞cuQ*U^T6`t:Ty!_B5(|y/C'4dZm}vqv}t\kϺr- +M>*Q:ꖾ=\vPκ0y|恚Y}pXg39MSQ_e4-4EZ{/QVPFˌhTc!xb>XQ95@4"§4}W-Y/gjjFP4% +4(t 9Je#|B4tSД; ++; ) .cJ>**#JJJW@t +o2 +>Ol5L0Lى&YRfRA((p4cn\ΠiG?**}1-]nСa*aE߯QԽ`s7,WwWZ8+u^Q TѬWR2:~dx>~yGw}ӆV`[4C(SaTɤT'OG!"&:P-* iNL((HNW~۶8λx'/8ImOkUk/:lCߺa +(T;qR_uq|i'qlKxEQWx"|AHI6u|~)ꂜ2A4Ei( :^d{?(gK D?CQ/QJX +J7қ 7jf(-e4W.Rg8*R|EdR3P1(1b@;/[RpL&A)65QX J^L0&g:s)oK3[Zobح{ Q{3bZ7ך%()r6J6%@dDRYWۭ&)SrªH|OzC~oX~qCқLM0Jf*Hl0_~!Fca%eiLSX`_(9; A54(3Q\j(1QB LB8:§J}߲tM^҄J8EȜ:} /βҠJ: d@'By"yE瘀Yo>)*x][)@J%*0 '\LB (ڋ8xѯʱ.?ס՞9Mm5w 1*[J*{եZiͻ4!μ]׼fYL*K6ZC[3Z5iMgf?TG'ј#贆¥D A짟(,%(=|~yEZOJԿGK9(Hr +ϩlLds?NggxMFBCZ b3P9ǽw±*"Z2`Vm9ۦg QRXTg[s2Ph.:8Kn: i:bjM{c~P]ice3J3EOl5*}*23t_gj)P3j;Ugǵ\gNM;2! C?SIP"LLU!xdq"7ť3 +& +$2ZhpI)^p@IqSʏⰏP\^)(IR(7vP Dag FA4OD@Sz~Q >eRxQLJaYzzC+WR^-@(VcJcN + P&5pp ݅^ZcHOsk!B죴DXC7}ZV2>e,VDi4. vVѣswkKA3ӞASg&חjCYY@ԗ,(iLFs3ځ&uDRM}A#'|oe\8˂a=hcx&cQ(/Eb*5 P\VH,aq t QBPñzB3 4PO9[tЄXC\2%%(y{R& (NJ)noܯ2Ҍ ZB(3 EKc>; oۻ:˝,|{V +Rޅ ΙDqvnFOc8xTWbfW7zijܞϩwGkjw f4gj3T7jyk^mm ?IG u2Ѵoi_&#\'d4i} (hP:]k.ft@ؓ%VY8b}`:4i +0X"hAh?Ӫk>4ͅVUۗ@0*кEX*Cp 2!K0&$n)>E_pi<=5]d.j[mdd%A(XvOv,qS\y==wYi}tP󕦳6 +n:o-XOabhҚ)~󋟭T5'K3l~rGw͠tA&Q+ )_a`mh"URv +ΜSWǩiE6| SA=Fn<~d{ڳ rז1zmp|`IC1{odks1k@BȂ&-yt2>^煊xr":뭷m 8HxzydٖS']Wlհ˭cm +r~0@]4e͐c5ng'qĢxDJeEo^f~QN$3.;%ޖ+أ$uRR|-/˯Wz#tϡtvM_&s`<:8 Uy<R:`/|x3gBf@EXz?p&!Nvty"; nC+HO$Ps[(ϘP~6K,->c 68/0g{s|n>88DIR:i }u)MiӇ@i2RG +FE5]a _F:IvZd.n.(p}Nc>6CwC3 jbҸM>5g48ٯ(: +XㄅdY +礧SQ>#ƅb +킨;+!~9pcϹ#X@yI834}i@ih A鄣IJ))Wo wcJvL +^Ai>AS:)AǬ^yT% +>*y +r㹬</_|kJ[| mT1LASBNTR(>TJJ9PoN +dtnCJEsw;G6mas4ԩ9%Ft*i:4.6ꞥ 'AiTk>/|NA}A\ajz)K(hDi㪉Gy,'Ehgͅ 0?P5 hNrȁ".w˟9<*r 1GDA)/e*J?6xWөWX9:ZBԎ(J(0|hp*1z/z A@y_xrHi8kԺUvj%=M; ꁦmJdՕ]K۱mfl%!$EH$.m4 0 +μojSM$i8ihSU3šb +Zy'x ǒM4zy +"VpTX D"aX:TX#z lPY5ͥO)I_JYx؃D̑#_/e(8:3XP7Al8<'bJKӛ5Uj:t4ͫҼü'Qg |82ԸJ#MPS*K; 3a]5ÄAJkPS[&3pjF4Zs[׷ c6}ೣJ7h{܇! +DMxlJʶn|}况DҖD֖\qm]iꂖrY_a68[Z]Wj@ߩu,ذ;1NjCz0WT Y*'OF:KN|k䌚F*QXR"h +D:"^~y..]Xƚyot߷\/(T.T |y;*ǁ]p-(Nn^g}_'{o"}(^On&OWcyЬ+qe$EJ >^i8x?<{vセncAG&8c6ptsL)LD)%Uw˘PLՔʝkf2ȿ-uhZK€|~nrW_KQkè,1٩ +'Ӡ_NQ:Ҵ!OvV 6:5}QjbpBGzH(R*aQF=:Z2\sh`R=+ǺӕBe=! Nc2jZ,<3GQԡv6h; Os"C3~01s(}+CJd~[Ci)GFU: /&+(+N&M :"H)8 +Cy6$3UA^6g}FDQp* 5@P-m+"seвxtU sSU}"h~MGJSC^Ҫ5Μܾh_s2Rl/*I:QIP[ze,%7Ѻ`|K{N^!%.zY'3/)Mj:3iFۛ11IS4;#6k}S4J3k5Ԁ5tTYNP7Tztj;OrlzY]yT@Ínr()/C )A[G"˸"8yEg`̧N*7shGcuf>'o@i~RjR2Y(E>+IaK}689M.h xe&x; +;04n6M/I:TQݙ$;8&Y~O4trD)DZ)PjhzrEB@,zxJt}"mځROS)CZ2i!ܒd:R?!÷CԂX!ҙwL4gXf;j~o-)<&b4ueF}zF+nQ>@ +٭kVEs￷{nޒ|T髐»p$FNhnuXo”5J1Z@SmFO,Jqɧ S1 ЕDDa8g3-CS(|J #>`3fỲFv0pNk:J(d$cǿtRtk'/~W[<.p[v7͞v)9[s9Y CY7e™~?T¥_ +ʱ wEsXڗZb+-$5$Q餩 *>z((F#m>̬wtܔtQI]A蔊gJ[͐䟛J}U݆FvV5&D}fĸK+E֛*޻4su%s}z56{R(I:hXB v?_zt*L'bt:O#;ZեcUP5BZa(˨yP>=A#a.kyrNYܹq#grV?gkg'd4Lߴ|τArETS[2j(H4 d5e'Fith" m$U%>/$WĭuA5у X+l##L*P^>w귗*.Dp0LgY P؇GWV u2%UP&6UKO,[FEޫB,1tΒ2X/+=Ots7R<W$)${gj,DJv¥"Q aGί)-B(, =l"p?1{ͽ_m'dZFrJ ^>'i)jqA(FT)P3ҝ.TidO7FU +fN4|ւ&^zxX1zsYnRKͲԵc @KM]|1W|ӀҙNj*N^Pm1o>?inCJtVNm^'CY%1J35J)Z}@)wVhoEִBkǬVa$*h܊PL`"JGFvhŽ쩚)UD>AM0P֔Oy1s!K^_^-' Ν"gaL6w~|thY9&\3u15ڞ Jޥ룴ݡUjʼns} +iS#X)L8sL2R^w\R>XZC3TGtD##JK&-I"t;G>Oe/u j |-աmk*ޭ჊tX h*5ChVvU^S)l^@*jl⺞GJ7˴JJ5NQ_gm#wEINÙM>[lE6NOۗ.@JR4 -YeݒIldE7L:y(`8l|5V'zV-n5X .nDIj*bQy6 -)(Jv jbKN(ӡ2 +j,hityީ;1vBao#3nۛt>tF#R?j[3;>( ѾY\Fμ́:Tuǐ9(71/ (yffIK-ChJP _]3@!2-N/tϹ!WPoRM+R^,|d<( =ȐT 4cŢ)mw*ϥtV}H?G~$GwrriU 5J'Mj^rE ߠ^sfUU_[i +Raz:$ 6UMn&65"rԥtS-mE>G=1R8‘$R_"anR[uMO=}:xNtP?~J9ү}n/Z'I]/@i PQ7>Gp_ᙹO=EyfX㲒Y+]aкg(DAS視7T*HB'ɛwkyFko5:1M=](UT [w孵)3d(dtxOΊ:I"5p1#bgjQ:dor-34e T$Zr wQ72F ݌RDG!ME^FcƐ=X "#;19gٞJn4ԍr=6zA/㸂FB@ukg@_/FV!(e݉9!F玫6vĹ47?8o咮ctKЌS6JĊF*RQULkjϱm"^kncpCxe5Q(5H|UՌQbҠ&E4ŸI$#F2Qbe,mPX|GNt̟4sTwp$K.\QV>f}5t"m+%9{Շe(;ri5]CY Gy%O-Z+OsiRf0q!p%kV +WwŰe,f)2gTU0+ZCJT( +bH52Ol*55ua$jrTO5UJщuF&O4 +# hQѐm3Mcq#_ d_2R +5PCg + +qns[9J^(Qe?J.2o|1fd|Χ4PqPP/T񪘬r-5p,τs䉘:E<>!PUS-̕L7(o7 ؜g= c`ݫU/+w4ivՍױs2`Ƈ*m6v12cf NhɒEhldu$~fBd-v(y̶ѝ{h#73xM\M/-jl,%ۂVR߱􊑟Y8& tT$cao_T8ڔ)\Oz\HftGZ5&ʕ*g1J7w~5bu89{IWF@ٙPXS 88ڠRO su)WN٣U +>z^Rڹtuo8'AK@a +tNS*]/rn^ +:cj/n}+kY䴄Pӭ=nTJ'sZR: 1e?AvBm=h'zc+HUZHk)]a +[_DP: +-D'MuvQ_YUx}Um\3F1K)d7QW.cTj$ڱ @nuAiJv N UGkub 'E +>a1'$z&7^rDM'dUj)AuFBQFW)jy8ҙ ʞփ_HRpt$ ȿW~PJakَήo34:ߙޅ \_/+X"gc1:t&+ęR.Mad8` j:b(SƐ5ڤJ -ȱ:j$JHӎ=Rq[Ch#!u ;4J_?\]66M,f5L0Pc0FUڊVTmZzhD +y.cPOֆUۣ:$Tww.1A&dh)H 6iNVIG-RUWӯUgte +SP\kMݡjjD%a'C)^<(, I_TUzJ +f| _ Dl3AzsNޥ>GO''(}KYP]T0ukTJ}9|˶,@ZzQ!i9*j3pNn2QGPFZTkS嘄O 8XD $ Wk4VѣF,o)KlmX[ײ|h2m:A'Fi2g[{?Ho, _wl7q}_ (: J$r"mX;$7U1jA$Th9lVoџφ :uJ'LԛZHRQR8Z9٧tڂuZj%K6T}K+q%N*hnM$UUu$L/2H۸ +sPE7D;F3i>;;0~*bTSDFs2SID=zk^KI? {QyF.n')M#b?])]\{ٿh`N[yۚ7y[En 7=@5*5 %Jk5< O)?2B Tђ)%7Wh>]]1tQwP:I2[_S(5{j'J2$QVK%j#=A8Y q$Chkxhs e'{et)4t\\IqwL@Ӥ6u&+_uVLMݸVL1 hR )TсDk$Dm_O{ +mԭ'ԳJJ*J=>kIܿ +v{Εҽ^v#W[͖nNwwxz WnYR?*]d@;0\=#4˧B*tԚA +:pǠM ̚^zr4Et + !67z ?4xA-R6Hmx3xik^we͛16;K#{|=6l,kne4HiOxo~bHQNfhDK 7}u~ +o9%ɶ~sYKN 9a!Yi<,QeԻVm[  "ĥj1I+"2&vKMr&Q̤U>,tho^O2h/.3Xql+nɫ;L 2iǖ,;DQFR 0jWuVj5)ٝjOT;5qĎ8B,SV8x#-4}pW{ \v\{u G{>! ! ` ]c;0‹Vcavt~/ _>X^sQO^q\P:3ujr6fo@i>߫.kŠERT%$ٜAFJ\ +cL)!Zd TiM*eTCy좁J1i'whH@Y2GV22'մ')MU:6$fil'nZMY`+mF ڡHϰ$kQ +R4x)Z=\9ʣ$('SF솖4k,Tgܵj5*aԷPjXRF(j*x-LXѧi*D;(J?#WWq^w/x9 + ?s G4׾X~}[?[ +0AiY䘲9N^:RRx~ۑ~kJ/:*?JߨtvΙP;.z/V=* +~f੔jԻMgP +RZ1Hfm*#`TR⊦V4mOQGSU#Sʚ(kl>J"ƆcpN#֡tLkgnE3Z&)=Z0ۈƾ»݇ +Q:Q]@ TrrnlH@X +BB1nGI6)QS7nM(U +18`] 1_W"R$(EFJ5\|N:iv&MQz؅mw|{@F${=~+n{{4u O?w}N9Fإ9)HN:*ݝsHRh{QΟ>7P9MZdkTJ= UU)uu+`*-䅵)$8J)p&<\iN=&AT-c?ě؄Ye=b{qԳ`Cj RN$Q>0b7:r +.nDʦ( \xjz$58NL:`#Ō@8jƗ#%"Zos*ާ0ѩ`-WoPժ՗}p9&힏!0HR~u{C)r[ZZr6}阣7iyzRz~{p|QھR:\B˶W錵}z3J^>{S 2/cNT%U+)j)(a(#J4}\"rI3FbtJvRj斱.s[ѿjI! SԚuթX*M뙸I(6wz옪gwAᔗND` -b'g: A)h +Ԓq\?jb$˄W3JWN&b|-8u ;'hl'JW:Ďij +ήձT5UZv{yGJ~h:~3Q>_cz-/q`dbΦ}u#$.{({' N^txl/VG(stm?^S9Ɣk]_ ay3(5|DR3(UM*`)0{TQ{Jƒu}[Ww_ǔLJl0)m('7ubC[I}w=VHVf#$-O$r[B:Y"S* };"|am~/>B-Ij .CK媼8Ԅ4)g^a(Ʌed|1cJ1.Kυ8cg=AyYڝ*хAeXsRJ-^]#j!ivYgVBB/Ix*v)u=F[SJU:տw4ջ>gTիe9{`g7@ y#9 (/vjRg6.jYA%[Jz D9xoJy߶.lhk޿mlʹv?eO߰77MH JJ1E<)#;I[if|j%|Z,5:ᏩpBF-(E|Ya +!4N%z +HjBʀt XP\Dʮىc' n '985cj%)#|G)bِBr! +ao-☠HR7cj0?:5*LUt d4e>5%_w!p<Uو@iϸo3WU?ydu-nJ_}OߎyҁuFvp[@9}zZO*ɫ e$OJUra`,- lgj){AKs$!za+eꫮ_K}^ÐR}5OoSHe*Db5 (;N"t呪SO%8:V58GGycE&Ax§U18GfPWsrZ#bGnd$tұ`l.HyIT&=N9KM.Ԅ% pǀ?U) OB'@6{g>~]-dfmffn%_LrK9u9k,Tt=H4/MAQpTGɪy0r.QꓔsJ\]HRaf OY"cptkϻѻ?alo5?[VC Csj! +1 5vN +$V0%EC ׄH&hlEe =]y;)m`*j0GŒG!h!M%Uh1:U5nS[ +{$k/g^Ԏ}Cl=f',sL]G/2UAngnw_S}F =~}hJmVĤG6>=a|:<;_Cڳ@{JMsgRs%c.MsQN)TPj􎔎wt<Px}I/R^[ e%e4Y:5xDԡyy)! 8%?^Ȗ3ajr1(GI:ITWM]N=z]w? M_/yy{"HCMu,NXS/JUɽMZ5jo!|(\agWyu}F.J^^ͩYej)AǠf45F ~/-8R3=U!h + R>e6OВ#>A ~)P4-nɠvN +r1J13,x8:;jzRjuDwPUjћ6:^V*PGJOb77O˾"9cc!+i[t\>{DLc\sxwGޱGmzMU͐ҁޔR>j җLdzeFI5RJ |vPjԵP1jԂS$UXI&"B+parPPnA[\PsCR$5>I o|x9 6?I9VP]`C[B\_@H^qȟepK`2W($6p3 +YRRJP@YI3&$ Z/J]M%*Vl5*Iq*B0~%9DW2f|;h*ԵJ]=TiǤ(={;W;Uڹ%@?!:һ'MzJJ{߇Rڜ t:݃ @w׈k)J׈:5R*u:^ZRYʒT=$( $:4BkOZ+(+UqIU~NSl<+c'jZaɃHl@@B E}kU֩:6Ϸ @=1\e%\2_RzNI!uJQ8 iA6Zu$)<Ó)AǦFxbrL`] b*<;\~W+Uff%?0 +2ݎB/GK6iO05) +C)'U7_/&_nO\ Jt]RzGxnnRO6WUJ(?!Y93{43L1\9s~5IVM/@wy+U䍱L `ijrM alEitrf,D M$%N jAJޯyct  +5(D&%ZYy74Rq~{SHmȓsj. j1Bp?,(Ep3~upK/\].s5G'|#M s#-rZ}Ũ: +2l1$q`!F ‡~kOUc6M't̥%=h{Au&Рpt0E]G8C]?{/f{cS{)5)WҶW3&J.;ty.%J:ԨAo.˵A3 \cU%R<#(5ﭔ +3)LA$O_^sIBTK % VPSU7^GB*zL`] /wK擿NaJ9.u5xe9FjuW+iJPxшpPH8Ga!cJddFQ|<^l0ttJgLv𜛀x% I>BiH(qm_{0=7%1j8n1KL=919sw˸5ܗ&^wu] юNQnM}D< +@ܔt2Uyz@},AЮ]VCM:{'jF~2t~(s3z5DLe0|KR\1nԷ4)ޣ1jj<;)e?,&3e/c(]c8o5$pN58D4>{^%}h|K]k`׮uV= Vx{Gqg| +,&`DR>LQjF"NkZ "8:A { V,3^~>.rbvM7fE|RC:8JS7R`g(O,Nm:wLV Ӧ^=lCY+f<ͶOǿkʹgw?q1%bPo{3L.;.!ӹ>jm4DPzE +ף0ן%zIUS8"XJ1`( nVÈJ(ULXU%{Φ">R˪tRxw7/[i}OS|!ؔ_dw1i襴wU^$ZjM +;q^%*ȥMJIR@`QJ5Gч7 f[9c%-&Q>)"(DȹD(8AϑA5n"Niǔ)MG +~Ujф6~O]];_N8:t(Nһ[Ƴj|bJomJ;mbj%oYקP:٠FbA3ģpv@DuNxΫ}UjP=Jjwb_!,"GiU4+VME+zJ%^&lF !me l]ԧ1IͽLԘ*!&ݸ*.ǴB2|G`UDUIRRaG5u&sbkw- Z.j|!"b*\*AP$E;`UjQ9>8ՠڣf{Ԙ R-}E=vr{w'?!'䉣rƴ_0ML_'_!ݹEtB)nvϏ^w_Ôj::6.,zOZ)X.v_RK6o9 aTtRj"HUS)j**5N[Q"bZ^d8j)T*ϟ6]W3YCh3*9 ,#dp/%"Q$TUE +|** :i #zmj; `c[9G_6dwM~;i;m3iM`nNf/IȒuLҙ,39:B?dՆS*GKeG3TSmd<[SUJiUm +^d1VZ!5mS4HY-6@;‹/pSB+*؈`$?P@_0w(Ǽ}p#Mth'@.Xv&Az= +'G7.t[ceTRsjԐiґoq.`H)lJ܏/ANn,hUWsF}!+:ޠXPUաIfWwȶS, };oljdSL]M<-᧋E L]\ݔA+)RN'[sev.V$}Vy⦠TP8J'5ꂬ7'xJϹY:u*˧(llKShdzH&tl+ yG2Yۖ*R +Ko$fo'(6CG&wvX^ww˯6}w}PVzu%|khZAD sL/P >[MvnXoVn h: 4'(55j)[髹l-kd:(Q#RT?~M fFhCdzkۺ¸E-"5IaTU`WԵyB mQɮjYzh,d9mKZH)!e6{=l=: +@B[Edz*2fE(ޟR?T;T$SgS)uIGFpjN7 2~dшVPUIaGl_ Ұv|69u+ EAaoyAyRʙvhQ3TUڭRiꯤWI?<(Vz{˜Sg}WJ/vrJ3+Q)*lMR(JN@_SqA舮Xn!"zJ춊 ,nM"md^Zm'գ$9c0%(*.vULP +4bC)ÆS*qI*cIbz&ggh,/%$ Ŵ>[DOK#gIq>ʤt'0d>xDiFS2˟wgNLķqVR+hq:-67>j~=~GAPg8JQD?!J-O&،sV1/]J#5Mi75p{PC޸;zv00gA~w9>n6}J)(u5꜋O]2x'xm |fuX@_i,wwY__|UUϋV`. 81I'IwaR=Zwv|`< 35dça+t4 WÎ6p꜆:gqxw1 +|$3>:=D5M#kүT JQNGo_t)^UQzObYhH>$XS$I~#p(VΩ8AoAEtYh4ڌ,z1٨#PMвZգ0RR/X^?9.mGo?^ļ0wqKiD'Xrƾ w.ӏ"g:Ei( iDB)3)վs\OozmLDf,7+Jᓲret¨)B4/iΧcht2޳Rw*_@ΥuB)HALƲtDJTF TTKjb+^5 +IF7iILi^3k+w)q;FtRG侺ߟV;%g۸\@s1' 3:GаLRu)Ҥw=Ft)T~q1hL'$tt SbyO ɘĽ;W+E{Dzhp5Mդ:i :tj2 +];)ڦ zEA&ScEBx_JVi+/0DPlbJ9ҋK2FxH eJG {^/fSMQ :S#mPY=ޥ1qI j qϏSL)7 Y]K[v?޵kϾ?O덜Z$9#2u:BW_d4tTKU`dmV3ZUլQ!sF׉ˆ4^[)+8L9T-j'ZiszMlA<V.S-bi (,ZaAtbD X2-$t: + @|^iKUf[mK+fnZV7rN*e 4P`G붼Oݯ_%scmlGz_R poR<&·}-8 +#)dH{@5:.{cJiȗK3N(JM\#bJAttJA-֫ohOmM9P:At@T$cFjjU|U ;TѰhjlzS1@mŽĠ:` tH- VJi#h +TZJ)Mb0`8.4~ALIbr{U@P*sKզ߇1oK݂ GVJAVg krf%cVÐr lP+*7-߯И"(A95qQ{gT[~Jp~;b?Iט5fܮܬ{O*C:[VÛ."K117RXçNzoع]a9tS5ga|:tO}T-BkM4Tm]oj[ږͰim 5la#jY馤6#;@URޭQJKH,ŧK|BNY”ʩnLJaTS\B<+%ՎȀ<,o&)% -RF'eVSZ0@KT+-5_'mcwIK{|(j A1C ZEz1?29X3g"Y,k8I3MRw'ђi-I~%vUԄ4^S:itGCf &`Cw?zL +8SJ^)<Ӕ ϻCo}fM)uU:YPg}?v ӑ09 3=:GP~)_Ρ?G7Ϙ;ʗ_)ZJҊ8UJI$") f#jV>݊Ψ>0t8U:ij{asV2*i,Ө SP[E_=Y)M WjSb); Zij +(Ul@H/ չ;giC a*CJE Ɵ|K'-ii>Z.IکÉ`3e -LYJ:`=%U3JdTt\S$)3T1  iJɣ5t ,+aޓY54F)JK8gkJfE"J 6rPSmJtϞ_|Scϳ}lG)u(uCG'\__ ZiIbA=,.ؔR}?q`iVbd)%#s%Nы4&ok8EaFhPrl"xLVeaSӈSk:%("W$pa+`2[!6#JK.둚X6VeR:CJޣϩ u;XD>+n +| =aB}Q+؄l]X(؂u*\ uB)C:"/3:8#ݔI44q03 %Eaڝ[C;;笞NK~hoS_Di(/?Z5ᴌ 14WiBݖX8FYؽðx|XRR&5v2ҏe:sV1*MPhzEJPUNR) [g`g&%#KZUJm|'?mp +\RS+1=(KJmQdI`3hу}/9>o"+dA$^Jql v5#`I.,Ud*[9!`jV\HR2qC=YreSJ9%hFxBFB2p2 Rq)*RJ? (rٓsV)'񴚞{uۥ3CTi#6íKi$[צױ)%M/i3A^føRq1cQgP :6oӆX5+<| UV'2bh(Ez@>B WF)u8$*]L$ +5h?zi;WM% YHl5h>y <} `| TD56x.2U-KB K*5%PP2Kb-=FWОq$v+(A?֦T])]%))oEPRWt\50qJ`k J1ugsJ۝@QI߽zy E}9ߤI}j?6iLBTz9v^S{m.i=rk]_O W-~E +p>(MQ14EQp748qbI( I +gܹCIgT=|#2v ̗W63۶~f{`а <P>46q)}&0)_Ngǂv6 }}mPٰ ync!HG 6s&&aYKۖa ^v e+@%hV6 o-ڔ m&6cY)5\pc@Qhҧ&y%&ۼ\l\^o̯<6z4ױ9h, + ,hK+N3JBVM#ǝIkR +"8OWsȚDMtjf_nvbW/K]J y-c.ef͹;;.ǜZj7et/n(e+RLwtҷ?ks 690س  + +U,$бNX4l`7X)$$kѮnv y=#6 +k u, C- _50 *y"ʼn@GA:!Vs&L&0xe#ZGR2:p n^˨͖L'= +o#_C:P)tr(z#gig )o;(}PJUsfy#;rK;.*2]T^.dI)T\a&;(:}|07^ׯ }^#ۈ Ulq8.}+b%TZTYSğ7// ~rG>4&Mg LM-`Y| L7ފ+MqfEcL[Ǯ_{ͩ(-dʹI{%yUrN`5`&b* ) S)P +L@V_ueݪ#v +5 (B٘VCA=H!N>=.if*%EX9q# S`0D5O#O2.}ܖt R0&1J{ZHPP DZ>7{,رdu! q+mX#2 7/}GS)+3@iDf; |)3j%X!g%m&rv٨ߋONSǏƑFlcf[/ŬePa +c (4X^ VX?&zƨ'ndi)/*Y:WEMyoO6T.UO#J{.#=w4yrPUp _,5Ҍh{^\ig~fKJt4ҵkLثﱏ?m: +䟟;T:Go _o&jFNY"YKG6c[(qmu$~0fշk/G[ +)]i$0TίB*aS)Sַ~!?JSYqX[6E&ɒR[Ȍ*QVTP1 P&AHCMa +5L'I՝RH@t +S'XƩDK1~pHO3:vx[Ҧ }W6k c(.Z +Š,u}C>HuvGFn)HiY & Kl($ׁ JoxPP2az*~JѠ?ވOT'5y`L#)#F +a_0:cX0@ci( V돏2Y)m^*肋N-Ok^sjvɚ׶A Jv;sS"W|9`pyC[e,AA_|f$xߎ=cw.*o*Բ=-o%HH  eLf6IqVZ=LN~Ob{dOc;N>>7HW? ėO@U0}=?=ܦ3Oj"Sr3Y\w@Ofە=}k6\Qj GLݶHq 2:nYQ9dy ^ 51PV1:OWӁMkb` _r2\o5|݃65&z:AoҵUy1ݵ(GVs+njT #!hj\(b^L$1UDR/KcBC -D&u^w--Q2{p^`5Pz`E;{L,:&!~̳ӎGAc%+x/+p lxX`u't +{JjdMi+.27L7oAa2a*ѐ;^lhQGmԳT aFSIiڡaxF44՞I MS1hF~E +OQ*FzW#I|5N?R#$`1ˍE9Q1蒾B"cQ .,[H»5-rx $h OiC^rn u !ˇ1kG/!x#ptՁ,#VZDqaP걦ƪHR21 gmmQ UI1I>!"q\ks_FRMhRbqS1Ƕ˫xD`eȑX <^| +wՇ*2b0B> Xj1VSIΪT”Մjف%<߱.yG;vm@Z-ݧ:z7@(H +:Ub{te;-\  wjP]S26S@o5_Z.*)5[J=sG ԯ~IS +ɪS'i trcôxyT>P||,jPtB]rJ׎œ^?<=43o[kM}-jGZUyl],cM-_B ÄR$4=߳sJF(m5o=?҅c!I:Fbhdt05uhѽm5%rM:TCk +qJ(TEгBK*PdC mctP +:Gp,=PlC2Z`#T5Z=9؜RYH~eMTC# X@S<H5(„2Y*'u7Jzj)/b.=̽BMvlbR"].2Q:q섥]Xfd롡 4݌)EeRV."KOm+SH-3մ Ⱦaʱ,L2$"^ql* \Je)mxKc$=Jad4$xT3M;r%`e0BQN@>#P@AtZ( M%t%uy:VZ9nA +v ۇO7;Mm|)w:w`[\4v&tfP;p pp|KhL^%i_AϭfωKsj:L9:~ϩ’6Ru6lF#?# +X@ 8JUѴ_6 ?j +N?.fLqN(-SaҘ +wVm/xHJm(m{ŇHtJȳtmleB:Uc2T7a-33c]3tRIMbPjhr}>fzlq`H#۶u\WKܜEXm肢뺡XÀ0`{C!LZQdY"%I1JMR׶n;s{CH>LuYMCiߒa 挦Z ՉFd"攋ݬx72w1:{OM/:X֗て co P./z'k缅hRDθrZ)) _2h8̀fB q:P!#rpr_Z +S1MRR-QO̽mod!L_Pi#[0UچE4Fp@EaB4B!sRP*x!:Q7t4s4z6Ee{oyx%\I^, 3XcC^($RTD6u%9; +<` !"6 } Ȉm)mfW7~Jz^)ŏ%Rf}Y~:WFjbNs\[0ZiI Z^@(]_e%r/~`D,26>J!gGWQNo|ʣlH`s?6ғ1;%Gcr )v@QTj0,\)L0ZP$ՕDGwRZ@S1,TD |N 8܎OEٔFïZٜ%`k%eD\ʱMl؍_Ţtډl$vVQ;Oo갾IKopĚ_[Q}:ռSM% M'G3fo#9"z?Ep~:I wcf<a6#W D1 H*O}9MPzd'/MNJCDPGt>DjbzX/d>]6>3yyVԖ7  Z-*METXS,UDh*(9f~\n8P( +o|[-ðaMJdvt%2"td#6RUɮ:+;bH7En(|2L{c#wQdw;,:LB7)@g0Ҵ7$Np&\YDm0*\hjd4ԥx/\pϞup yw{Nj{zq/AzZ! F /xNDM-IkZE[To: _|Њ& 0C$+ &-'2":6yPe1 ^:@{?#J.T'g0ܶq"8غ$BRF()CBxWY,izue٧q>` +}A8@= +ECO3NmefY k6EsR͇su)}cI4-sgrzSƛK֛FKY +r4Ģ?D)xs =G[-a`eLkv IwAYSZ"qF\݁щ1<U_61!ɸr<'Vx5cEY2i<2RoTƑ^5[G,{CcVN35`)˟VwsMD~drY%;b7-{Xz`]6}K1#\~iՔ$7gǩT(Sv<^v8>H}Vpk+5ca5L/n?}u}ׄL\ͧtLә)byA.7٧(m*WҦz_i6ngV77FO*׭˦oȁYGx Cduj9Y骂]SRG@:*ڈpSlP6^)oGjm]7=J98w*+cC {OVRwsglM (] R!W##:DL(Ƀ1r(l/i8\Ǐ +^ڔw)vf^ =뀯j:\+OT =r8:P0+ps+abc<ӌ Qd|HT|1c_ +Нg#˂ RP*pJRX"pZPȅ:MHQIT59a,KMᑾgH%TZj D'P}IHI4%&+8yzX;"Ю,;4iJ! \@V x>-/ނecI{.$\GP#‰C0+Μl"Iߨq+MS*V*|\;T7|#vL8͚rw:3Rɬʂ|]շH7]K8,Ww 'xŔ޾}#ޟˤ2 oӯ$~ Uo֙oAdc<*B _zYLфF>Yʢ|3_(13չڿײ6ݫ=`0uCggxSLT6ɔ pϬij%Y"ƲlEr=Xs|SLUnlKىu5cH]҅.Y,Z/?S7uS*2 *`!b@mMuJy U  ܔt5TC Qői 084 =` rӾ"ayҚҝbn6X奰gRP̙t*UW=y vA $iQr/pxpU~ڧ)'O@U .]cAJOB|fX&Dc9g}#@ (` ٺQUm]c\jIɧeO!"CňU5ɉ{ha9WbçR$LQ0E]U#cJb~!٨VKamlQptjI=)Ryw +YS!4xªs::5Cfz^S2@x8}t3+p +:m~;-Ϣ Gٝ"`sع>޽aJ*uRTJDj{@S~~(2/Uw>/&l/@/!Rb.Wf1ͼIe_Onu-[GsW B`ȹ$ / Mvu˲u9.mZvݔ㤅&h;%k?]]//?浾B((ֵіs8~^9K)X:,eH%-;ߴjm~muܡ< o7׾vZ"٘[xQynd萉qW0$a7R-U_R +u Bt܈ARQ%(.HA='g6=갃cއPA#XQLIL$͆,z^b(k#,' Je(4,JP!!nƱIw%:lRʍ %b+(FkGLW9Km3 + UB[g|Sz* \L9vM+7^kw}ŸCAHRtHk]V-K;ǻ%D's>-$qaw0M$Lr&T*AV>Y?dWm(,{\T@) (}\~}o/׺RH'B7ז׺O+6b{ްv [zS KW^]כÖm;9FM9q,UzT(IV%M-:v,b끌aY8o?%yA%b1KeRbuL#f@ZБlm.-Yv\zv3SUHoB)#PXf*3gFm\+}#@'KL9!G8d=w0J 3 :Ru3}LmKd~:u.7mnk+|}Q}1+7+aL9qP|JGjEҹ<:WRsqLPE!ۻJP _n<+~pkMwwj?*2Y'G)}W${kZ߹nk܍#*]0A,k0yhˋ-tkn6&=ltN[BTt7tw<$)š}$SΙ6sglJ"cZrI3TU [<ڊ/eƀ1/ @)G mJ:΁!MٲXn6{I&SJ!Lz)WbbeSL&Q5Wf J Yu=̤tf`CY +Y|PS°7TջmV ƽ{d RVE䊍ܤ*'g:d𫟇h%s$"zV3Sda,Zh !a`]v7^[)D+*^RKi+R$URPeZ +3)?QڮC&y D{ KX%uf4a N\~Nw1#߶XL))]-lNo/ J QH@iqܶR0̎[pME)M~rRaHZUkb`H]]?_ܹpm9pSJ;U\Sg:^I(%~>z8;`5$aCITo_A*Q0A +d.~+aFi3-\Wb-f\kk2g]ˢJg_+E}%V JNg^^)9q(3\H=QFèp< RHRr'0-dOd4<}.D?RtJwU0ȝy9r2_G|-6iRMDZa=:Ƣސ0zwn8<^ֽ/'U +\-=۩պ34Jj )ؘ8*ɚ Z5M[)+,-T6 eJ)[vN)TiJ=Y{"2tR}5)ӍV(j:T<*H$R^R7-|RE>T`Pp\R)F*'x1$ +Ɓ,$n&H/:L~dp rR)y{2 b۞ajҴe<# RDO(8:@UH +!st}rjKKUڧ}JJa 8Sp$F(~$c}&Qkcu> +U bOR@)br՝V"PbF,PPO2*f\ V^+טT^-,ܒٺmQ U~Li֐j|Ӑ2i{L)J}J3m,3Sˋ)m]:uR:p SyQRRn%14LPXHu% +hrG p|7Ewe[yY(4)c`}s+pRAuWlt{.Joc`PLeǓ*=#SU7 --㍆g]Hi z]6ՄoY5T8RuSooN<~Gyry(P%RJ!jPZ0Iy +;ll8ڮHl ]Jg Ӽdr!ԤWPVbYa}9SgP +) +嵂>7U9Vph8q '\P( $S*" +W?O)T~_۝ kzdJSO> |~u;E|e4$g|Gd( E`F (b@)*0}ijk`gzՇ$izu#zrH-.en:>$+0K~uM5ԌXOjQ/+\OJ[[-'"J7*YTl3JQrBU&U(U p+HlPj[YU¡tJ҄ƄR:q\GߙF[bx޻!E˱ tQU(L0I$l q݋| )W +e9F4o%F^^@<-7 +,G7znq2y;Kp(؃iP}jT8Lq>"U둧Io"(^^JdwUŧJQ(TXq2Bq`R$I5 +Rh 2 +DGT|8Sѿ::_2EDw}cV޼PؔgȠ->NLS.%gKՒQSeWYPU{S~J+)*M M]$Uz+nI.of҄RCǔ@|H{M&i t%PW):E&WO)RPRzJyvBl14M9Xtxt(HGdVDe'&JO&)9Qp8h +}B`@cSjoI㍦ >)=h9锾iO>%@) I +{JC #dǔAXxS8g ˒eѸWյZWKƩwh" VN|j1E*s*!|/Mt\u.m5 V),WQVnHhbKSHNTUJPW))[FfB);zR$-$Q \SZ{Qp ;T| (G?w8?uM_ ot#;_ /R +?^*(P w6;؏Fc/ +=L&>?muθx~zg~._XhElz2D wc5'`G8үfs[:Mn{$sө>yꑦ?1^2/g:^M%Cec7E% QeGĘB6 rw';LϷʭfL TjRK's$ M0GŲt\'p&=1{NVw0D*JR%eUWʊbFQڌB΅o*L̘)$@#ѮӀfU$7Ol"alc*XD^VlIK${\Ċ"Wteځ{c= +pTYx׉GiN:$ + p[io-ٖ!h0X~WrpN%9%:u":5&vnՔW`24kw &sBɎrc຦@8˶?H#f'?h;t (mf(kyٞЃ4X8O,[cpt<P:1I{F)DWuu%oZ:j"T"ɞ$tW7<{V?G3İiNMcFJ#v7;egB1HU2:`銃qΓHU"$EBbKPzuΆ(jfxᓝBXF[xz<>>svkZ 1.7C#qj$6ecSNf't%Bf{0G;K|SBדҙg05_LW*&.łX'K _6~kWJ՜R;,C/}Τb$ԓ=5eגܢV_MĵXTBU2apUH՗K%i* (`5o&H( z TJCVdoN'ˉsJ.Pʃ;+fQAdy&/u0(lbɤӣ#RA KN_tJ|X@sMt=Z6)+ Й xɭZިiRMsFMז^ZŦdm$m\ݒnuՂY)mX(1T4 +x>U"Tj뼴a.'6rv$mR,L p<& U2\ 2Fx΁@w6ǷL˕jj[c$Ɵ|<@I;EkƆ]YZ9_Rn{Mk#%bP)$AV䣏脐`Ώp*ۦfXz<\. Q$Q* Ɗ Cםӧ3v6d#ImEXnTiejyThMv͍t)iNI@LxusеTD4L'uJ) 5SpXR:.\1㦎nW}!ѝ Abw7&FF.[[/3h{)&;㾯38qb娖mdwKD+تoVU%J)I`{<͵haB$&{/ݗ={f =z9`XtH2ےjE't`kgCjz?,wesHG6bqhgiX3 /YɃTW̢rnalh9#Z ^ٻ"wȭT"TEZUzm,brU}e]/kU$YAS!tg -ph:_ؙD?;m@ݦ&D,I$$D(ݛXj]N|~uq|qxZ R}J5Bi_jhEtuɸ^/4{31Ҝy`J!Fv\ϘTܢ9R8X5'J[D?jktZ7P*}U&9SZ%'UWyz]R{e's=qtd_ 3&3UvO!9S,ɤzl<U9yblꨢYON*'c^ҁHoy ;RǏ[a" +^<TZ( !".gjȄĻ/f~쾤:RFM$ ١ )$'̆$9!AMZljzWVш7 qx>3 OXخ(X/MKV,t%N#q IA;) + 9gi^IVQٞ& 7UTѱJYH.(9oqÖ )ͳo X CCBg] $nMW{}c\Z.{։u]+W+>WrU{0OV*h֕+rS_RH)RP8N&{"$FRȧFn "~.pJPC("RX}['D\}N~_dD#h*I"h4yt?p;ZH<;TӗUz@PU?_/(-N;,XX|*ImChCYJSf[euVՀܴm4?6zkZ2cPGwJgnK+eRѿJeb_Ž3w6jsk,{ڪS@ʼ#Ϻ*vD*ǐ`Xu`YP]]qOȥ +2\ +**h7I0}Mu-%aw'=!ōʼ-pv6my/a&JxLYOS=ۣu+x|M$=X 8S!#lUd~6UCHRd0:К!\}E)]E +=ٻ{V Fe:<#Y_ NNu,h-,6 n-a' +Aqt{QcOaj()RXjƑ#G犡oXj*5GϬfm6\ԑ2Hc@6{ n1CXjOhMj A`+0' Uu@ȦmJ\TXjB=Sr<7;hl8 +^ZCFB iC k,ִ6{F>}4MB`X\&!(Z)uXk!Aimm]g-K; $oc/ t͖AY@@ì%F("2e5 d>>GPoc1}L]_sMBr 3÷*NoZٍ5}eɸ.ᛐKEQ4xhl.;%zݷ>oWxJWh署p2ڨ株+.H 04!=\K]K6kՠaR`[ZbUxּ wu:Zhb4IJ/uuG|Ie[,wHE~|Eİr(Q$%D'iERe )Yj7_WF0׾^!]/2(۬cKC #pց!4UR@gC"blfSJ#G1Y 93ZIXbRF"BҏQ%/ +K?i/6](LEX; |G@N۾}Y[l+BvYn]hUUd[EQ/zA4 +*ں|whx޵O AeDi43 ,/j.ܮ8:b89/"DgR:[0ٶ}sW6׍d\HiIPʬ6bcURnӉZj0Nڼ6Lǚ yJzQGwi?DD믵w0:͑_$ӯҧ.ԋ)= II6_>Rz2;Z$#v$kńe/Gyb߻? yS_w'vN5Q]ƚ5]JVkewsկ:[E(8MG4f-[EXur$oVzF;0v b7[9T[i[v9hvW9{9{M*FlE-@a*,Rz0bmQIcQۤQlcSb<2Cukvڞlm[آ#w"s$o\Y]uYٕ85:(X=bewpAs|"%'|&xx3(#$\'vDmĂ-GW4ZɩfѦf^Xr)EV]~5je-ϨyPŤm:#+6Ҝ܆ЄĸUbٲ +h!2PmUj Daɩ8.hI +&=ӰW4T]"Τ:'9ٱE\1UX $醚FbGzPCWđ扣_m#8Iђ|ƒH /Id[e;i(/}.hY$M,Ƿdk--M]`밮nKj|1^"-~8EFZZ5g#4[ok?1(]vQj_J<ΌOR_(ϒ,h7\Ax;GИx>+4ƤWb|\(B29w.% R*LnM+%%)`Y7nyQaMcJdQgmbGټ~fcSo h&jZPe~Bwe_?:IƼ+Z10Zv-ߙX+Yc Q@/dSKb֪H+ Hktl8hEMgjVP>s Bt۪x/TBgpWՏ#T3 ͕ +q'eIϳ z8tF2HJcqp7eeJ鼚4 ;_VH"w-֊"_VJUn)˥&8^]R_|A7ٔ6 C5[U=#zzڢ)٤{H5\s%DP|?r~R33JrN^g<xA@c+6 d4zX3UۂVodDFX=b;q3wmD,2e`r?BHj) |Iݗ>R{@JԽ mNrrƤTPAЀPg}ZcM#CjB+eaBMT+9ARhbQjвd؏O +uTAP\[jղܖ9DCSb9#RFR,Qn5Ԃ"=);d`*9:%eju5kk +*_ +Q^(0zۨVPѹAĚ஺H?YQqVAYHE^bN2(Kg\*68 =((e i;q +.Q(sbʔR$g5\2)P>=1.%O5eR܏ UyUJjl=Pq_SQ`tRc gqt `>,J[4'rR^Z*V.JR[儃u;EO+s@`7"BkAe;jlڢzW^]BQu'&z*1ukTSaZ=Lk;hj%5GȔVؓ8JRllMHkpfY (͹XdkQJ[ȞVVjw|l@ Rm5@xǯg d:pz6?Y> +jSxXZaUIfbOMf-FQ_s# +yEQ_rƻ,2ޅ<*<d:u2>Y +hVbP ^rzc=*r}4)&+-r)-MRv9c}GXMwo\kg Eɼl\3c%3*)MFզR h݈Z;eVA[r@AL։?ZkPge15}J$k _l}ρ[9bTӫ=7(9QA:N+wNDa;KIXϨRcO:HmQfo(e&Ҿ#S ;!/7#h+}.ʥk-j(k,OԖQjnGe8JWU +(TiOs"룬|o>hJ|cQz].&JXH)GZy%Ο68lc 8ƶN[6!i mvN;vvg7M;,gMRp}tv7)]H}^Fu8N_RͣXHy?*Hޔ24~w1WD7o4c Z U`B_=?; >#-I?%gneFKRNYbv^;Jcb3ZB˷\cuS9j'M*uGROPIe$'Q][P_]E{T7TOLK%ސ85C,dۑ;To!(nLlDxmhմd'KQw?ѳ%6!sr>-lGBQԩa +QfȨ2zd&FX,555u45uZ觏VPAP("Q +L#ƪuMNJ=Z%R@ҥ̞ P_!JQN-eҬE3&x]>2@P'2s#BVZJq#54qR$YkPqeGF6b|I8.'a*}ӟU*S';^ !; +TJ[?E%\@-~]Vv¾ |C GeG<}D%\hA0Mˁlo>}0з?kFB&uCtJ e&4>zJp”èq=B={lz6K;Z"ݔzN(ih|1=2C-.R9|'P|B%B%C+jqoe_LO3c,sR;;iuJMS'M5j::@uoU7~AΓ@ +#P`GiKPڙwO( |CS (ɱ^z&W[V ͌HJ/PPFlêψ;Zg5}QƎQ{ieXn,պ^(LMF 41аN)1: ):?vbA3( ~11p@_J>/3+Hp Y1MjqɛRxմ 4 G5+Z0 FI4 Z +XԗSLNWc jorR~Bȏ͈F-M݈PͪTKSJӾtMRT[SB[Mg*šK8K6٧a5) >{R(,+" /'YRHT +.޻Zx~Q +$|Y/ݚ-bKHM5ťQ L  4~ +Nhpb +s0v~?ͱ?p䋜0.&6эsi~NحmWZ%iyT\Կ) +!oM[*]+HU(fY auP. uty\Ig$ʻrm[Uo6G⾕j;ˏƎSlc-Kmv؁c}-NK꘰>,nV:bI|_kgg/Bb>|t McnRCDw,TXSժ8vZ¨EYaRz +7DD@att>pPvJhܠ3D EZeT/F0Ȱ1)F98jaSRWzĩ'OAہ-Vz10)F‘iF-i +wpBAjdBɦD{@#psή~m!?ڿ8(}əqanLX@.InMG䯇F ͭ ;}m]qEI~ʢ$E=-'vCbؿ_ +ˆmXdŲ8zYf˚!Y`s%Q92-ɤ#-8 d>p?rL0C&Jl@iJP +eJp`Y&Rq jw_Kפ[}?\M|uXWoW=+T>qWnkp0沠J>SZ!2F9!AP3=F]L@DXNWfuv,&NEDm7fUX"U#Z5j\!![RF wbY +D16_\U k.5 jz OJJܷ5drG{(X ,OU wJ]$֘Z- F5%RӤI|~?*URpǜ^!MֿܰyjkHi#a_d G̣##K;q.Pz|]98W]"EiZ@ i۔0R|ĸRA] e=Z1o`σRX0(Y(QWJt|rR&" +>(b)5VГf! Bg#ptT 6m9>fb (Ou`0qG >|6ڇ/^?}"XF}jU ^'SkItLl,53 O+2tsdiuH4@ sTjnHH]84|jR%ѧTz*U9Z\2KY6@+U +JS*j +ׅ]NwoԔ*4RN~ + +]7G@GLan!gc1Gm'vR樓GVJY(rR)7or +NI;j=JǀQ,C@§̈́v?# K wT3)`: +Wf=>wCDHM; z]:WjGBBXuHzJ鉦g蘦HP12V:5#aԡṱPX`D[z?Is01sImDs& $(?q./p]qZuCS,|lJM(ݥrUZL$9gUFQ,ރQЧ;1u<"R5eE,gvwfNǝv/H)N_5{6"i$z;u(}jR"PFvv7pLvGJٹC}>ߴ-K::[XT:ٻ i­^{n/Xp)Z 1`/| gYhJ4E<z' 7BpZɄ7o/~sr޵5i㒺p`uκY]͊>:O3>SWͬ)5VqrcƦfa%ɧ|Fͧ|_I}аJk*+OSSzsFL}U_1e >Bu O{S~s=2Ni +H,i{P\z,AN*y^Ċ$rMuP1<Ԫ Ba]޿,އxVKˠ`Vpgx;p.kR9nJKI.ѿ}qkya AJXG ~vo[| mY8f8/|KhA;8̔ f„PiX~1K;ljEMP8 +eyv+8 ]k_뭷m8d,Qn`E"rVۍv^=yplJ)q匶rV?:`w5@3,G(z@顦>Ԡ-z|bJ2R%'jyԼLo3rDP}JSquyK;(]C. N#hFTSAV۪pKɉm񷌶Sj"BF(P*Nn +cgڵdyA4fF⩴Q̒hQqzi(b~%M_(m Pj'0<X^Nu۳<=,bVBz$L&è*WG ++>.ҿ2v.ln?}7٪κk_,;s砦A)t.0r8MAY]HS5^ɫȣ7TBf-%c ^/}J@94ԀA <~ԧ +( u(rO=hTTo[XSJŽL"* SЭlj63,ΖMOJD\Yre^QBZE0=ɡߦ*:n*wvP:UӏдDƣ4 :TS-وQg9xEakY˗>2>J>R>JQP(i:s:0$(DO KZ<42AuX/p+<qveY[YVWKk}Vt(*UC// j4^0*y&f6W6$rϧK9b|`VE$Abiuh$,!41ɿtNiP*5UiR-JMOm6iu(K\W f&!WX%3e. <)R(̢Q*m:05#zG*UI#C լ\LG{4Szj9g{ղPڲ&A)mZF}ζ=G#c^SSK9Ĉ"e}c]=_+CK^R)OnEs-^<^9.hI=JW%SRr^[-@_b\6өpS%,G)j׋^$E{`ThCkrZp*p7;Z0}kLJ HW@Sq[uqt&4KmbҨԖ +/ȦF26SI4]̒i˦%@-TYW*O5{?8o:޻m66v9j˲7i9"PX}P=J;mFS7=e#X~4<<&Kl>%4^ |K{{t.tzbt;VݎO:׻+[g,+d/|x&S/SGJkWNTKG!)jk%}m!`J&ls7k*5`\EaD*D0S pNJ>RľTr(5)S lRMVR5MeuҮz+5e=M'ipPռF\+ Z*VX0byI.yRHQNEB- UtITa/=Ӊv}{y¾cKS/NLmxmĔm;&:.73 IWWן󻻼e͵ۑJH0@Pjhץ:Tz'uBHO8{OiNvQ;:ظvmnKдL8>ut +^! @-qYP:X|yEγGש~.͓H`rTz,.i:ܩ^]8MЮ\RE˹T9+vA( +*΄z@$JK}J4Pyx4+ȩk> KW TM*Īږ*ҕN J$i{bp*RՌqQjjbLSryIQ %YzR67}C0&)Q]^nvcc޼`_;O? g} G1_)Gƣ$LX/G.YЋ$;1;>>h-La5Ƒ\q+^ZV(K:M;iY=J=YcMlj7왆j8ezmۼN-VlΖ%&iuCڋ]bw.{2 d T[nIK us['KeQ4,x@|IJ4il6Gbof_~\ꀡ zo=W?5kUZPjUZ\5U{/ԘqaJs~?a|Ma+IK^&&lrY_i͌ +^P,(wDy +7#,:ɀ+BI̜`<#,OKǴt/#/ $MqsףB'1&zbX={J] 3jo!ޡZ:*x}Rf=$nPDp;)Ǟ7|&3OC)M>' +Uš2.:$Pux!]_j|D^-vNЛoIF P +q5T +Jj1 )VJ-]fr+uٕ_y'nwnkAo}o݀J`Ѩˏ_;jjԓ{*Q2uxmֱfe,Dl\KyM6+mPT, IiF3/.HcD+)SLydjSSP MrZDieMpQ:it6ivJ#%Պe M-JOh&3w<`XM_=o>+3ULdGJ") +sƅzE~OTV<5L S҈R `i.FhDz =Q\$\6q곷oCOFl{{=1o(Q[jo(utGapԘ4ZrMG=#&65L0˅V,=m6[> +VҌtw^P4;YiQ + uOiae_)9c6FZXOK !k1+q+H\:G V#6>{A5U0G{P: K)5}[ْܑC},@= d}C:rPe4J)M$Vx"&4jj&n) JWYxZ,?vg,'(?Ƽ^ZvGuV&FG!V?)4)sOZV*Nu>r~h6cQ &'جVA8\뱴QGZkֿS;ϫJ ʝjKs<ֳ2$͡ɕ4ڧ!(dAeMJ`-dU*si5!2Q* f-Σ$nSyB~ZASJjGX31.ēaf>%j;G~ZaO.ݠ&GDvWv / $4V㿖-Cd8*@c$4ѧŃZRhPZB80 +%fJO#< +NRC=~%@Q0l{{} hI4ĈZ$jTJJ Jk@'`l֧B}bK.n˗z +3Gsry-6QAi쇛ĮeLJogdJ Jfd䨁蜀tSJ(M2#@e`ҕM}I!7wG% 9TR܌$՘hP ۉ;㮒j#jfB|ޞ23DU=mt8:PJmm,IzMQ7/Lh͠& ҹk:MiIZK2QLtJiK3@r^4wrypYY b|])`!!uv Pjzh:ZX:FVS׿"ƽ ;am 1zKXT;gBC·n.(EJJZ\IʫqOָf"ԃ8V9>j)CS>V J&SȜAצŵpȭ%a5W{RzMA4]^-P5( ډpFOu4`kNyT>V: !ޞ8K86$`\{N_vNi?ׇ6I- &IKNnsHsuCf0qU =WW*tKUMRrdpfäƗ (+JBiB.Eh8Ph:"36bZqxm3S-;ނ]wպe$h0;'=ۯ]j_|1vP?/BĹvWSCȼML ?3I5>bP9ͫ%JS2P*߻'ŵD*HLR. F#Z,,gW5VDQM"QxB+eX5| l ̅;[ NJgA;Ɨl dKiwqem9BsP:M554Ԭɶ;)M## ~mM24<њ*Wm=2.0G߂RIҔ-K{ 1|`\^aŪH7•7R,V]թrΎ󼝐8h*[!B%|DQjIXCO6/آԘn [}Upfv0DfwR.׶@oAҞ>zvspzn^F٩ӴLr;cKZ^OOR_zvK+t*rź}Qo%ʼnYJIJ/ΡܜBT[ى1X|BIVهTWȃe7|+$g_%;-CFE),iQ b.9MQ+"$(vJj ILREdrZlT2 Ա bi 6Ea0XgM7pJݒ6΁xM0G$A5/ʈV꾐H,Fx=Є +h 5U|$T0Kbdt#,۪㞳%UCMnM{I*$BhH,H7H/F §ff&Q 9ŌשB^f|̄ϳО(?(V_Fz(yItwwQ sE7:H"Z8 +s(oIaIŨDJ,!}(Og8ky3C 1)>{58$Ur0l.imDՂKS-{cy)%A,aU 5 .B$vFն}vG-3"4A#jX-1!=}wQ̓yR!q9рMhJjRUkX +_UB̑7 G*2nTTfT)|NpKb!ʖ!C T w1 'י*ZOL6ZԑmR +O>~G35(s΃vZi_%%~p{tS&Mô4EìhnosRzJoߺ>Y J钚Nʫ42sJ6. )l)Wbi e_eAJH'{)u5!€@Es9%7&-rŐv*c9D>Uf pč *ن*d,JJpC牗15 Mԭn% 'X;n"tj_N!CCua cRC Sj~M1 *nxK@:t_T؈ X*mo[ŔPs9l dkvMG!1 _j|m{Cjsz,yX;O99'FpggY5L2t٢ˡ1bJ\ IO섪(PB D5 J9C(CYiH}5)v7ٯ6;K.%z>ˇDJ"-;Ah(r{i=c !rK!GdQ_DQlb5=-"%fHr`[^0]$3yTj:i"lFsti}|_mc=|:` +A1SR6ͩ4S5B:/c\PNƄlR)$i/d ;;@%'pju'h)?g>qQ,`o(Bi^K.RFfB] `$(ǡ^7;EK~4Ni3OmNp,z]fcyh)=ZqlZ2nIA*8JH +1u#^ (8!H`b.gKJڨ:wPz Isͣˍ0JUMǪ J%A6jP + +I :^HSղ]A=vɩK+-3zEs]KRŅ^qt.r#$Բ6O:;;H. Z$"5).¢7xռDRoOR 攁hJ)[P>}HaNP?9=oq'JiOO>a>v2˼?UJ}xJ!tv {_w) nn_}T8gs<@$ͣmvjz2lms—8uI)􈞉k7QJAGMq4Ba%%Cv`.fp!&cޟ ,RzΣH 8nYZh +BnuiI?RC,.brc0I>浳oBLQn#?y 4Mìq.\"NJiH0 -Q=+ٱPvLȏp<:,TW7bm@~{C`[EnǞ9aJb{O/{_R +!ڇ`Wݧm6;s;Ʀn ? >'s=۩ҚNW7b&/+ֵ1q{NcpӔٸ>3`!&͈8TPJ) ap=šZ&7nj)}fDSh~}M7n㩤~;NҝB,EuȣKD*r)uu ¯OM e"A4n d=$r(5qs +S%S(jr"sN+glK8Ek~*(yfBLn,@~Xd|ZCmm֏ٗ!cw-LO;P)<;Pc5A-馂 Ge7*OitX^_!n\όwlǼyGۘ75ZaqZ^T'\bL-&Ÿ:7nNiRGS<>`k:Z2O0H@;Oi_PAzR[vWG* 񴬲 h!O+Zs)FjEۉX +/ /z{ݝ{ŤER/ϨsR:&d"|&*dbcjsJX)R@0j\R(HvɑˈD[[<dTjV؎W|\\Kʩ$JETĵL  TcL]IUSD/Ib[B_Y3Wh*n +6"%hTf8FL'dEM!$Ц/1(2cAac tjsi|b.p^l H+QA=ҴGwdz0Y(*F6+QlMa*p6W6=ү2WS9XRBcDVEޣI|ĂWjU ըX(01f# JqD>hy~rjDFcִM!7QWqt]8ntqTJ!:z)]m=S5=oS.JñqǟJORx@FG|wZKX%͋3外Q2Q/J :bD-)T*5SjLCcGeܒq<&7aTwO?,$+?A_+IZÔ&P*!",V@L1̕\TڜO!ٿ*|AG6Da "X5t"q5[AEExNEU2xU<8X?^yc > + 𓮧$@`viw7)LA%m~ٳgl;KN:t>VVO8;:z>ب +:T)CLp0DE\")*sKC*G]D7S*H|9=pbB,VRQO߲"V枷YOB)#Zq_@W!RKJa^, i~3Dnu8-gԴ:S Д'?gʡP㹅2!#6%м&ٝa%TXpRi>"e|P| PFf̾ƎoIݡ:Nf;Pn<u25AC$1ۛ C {'ҽv/?!oKmXJ' Yֹ;gԋzrB[jŠVQnޒ>-h +!ƋaMR+\5 W4\bŠQPMNE u66u5sB򴑄bqG),*\.TB/o u+4v[ +*HC'RTG%M% <Wg#JdDN¸(*㫲\RUxYC^/ 蕊($-l6RHbDoPYJ)}>gj6d9kKYGo:tJ$ƅtQ ޗjH7_?+Y񑻙.qQ(AP&/b$2)"7l/m - +[n 뙢[yO{̯ŴY#o`ԳzCm6;Ow }Io{𒴵Ν'^{xMN.t^h}6lsb R{ݸ=yC!҄Sӄfz`B2HiYG]I$ y弅!MyB5~pEH/2>x_ M<0y-sR4FW有mɖ2mhUCRK7EX%( )pMb/rI%]Xj%`(}NNJ3ńy)&WTx1jL\bYHB Ɨ,`KHs}TVtUP%1d6P#&Z2j@A:(Sa@ܣqHM[=)Ѿ:Tב<3pf̌R?|BLO+騔 +騒R!%`IGIslDˍ!"[Iu&.ユom<߷ߧߧvw)߳ .@v<'SSdyЀ+bcg40mi.=@o*Ru80uE;)tɳN3 XqطunU+XbP6u&"*ɐDkMX]f?=@N`9 mQ덇WJ ~6B ^ӥZ,DUKAУ )b +^5V%KX+ȢL% r9$+ ;pbpU()Bق {F<\)!J{aWH] +_xeJTX'$DσzS%b) @J3 2lK' P՟=]M_0< O*")m.u>Rs?O>f}oQz&Ca&( m?gpB$m57{賥-0'M'.E76}X+9%rP6ɫbU:[6r.19M-L")P˫REc5C(9 A,sD#:LPD_nm[g'EIu<l΅D")9H&"z(]B, #-`VU5DI-:% +APDTPٲ:Z`PH#pƍsYn)M/JIC⊔X+|ܝ +8@f$j\b_LjBf@ϪGuhє!Q<5,yLӷF^Vb%?I/sb,Op[β xF)ʈF:rSI K,q9´)c5rz /nueP}nM]HQC^oo^wX)sw0L݂}pC]wVz,TzdGۡ#Lz#)6 '=\Ӏ7mDe0Gp%bo%Py8veh{νa2,[%h)lW-ҫBQy(jÔtasprbYaBJ|FnAheiEع8 -Pj4 *fRƨZ=zXH ı&64iAVr[`b7F% >QԀĉ X$VM5!EkRTh#[ǝ(=|?KdsyrocgcQ NiSf-UnIuhTsk|ݒfRꌮDIJr T^P QRn g" خc3[L_f4Ja1֦ >"Md+kRΚNDE"m-q<{!n--m[D9|3)rK[ITW_Ssf,K$2D(HpohbKSVջ\n$t72XDOҧ)4)7pJhk \ 8le/k@i(9m|D:D2k“*Ey=OOB-dY Z'd9MrS*j"/Gڬ!|}HДЧj1o?T٦.Y}hJWVtoW~smQOI[O(Ӄ#ч_?q,u(p9}=ݼ -d՚)`W*A? @sT!!kˉvRigsbC }ݳm_evg{ɝ9cF!24rF)R~ Gu4.ྟhE` ܜ7cP UT8hݔkIya) $MrR1&ӑ9EHikҊ" zn(t\f>b:Ϩ5{YoLJ). #%uZ%@ӢH( +h|>@+3}u_SAlB9E.EQpBb~5׭945zM)sc{?tbhd@̮׏\kT+ozmsz ( fKV[[5@@]lFz=~voR|𳧇p;[I/6K;3ŗ58?`4 7cԨpzl}nwv`>H3qbj!+J!&lА$t--_K)%? -B)LJPL!91Ń K:/pêg(oW` g䑄\L +WHYI󅌄 5zxt!+'ղ-O-ŔQS,|Qfrܖ'RM4DWav83@χ/|VC5#] ȍ ;(mmFt%O[^Bƺܤ֙m,Po{c2R`$q( +0 |b>7Yw[{ + l CE) kP5)RȊ.Dcړ0SEy^~Z)Ej-NfvTKȭ&e+G2iT39ANGY!r-^4#&3S:)TIC0"2:S!b +UM/ MAtEB(EYQRqhJt| Ld!~cRL, hŸ4༟O9|V˧Upz S3W;/ > >K9`l=w +#pbabfeRxrĀc"c@R(f>ڪ#z\lrC[nIwʐy9uMTą G6dcy._J3(%:mP[Uj5qR(Ɛxt=M.lo?o~骯k R " PH7j確hHt;h$"\q/y9-̵|-#iu 8XM*=R)!3;g-9dպ4IAѿxP;i*Qi*OuQ +\)XEJP03.\پE^(P,'f6~q<.xqr:=a[󥄈K+q0;ϖbw_'+^[$=4h^y:| +E)͡:1+uv!v'j ŘP Xu/f|Ou2nX8ѱ +GKYpk`b0oK"粳z FD>nҥJXwb>_%Xҗi'a)Ff7f. yq;M^w^@j_{ ~F3,be9l&4,^r+;lt$>A-DVMŘJ?3m=RDJ,S(M:i[2B)>JaTg^#+`4wO ޓ%.ćQ +{V@,Qwm!P*17TUP*R3w"AN류6axH +lEc*:5eWL4t0J`Ovꛣ8W +6i iqhи2h\=gt؉Q +q);Hbi-gs9#ZPjɥ1oLWOVM[^Jq z;\ǩxżŋ`2Իwr_fm\g6۬gr8$EֺNWi/һEz']ޤE6qdYVKd[l+n7pɒN33(r48|磛<;% .$=+} eJY0M^8K닣]'kHFYʀ-*JĠ|VWWRm>m4KW~ngJah͊9칆UR\S"e4H E)l"!Q2Fi}i +UAs0&{אwݎؾ!o><^}>y̴d`6ѕ蕎x)r WX;Q,e㐲B)@S㪒.X[5.ÖQ +a{en?~#t^8KÀ> +w*Ѫ$=& MŭU +: +&&߀vj:uƃNii\.2 e96CڜOSRdtID<@1 =!eD٩0G1LtLwrW ([]}k"u6 EBﮉ~R( ˬAм.@5p4hףݱ.8n?4)SN:ApMBQBQI7LF|qpg`_' +)nЅ =k +BCeCLwZ#=!=]6l+(baX}]-8:PN 6@L^|>'. rQZ)c>}ȻL;Ȅ{X=\-4Ee)Fi]5CڝìVIZ⥰nMh7,+<B>*EU).Mf^e;2IhGegcS-cȠєb@K l2CQqAqT89_VW0M1i:PjuRMJaT0J%F)T|Mly7Jm+e>* (7-iŤt-Ve5tY Yeghse2Dy=`ޱț]T[IijqJ>!M&u~<9c@;1>fBcYqM;El!;1t^T)nnlE.mX]5 WR;;DK Kmza:;LG1It|BPZ`S5/ryvO3m/%^UX_<%bCz :;{Q/5d}t^~[Q>U9:!{ll9+V&RSMcTT3Q4K3:)qV.b;ZA'JxXKpEfH|uK֫HW6@@L맼wUh*v^f/iҼtt Z'*.s+xBm?24b~C;b] q*-\qYu\2=پپ'ЩDf>Oe0|rP&r|Oݓ\c [?@߿ݴCN:J 3 +}WnXeIKmP;6Dc/{E~΀J6q"%Qs{= gq_nmdexsNҲV[$x@H,+!$xDBK4mMvl$\&P*Ti_Ϝ$ͦ@P=xL-9E^&0'xpZEMQ(&uF))(@ qC4U9 68~ &6ke0Zڄ(Y=Us~wEUɷt Ƹ7XY<* +ƘVj~3NkܜLkg,+8#^IFKY%86H1R2ZW[FiwϏMM_/%#1_!+9p (j pZO]e]rvX Q 4m:C P8jln:O60 t{D?}w!L% C_᰾-C>#cGxgcԹv!NbTM*PwQ*2!N!yrvvIADa5u cѧ~ncsn4 Z,[{9 +B/+)`QZws)q6< a@)iiu4-f9-B!#@WҴ Wq*$`C-("an~*d)"LE FLU +Vez7OTUd%802=/1:^2E[e:]uƃJ{pܫ{Y,^D=M*l0ᦴX(Cƀj +9=PY,"qJkQ0bZ4 ~E|FOp=:7᧲_ҶUpjfeCt9͖=\~Nà:?lv?#~$;.7|EN}Dz|/|0Hcs P H5 G4p=uoۚqJOùRąr~a@C1_3Eh4=VcMΎ VKB)iDD4@ iYӲD J`(AY3JG[(Ueg_eDYAΛ4 +5oS*̆9iԂ@FS ^rS/rƠnZPe8g 5YZ/.(C$?*%5P0]Ϩd1KcwY=vmZQo#vv`k:`0J!oq]|u7{}"4ںDzη\\upց8Zk vm2󩘗mX,˗N F䡜nMӴnfeu`&G{ eNm5g' +$ {F)1l ڛuᴮkl|4BJJ8XJdF9MxQkEزOXY}>bnsU'6Vtmq>S[(KRVQ.gU01YyĖTy$⮧&d#q$"Sp5cʸR0TD8JM΀Mu +\80p4̙/ʕbW*nKo-ք@e2H +TdjAU@Y}CC”LJxOJ/]+M(`-$Q;sjRpʚu(hjRii +dS)T-Kђ+0ց-|MఢNp6Nfԝ;?TZYs-$?OrI&Z3P*—!>]A#6b&d_96E%@T菘!Wfs᜕SMIi:! J:u95u1p1R7j64Lpf!YASȩA 3*A0/˴27%NƳ"+"Sp3x8-rKtoIMq5D#>qqu}_mM {VY<0wC ,(b.^[/|ۛFUct=}L6(cY/ҽDZ~Rtǘk.F_פ'& eҁ,v;.GR3gTc,SK/ٜN N)M 0@0(GRʦjsn7y~♧3p,񝵶 )$ehTUv} _gOJ)~_9;L(}DZ6r*-ˊHӴT4oTAeP!o.cJc)PZmGiв4%TD/A)cORpEfV@0s(R޷!xu QZ/hRʩlۦ*xo +^D-؂@GR+8g.{iO 3L>:I>k/0lx{M(F'>(|` iG0SŻ7X=2whx~0[W_:E48r\?**D9**"nqN?vyzmGjt[ ʑVoo&T\;.w_.>yt@H:搩}dV> jp>ß +i +mJ9jP t1ZD)4^(6S)L#ֲB(E/ GqG , SQ*绩 )s ѳ.ʾ}) mAg (} += " T3BҞS) vti *W@GRi= \7⽤xO%QQuتRF*~"r\FŢg1`÷m/nQjjq;;M[JGRFPnW֜qm-ۀKe}lk&qQY9^xWkaW~HsFfs#Hrz 2UáنΦTA jx5%Km\IRO+"!r(ojjxNS +f>m!B~T + +,@PGJA'8 +A*P*_ ~1̯ +UJu >TwAmrMQѷK?$}UvDA!8dvQ.44(HS -et>c0t&:/%O%ueݮiY@4693&F=3(9ro%cR>%+ѣR!$R5Rv|awO;EDoCpdGRlsTvtirQ፹ǻƇCcȐڠ42'xj@* +Qkƈ88iU¦Τ)dSpԊ\1@ثW:+U+F0ubP#iؠiJ/`JQ%.޳&x}ёKohF(+JY-ѺQQ\ua1WZr & LKrIvqp%qo[V4vtJD_!3@VM-dYJ%K% Oy. A/9J zoTw~7 ׻M,KX!ZWCMi;EhSw{}\sI ;|d䅎׆C#!eA)r^Ӵ*%RՐj:*LDiRNI(nce;@Bkfj!UfuQ"ӒH-O,CXHRV%bE4+f>i bW!z2XM@\uްjQiј ~LsGg0p7]*, +}©v>2A.оNf$/Ԍ8&D)eNC»[ >cբNj@%Pa~p/J[xN˪AP,W{Pr7ߐB^Dix^gt(fe^(u+\3I0Bv喙17wr jlɃ;>O&o[;BTAvCeJAE*eGM`:6 S¶bܓeJ]\yA P䬍ncU4EC*QU0- ĒH"PAS@P(샣D˪2'،]J!t[d-N_RV8i3I!ZȴdJYi+[zM@.CQSMi4HAXi%,|xl`Gx()pVo F[7u/Ui!iq\ϩqzsLjRhOMͻX&Xtlg{Ut"Qh eD+̆K7r-Uv +MOvwU[_e^<+ps% ENa(, aiRiUGa[TT-/]LE0uEM]l[YӤ(l%PafyH#BTdMMEJ!%[WRvV2%wsGS8Ğ]*v'KモU7]Nnj8'3YusV*i筦y;A$KUٴ(g`G,qĪhZL+fkM +@:Sv:m2y7uV9RknUAur刢vfQo43.㴟NA6Ҕ4#6uW|?u%$]w=2nI.ٌmC{-`b>zkB1Bvk'۹dOco%N];;Ł RPk$קOC|ML`$} Ptܹs{l!JSPG莒XRZo)jhqV=jٻs֦K|?% X3 .u0hHm!΍cq?1=O|zHЬSRMeJ}J(T]-'T +9 +Niڈ9L);Z P DyY();ыfӲXV9T(!}e˒~YwyRm*/_AvMLȘA^w>"aj I^v*(h 6m,NuKAbzG]ئ> w~wԴmPmcuy\RԵn"2:qR)$Ua)Z_v67-h?jtņԝVbU(#*?_A5-+`eTy|?eFs?ic>w8)f>PaR0N3cAŐ4.f~nOXB_fmg.EDI$w\"./Q]7MQ0H^CR$A'umGRdI:,M1&EIڒxn!WkYn-L#>,fG 9o~4;C=j>;ײ汮UuUUf'gyy+ย9= u3C+R |0gۦ;/dl..Yd[ +[T23,|pA6)::rU l)`P@bjOAT;?kJڀ=ÈC='NT(OJ6ÝFЙ3W4JV_jMFəAJZ=i*Q50 +],*E`(QM%/?۾AGs?t;";͉'7 HិGg3?~-83+MhߍD<MJSASJS|$@@iJP_pHӽ-))8%(dvNO/ ] +K~ng +}z0J/Yo{J +S1a(;$;'wI]>./%\sQa.ħC g\>z?i(񨏦1G0" +''2mMʫR6l՟+ֺ6/Fmgtu5: G߰ +-0fduʹaqGTR*PЎ( SSJ"\&\C)F5 @SHXO\ZEkߝYs&d[6.`T]<  pA -Ȍg.V3dψ|ίӕ;RTBܹ72jTrɸ01s!ue]O-u?{VwI0,W#~zm2mM[&#U(7)yS뷷| +wASɸ1l(t6QSR@5QWi QwMnh-(GlN&ř 8e;Ff=UƒgGT'v|ƒ>ZׇU65g|uzy!&IlL cdȑ +9B+våy5暗RQ0YM$U3/9YȨ4TkVzձiֹ^lQ"Ȅ \|*LIBJYḪälV(f҄g*M$374s'UWœS5PsT[Wzgz1a{Е+K/_O@%J$_ay$TCRT߯UJǬc#gCh8w_VQS@K90MDv|%h J  @ UEn1ЅW>49,zրO=M(iM:1JeT { -{cF^ɩPH5}zy"F~У'lUoc׮a5 D:G1P ++2WS](EXgO: 㶉cw>DUhqa:4j  ('/ȎL˄Lm7DIc>z$~!g.Š-ktLII +AlMׂۊ0U_g HZu&\X1xT+=,AI~"/| GQ +G{_h<wn;ΏO'DD{JSNU574zZ!\5b7j( iMKtSWZ SծIڕ8ItmXp֮k@!$l3vl7Nc'MG\&86ճ^䁞9se{J ԪFd]!*P7f=M:<61^zk(z*ͭӏe˲Rv)Ka!7 ge!zãtBO";bo!JP +(:`;U?YM[_Ζ˲>kySދڣcg[)rW<\tI$RCiQA)":PʴSb-nܭ CƝiUxi[gxx1b>*e~|-R u3`oXlllKtGkld):pŧSD +K|`rzpLmhرߏ(, 9V)Pþot~lF~L_^\G~uoJ+@*(R+.G)8 + rƦ^(杖[b"8458 +n5OY[&0kaQqQc'LN[4_ >68!/K!*V_U +d(BpPBrvt3j?~QuVR".϶MiNj_4#k ;58ʏSn݊{]~D7]ʭQMuf-K㔥9Ϊ^2#B413p+##6'xwS 9;/]SdJ~(=hY /pE7"(Ek֎"XU,̄ RqlQ +bW,Jkڣ5Tt:'zMOƻ~ܷEb TQ~w~i%9mtgJ|>]Gl).4ES6;_>o^T]s%8U8H]8i>7h;7CvMc'8k /52Ȓ .C@DAr/tRLzsTnfb +[* xC(8`m\IR泙bvIVzmOygVeN"+ ol]Way$IK‹fg-`w-SժK_ mjWdDeh` On+^ikۄMgɨ{]wXHK-ȚrزT;Tp~|nQZ^e*I1IvRTOaRU7J~=7uqwm̭e|#.0-yI<9H^<-@mv22CiiIl l0Fҹ)c6Flwv{V{ٯΥi.DZkf !F? 4 +}]´a[;xt^`@ +{ߓ(ۂd917y~hbnbr/_] |SOî憻;Mnw]OXJ2x55p3IU5jI 28Pؔ *tel[h VPTg.}8ȯ! A QC B0}Mr 1Lt:}čA\ = %7BY o׋mQ͍:?sg|7 g5h x]{ڏ푝 +|2a,7~<-tB 5ք]COYne|בKA؎u-n9pMˋɐ~_q45V|-~>2ꑳ<:7lt.=DDdbXюLNvO uΌtw^JW-;vK?=r?&$V<8~oX)R@`'m 0D[*,s>D*-x(*87xG;k_ʥUUhgV?SWO?8;13=3;;?37{HCZ>I&f&ϽKvN LowG&'NFTʥYqn{LejJ| +4`>"JQ甹&*# L=Qԝ{+=3فK/ o;{g9|Vrlq̉I4/PG*iAB-ʎu +('mK'p4 ׍1{WfcmgOtd'ZNl95>{١HNv2y@gZyi_m1KV߯|s3AYQȟXS(FOPdxn^q]ZU={mHѻeіn^~ȼzt+SooI^66DfK{ tD@4_3PsB (-{>ۥJAc2S(eGQS C^'Ӥ\ʒ hQ4-#JNq8P$\ٔ\ZW/t w,5Q B0B +|{%؛ +U/4}_0OM>bhZk!,ֵK9Fay[.eT (d?aDkbcc*m)ˈTPjYv]ʱ@GUr*I_ /Xv׆Kj_ʥoCMoDpK_642!ˉJqGJT\V8 +J@ih#h1wKj_ʥ[PɈMVZ*eq6x +a%@td)R.U})+% *p0r$PKP(s9cUx:$qN㨐rRKH;(XϘa*m9JRKj_ʥom"Ak[DUHT\Za ^v]āeYjl$'Wqgۢu)sB릙,*ġSX8~ZZ}D*55y0^6ߟ{)Gr(p<S r@oMoA&V3RbB,CC QOX,CßfF(|2}GC]]b2>MW'Nлgэ{Ɉu}ݼ)[>P?q=c k*it$,BQro-!i*w"KEErB Ԑ&͈05f>ޝ]o||yy~_N-[W6Ÿq9t;*CcРٳc֬ '^BYKOiզUPZmNiQyq dO<1 xq~mm!Fy+a@5o gDÆ[9𬳒O==zK~Qvg_}+9K^~973y&>Y& cAռylY5oؐFK/ȟ}6G=y&L~tfHs6Q*qc@6IC쇺vX! `9 |ѢEƤVQZڍ7&T[2!ѺuJF?Y|y +lpCҥٍl*^}uN#g]0"Op`~=;sLxuWQ̫9 4.\uUFU=\~cgS7nB\J:jpJYr<,&,FL1J?Io&*䓼N)t@+V:)m ˫(ƥT2e.XӸ4x'+YN_oa!N'IaNYe㎜ ,I1?bDb X?>JY,J:vRDqFD?d)SgX?xx; rK]OaT$1X"^Gm~7ߊ@NgU'dh߾98+M>C~bEdPסܼN14K:UQRK"O[kT<(T+bD{,j*(맔TN%l\/LA)Nsa(*4V#.LQ|O"}AQuU!:L.Qpi) i<?d_] aa6AtZ/8>y:U `֢Epw،ôi.-."ZH-~R֬5mN^vY}yT q,,d?.kdsP|,ԐwM)U!>|%`fժ|ʑR 6j93==;Iݺ)n flڈf*UbG"rhsHl)N휲e˴Lwg alkVyq-EIgn7n>h"'Ik!l|gM ф\ 4Qe jeEߋ#V66p>ztydL3fT6,w/[-㶌ܤMJCuj2Ҏl]Nd6*B "*>E|4Pn)[QtҔMED|MbU,GeEK)ڴ +JXtm8*% jIWl[4{ܹRV#^HЏ?$}c„X49`-iS&ѳI6$:;-ei28th29Iƍz.XY޼yqlYܤI6<.HN LB.]*'{^e:4"6̺wOhÆ\ rӦ ![7ħx'>EhoD%;8Ktsi)r}FdF*5Y|7kV~H)8]K侬_ct~ܲ{W%ENiJ.rJ,hipժd\mis/$ +B%E]{~hYR;dUVХ/08e:n`Zh0ʝFa$>![57DX WMκ NK0*W:`D&>CU2t]]w +WC|7\K= endstream endobj 34 0 obj <> endobj 37 0 obj <> endobj 40 0 obj <> endobj 43 0 obj <> endobj 46 0 obj <> endobj 30 0 obj /DeviceRGB endobj 47 0 obj <> endobj 48 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 52 0 obj [/Indexed/DeviceRGB 255 53 0 R] endobj 53 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 6 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (robert) () %%Title: (FLARQ.pdf) %%CreationDate: 11/12/14 7:50 PM %%BoundingBox: -89 -180 523 612 %%HiResBoundingBox: -89 -180 523 612 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 434 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 216.5 215.5 216.5 215.5 %AI3_TileBox: -72 -140 504 594 %AI3_DocumentPreview: None %AI5_ArtSize: 432 432 %AI5_RulerUnits: 0 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 6 %AI9_OpenToView: -150 386 2.55 1416 992 18 0 0 6 75 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 777772 %%PageOrigin:0 0 %AI7_GridSettings: 72 16 72 16 1 1 0 0 0 0.5 0.5 0.5 %AI9_Flatten: 1 %AI12_CMSettings: 00.MO %%EndComments endstream endobj 18 0 obj <>stream +HWks۸i(D8vZيJZfg;$@_ >DRA:q/DYRbF)&)Dd8E +.dHӒm}q%͂*[ +K(2g<4,WǮTa>.6CI+%qu.^o|gGHA[$KaȯԘWD " 92+ 3Dc6Xi_.[sGHlɾ]4m!Fm;~_#WLom|c`8#?:5l]@dgtj/51Ѧg8_+ܪ{=HVm"Yw$a &o@G)l5; Md =}Jo"jqK8B?JGT8H0ޅ|O F{{x.c˙jZ ȒjnYl p^.סMS]"9v+0gTc1հ6afTX<^)dP^#IإHL%r!m1>GHH$ Dday4dqʗF2Nstzv$wS;ձ|9?kURz4LCtZ: 6ɯg~@ =+k]R.hD#\\zlzFoz\k?pP7N:"LXyBؔVtG',М" "3oЮ/3pNCG%hІ3+<{Y +ݜɤvY뜚ygݭe +qfNtyr:q Hv+5 +0ǂPq,5p잞WGje{MsfXjr6YSwǸaKq̸ɛXP#n)5@shE5EA+AۙA7s*KX W\yTw&1 V2F + +|:57L V1GYLu`8oa i̝{#1Ldxa&M@cNNAXhn;jD3N\抸Qŵ(((,z159~_OoOzyxp_RX_Gx@ EhWJlfR,*~yK6et*%02sE] A8 rE٢_EZؼxa_Ǩ:b˱n((ŋ_@nsv`A'*s3IiU{_RC ~6,FKxA23Á!ty+n?S*KK1Sxm._bpOr(vKko9Xrç4^)ؐ$,oSW淀ʻt:ťi$"crRA~&o7tƿnR9A"_FͶzw8_b#_1LbD4GiiK xL;JR+%2% +-Sٙt8W[ &KGF9 p5륨 +{ $G$?fkV$ȾFƜGw3BÃ҂D1g\й +F2C@~ hAJM/6ϱ1i9 +}נ<ŝ:DP*z*55In4\V +Rc9J$5(`_bf>G/i:9 sP6Cxc?.ض!g^e3*ӈD|uy .w(_I,TXtuKD>?beAd?R# O?<;cJzVKuWtM. 1 F1# $6.4ajn͌7 MOT%]1 ,Lf2uPm7b^V3lLU9aj]n +$"lr0eEnU(+b)TrӫnatXb@:(FVO7,-5Jjƺ~:0'/ <|PN}oIm9yPlfcEyTrq?o-aЩS )+S|2Ր;Cs=w?%ه盗D3-ؘjx:NzP+UuCsBZ(dC:ƲMFImCzv}2*[SɖjdД[Bf$O'4)i^1%;WMQAtHU) (lCjv@OjЇǴ- @o*%LW`f)Nc2 +Rt;1 +&( ) 3Q/تAiYb~xa~u0Np(*/ReY>8W.RWJLѓikطiVTvˏ`frpvPo,0-LR*ү(2UZ$ )b53IXt#RP?k GK]DYߥ!"D ktѓ )ChKJ{f, +`,. *u$7,e~MnUӇF@dZUr?OS,2.`i5#`a)ȴ~ޏvݸhx G KFL-Og+p.Tv^^OĎ淗/@8IeE>]^(^#}6vڬIWρw +x +*5MR_v.T0K=جsގRz/C?By3vU}0QJe]]jMGXc-| &ˆajt.dG1۪@&ߕ?mt@6zS"OQaWY%ԝW^v H&.3\Ǟ9dhn8 Ü'#?-s*-,ur4 GC!f:!oEPX]mz[RfGUhЧu4Ѧ +ٸgS]1p6.qg #3-jEtvfP&U?-]v<M*D09ZDAҡXݵt7eLBf8|dV?  M }Űk6v@P>;euOl%%mGesRx.c[@BXWe/$1n@K//7Dr +*26<mzúF&T|5nh;@?WzJ|]|4<)A۩(AG%Uq|^J(wJԇgaʂe:5ԅ)9 NTވmns%I|_-v"v.}K/ taLn&ڛCgeQ_Pk.]:5pPi[|!6'AQ2Q\PQ*)y Z8x4>lȋwQVgW`o?ўOA$!n\!8}CjuJ3.׫p]`e,^y]d,af3G$s9F2? rz'CÒeu(a^PdgV.v4|5d 1L,#:T䲕W)S_bɥ%Q"#;Y݅Lēi"~ЊT4~aFb3 vh齇2\wt1N +JtޗeGS۝Mo V'[3w~s0e_dt ST҅~H.f,"+ux +k$(F7tdm,S<*y_3̚MmJ}K:bέ]Z 6!swYK?(vհk<\7ÈУ!`"z*v3˦be6WwntŰ +nktAA&?I[l>ؾJ60dbB&! +A-2aTJDir주4/*CL$dGϨ4.uf y4! 5"}Woj:W*cZi379r8e},>!T0lݍ}2Ŗw҂4߉^q(h69~?MIzSzѓ b@{Ye{?Dw1G[l`>:j*{2-(ۂ+Sbõ+b'DZCs+*(^, [NSwU&ـg%}qzPe'glDq"WYGҁJ/cww/7ły,T*AWGts.r`҉0rK nq`OAVK/b2Ϗ%KcӍaSz\85?9Xgw~TA!MJDžS?wLe( _Ys}~Ƀ\A:n^sԩxJc3r_@535纄=0E\l(;8"C'M;ӱϓ#۽`D@= @1JƿaiHk.;Xa^da<_|AbżQB0XRW0a#:FaW2:mԜ7Gx6kvcDNT-48ʹN`- \ PEth)b8iF[eqPqF  Um$b=w]ޛ/9^#Y)Ε{"~ Gt._cTT-槠a3U jwOLM +.I¨ݺ(U.K)}1dsJDdzmYX]9n|=LXk8PfR~KrM%fˮ{b | gKzvHVN\z!(d%g+rTPd!3 PFs/F%?óؑؑM4ۮ e hvX6^'a7À/kpf(!U \|s$pP3MY\` cR!k8_62 0Qo(= e ]CGX/u& _6lӛ tBKB/B k}k?mpAJWzf^F3eX:"!8*M BΒlaCx8쥇p=xyT'Jpx;_W8^TJ>SGx;+a#>+WG?f <$nR `ݕWpy 4ܠ8_l(N/ِ fzmI/@G=V֓Dք+XNtۦWs'` 9%,H2>L]J \a ک9ł1a7/,Ҭty&_2=6ʩ0 =. K^)M1ltR'swv؛_KzЁPW CLN䖶8X;vp7Ts*0AALV3q0E$Z3H43F1:1lk.˾gӠ`_ [hhh0KqZKΎm.M&%L78g4P idfT4 iҪdSt=c mZHZlhh@#vUe<c|%7bv ZA?4ݙˊUBs4t9g]Kj!ocsBCA_zLcՊ 3z49ZX;XE!0A.~Hhc2,:Sˠth\-CY,#sw" ^ +( |]~Z4CV)1^\ +47`*B>G +oR' +M),[# +4|B=M'5 +)*.BiTᒿU›zdmI^A,j ,fS>5=$A=k<'Ϛ[0_=<_!jFb̬ZmTFk+ʮŧJbXwgSU[{oXkݳϰxԬ&"mY|+ST_R۾Ҝ3čbeGٕ*WlE\u\H/!srcӱn\[(ۖ)kR;Zl{+F:k*c7Z6Ze3VX`.Ŵs™4Y=Qy|*˽9jvX^9FyOh=hiVJO 5 u=ᄙ'|L|o%[E߮ӛR#TޢT>:O>9Џq|XgN:h0ǾAiRl(~܊V aI3BCC! +. cʓ +7tv ƚ(+4hvHO5W= pB bu +,B5EXShPx XS */x/u#\jw{n?7#i{ᵚwjȁYZݹs\YT }4-ѹ?OPJMZHJ+:%xپ +עA4xHo\tY\`-룣: ^.@ +w^ȕ_v~`C{v_Qv"xt5L&qJB9WLN] u^֑+POu*ZNιOÇ|耉A`㳐ZZ?5>caF 2Y)71ܦ]rO_J~YZ^nd%G<ƫne,=3-KO[z,?nq\^]6H)ݴ{U`?ޢWy1{v-۸Sp`BX f{kq1EtQ O~J2ZïBU;`{i{=<(kM#;ʲ / O9L^]Ř{C-%d5 [=wߟ:pW.ox>FDZ,P o(| ($U67ZK:XN<3_J ita[M| 햬{K6&YHtGϨ {-Y/5){BoƥS+[՟{Z:loz~o_ӖR2/ ʻ3^(K1 Rb3?TX~|hbo'XP?e0kh4{]?1]>?WyWL,a_-j"Һ +uA}£L0[xʝ0T6ƫB|ls&g~o sL {K;G6eّ<vRE=#[~1a~=QHvzHnY(Yuk?`?p>p.N0"0\Tn; 3HR= fKۍ)e]8 a5=rCWo-ɻ;*fG,UkSn+Ip'\ʼ_*j7K³]IY!N5 C-4{e{;~Tx켐cSI6A=W?E+ m@t.Tz[ZUu ?{PA`.iϊT,Ԟ' *+=b )hO;ZLCt4emY+ "|d 3 gt9~ c;awOIf#[,'^iyi=E=ﳺ'*zᦃݡEo85ݶԉ,#t*"S !u4YzJ^7tA:b Rd1⩝Tz\Eh<`ǿh r<5hjr3Їdl*8aDפ qtJ`?ޞ"$r8!+8|~1iqjn S C (泌V+ Y_Q*2H0g4ze +hCѼ5g 8Mh0Q-?x NpFs h0 +f4G+C3EF5Rs\{jA x)I>%ЗJLCά ps3X`F@$kB&Ѱ43>xR$o08z^W\NxQVSO Gbɱ`a]j%}^ڡ/oiaw BO Qb(UGW ZfZ )--DUCzCŗei眏 LגtOrn9'`aM}%Ӳ$+̲sLk@?Gayj#G*p#`-jx,wdY(jݕd5O[{VmbcEfo,Vj&TL0_6XM̺6?nR?ӧ#i>MG0iAl0'đoa;FUd3x^ ڲFoHnt׎W"^ۄDr/_:zɵ.P9@L(y>{xyTX% ~{-jԪ.ߒx^&{_{148v'z4{<8={ ?Z>jGOeᣥWJzK{E>Vģ4Gľ{64hŕvMOZϒJ?◯֝-aR G;,dq'gIk{x>vE %"JM_ojoʈ{;pSėv-&),v" ]w)պǮ[vlTu+{t/ b֊{99BRb/h[syI/ѧ/j]{@i6}/`w Vg*ܷ>pNxoz1xJV&,\'k( +cMs 6pMߐY6rKP+03hߌ""gğK6407m1yi-6;/$D(rU]U©h5wZWR ,ΘZ?Cxm!6f:MUgHl~({'/&ݣbjޓN\sL +8!:(]rnfWS1Eb?k>rmG3duO vHg&&y5E8%zOb($o5 @ /AQT-*LIn[M%&J0cThnp~ѯ|~95{,`C{Lc~By&z;V~'1kC3^s[41K܅PiS~l? b?m`~ jxB`޺+Ͻ]c_|coW0L%ABfӡ@0Lw|[ -䄦%x͑`iv7c6LvȜ (v.lAy%uǩF冉KSirN%)B?WҺ7\5Ï"ǻЏO/;)AJ~>+`0xأ0HJt@ fITMɹdI5 {eb֍Ͻ=ڙqn:j7ΎwåSNRpqQ̹aj x 11!ğK|<=Di)^iHwvrU]U© +tJR3ۧޖf +`OJy%^[U3gB%ݘZݘfp7pM)2m+ǿ6%,}Y1e0Lf!CΥ~ԙ%VOJ#Li-MTr 'hD0vAjJ[Зvcmߤhk~K""Hּi +[HꚠvA'9,jYNIhs0k:q(pYl$XP1=G58a/)glR=1DqmjXIQ P"f& &Rš\ga0|J47a* 2~L[2VD@u$_Y,XF!2{A粸@1N umޒh`u) V韅žM_2!qrkɇc(NC*J2{m@hZs} ʰ0S !q00wDex`4 5xLɻ. %n;ؽ]M%Oq{8b8%l kSkJ:>CWz:} @i c’B._%$Yї59s&_;x'B)}褌^ `^Hi; TIT|M95b)WS#w8.bWegƩtz;foEKPN͍qSynv=rxeA暪NooNh<9QN-ٴuT|4L2}S` +em 1;8/ԗ٧lm}Vg3+X] u.$wR +6:r8yNŗܾ~<UH%|36շչDHp^܃"DvH@89vQvuR/I_VHuA);{*}VP'X *Qxչ!<7og؛}O~B"$ NC-bV8uEb +"bz)kNma粒Mn34^lA KdXJZ(9)*_b9)bjjKC9c4T+ݾ@Γށن,dCxm$d|A1R&h-0H\n#VOxӫǬ&T9]9d +4|PY@KLOۑF`4J$+R1R:"?f0s!}, JJC@7WX܀79c V_њ%n[ʒ&1 G#X+% i8IӡYI zeL,}l\bbba芘%6.w{qغv g;4Yx9Yp]ybݱ,_0M%GϋpkRXo|ЬElsLq) 0聼^]MF;qQ PLP?_1=u``5x=p`@c,8r y; +` sHȹ.N^IyzL?/.Nrs. U0W u!*Fɾ,WB)1頨dqQPOqN!b ('teNu2#/V_RQ ?#.uW ux*\8~kOy%Y")ɿ$b-ǕaFhJ[P29BDTsH9s2/7H(U-ye9 0rt;D(l$С̉!p; +ݬAgBJwby$5/'f8[tSam)X~R;Cѡ{U][BDkģڕ; n@#R@s;3 JrigU J:T+ŝ;q%7oV 4U܍t+4ĦRb2:|zKc ཷJ2/i71|%v@ +ylIQ]#*;$˔c1Rj s1=f=M8cyVxoFK  endstream endobj 19 0 obj <>stream +HWZJ}<@ִ@ "|$gfrfr1ոuvEyJ|+gu5+Ǥh=ICɗnd/ӃQ0zǓr4*O:^EA,}h1jUCt!u۷-T~ rN:VFʉ~a~Da1]LOS%؋aMYS~1ۈ距3Q4U?l_U]|oQ1HY A=9`.$M0NUGrU|7H:@FQ˽(x;qpc}Y8$78jl=g-uP;Uz4P UKOh( +N)%;e[ Y4HOCP\(Rvg>c\i̟& CUuvM/QqiHpBӐB 4(6 )b5VݳP-㓕'龎3G,0H322+x{B~"&p昲R_<гc=j]/Pl҆ VL|^yI+Ĝl,ʤ2"˲Pl+!p17S8JqQ G%i]F.=J,٫P`S+|Qeg26. TZʧ,R$Df2!.-Fnn, _3%J-U ҆r:IJAZ>T_xRAX:d⛹* TM(bkڴ)# CN?iHs*~Pyif|`1 6AJ$X ؾ,vXP5(V?{~[ӭ$ΕtT˼/g9jd=A\A JF); qmϖ~q.lz-߹mWAlT囟ͣ|~jR95 +R%0O1.a?!S!ntryx"F|8Uhp񑺛I'gK>P벝I!JU2h\9>԰rU_q.wX5W=y}<==& fEZ_8Mcа c -ouVG3]iAZsI׏k2ƨ7 YzT$an`Be'ob(TZw@0c +JY`V02P!$-t>6are}qQA.,W)N9Mzp ++; |P]9\dgy=P#5HKM1\'~ɲTvw,5_5Nw]BÝr@Q|KX +VA/JXPb>fPV1#~*2Ʀg-ua&ZČ]f!5iYX61,@~:ػW 3w*{,RI60)SǺҜ.&tX3Pi5 uŮ4[V/LS'y]-E3OJ^>~tw!n? +X1]ycHJҥ՞r ldGGE'͠S5{WM$ K"|_nX,P.Wx0q~05.C X}C1"O6`4`ahHйl4٦w:w IX8@sX$|-拣piHI{' S#mxLg'vb%։!i^jslN-bDe\.y)RޠEwp!c}qn0\&,cap47Դ8Z'cj\rC_JkicV +N)(ײi?U]J;M`&4#1k_Aq_ys! ieu@NQ&M^Hp֔]5Z8c.&lŴ`A?,yL,~J䃟-K\ LPPLr^ +/ƈ-g'#y"if| zvgd)84++wfԥpT +'S9O|/eLiF:7ars״\ X؅ń`gz?6g5ĉ=@w׉R f{$\W񞽐,sjO-EJh2b PnIs!08 MVUvFA[y^&yHg,8YRك"-^#|;FJʺA}샯A̻=  +pQt"RR?fbTgI%i1[;g~;Jz|w$+뼚m'}}0R-ZT>H 1`f3";9W~DX +ErnV'@ +m9Wͮ''1,vZ%+7 -ar!q70Vt +i+Yo9 y͸ 혽AdnAYhCC'y 9y7Pq{Mf/cW?6p*`"e󶤀ZM{:b>QG=Ȳ5ved EJ! +/Yy"ujG2[M՚~1+6 d:=~YD^{ޗh򂛺RG)S,POĮ=xpN+sxX+MD9&4}fUi%"y}w^ngWOIFl@oFa}: uvB>Vg(ͬ8bfG_WL-dBB5N{i"Е +;PD8 5+j!"w[q]Ewphd+]`v +~'b%Q"KBy6k %|s]gtS(=p=0n"J;i#^z;M]=S*rdO|!^* B`XLLR uWVǐ/):7I@'p8Ӊ| V#~X!Q6;P災^l{Ԏٚ+ϧ1̨j|"{3jjS6[gD"-2~^yBT:9p&7jL I?Q Ǵ{]|\>[,6Pޜ%ZQ#>(l6v Q蠃ivphVH +\Shߘ8XhWO !Y1 L8F9hnea;+{X2H6 +y5Ryx}NnVp12'ý9p&10Qk" SC[?Y:CQˎHD +AcF. dn@p @$몟 ‡x*2ߩ<Sb7f? aM>p4bWk&Ħ 1{4ooB7i-=?ˇ7=8 M_ | ˯I4j?,!_>c"2L.K=rHKwGM&J9 Xm\$6[H.)u>XJXoXt\NYRZ$:L +Hޙ}o{3tq__h6Yсk▚|9ހ ;}rMj=+)W=[-v/,kKiɷ԰fRV>T*-aK~[o%o*I-,]2.&N}@bse>.ݓGke Koͺ\N~ʖKvt# hIΔڵӲ\NĒB^*k!5sfK^lKU=+l_^k {&g0|V0 c9;7y«{740aʴaޘCEVXpY^s ze׃ +u8ޠPS^;dр[RBW=UMU(~Bs|)K.{*sٳ]!8~ϟȼ%We;#[G3ioMM9W;$o5j',9<%'jKq–\'hMVnOؒqB%W srwa-9c0ҒץLT7.+0]oeRl*gX 7b |[?8-.۫)}58̱cUXρ>O5;k?3D-3vβbWZlŷ8ʿZ6Yuڴ D獾kcÌ71vd7Mm|'КU; msO\ӬbhVxϊ$kP \o O\fY|_q)1{pRJZC\&&o̭&kY;=>4{}b<8}\ƊzZ{2  ͹%Ar Z|{D%TBqҌ(5ìqL2_]Yt,׆+zLNׇ] uvӀmv K.Ensn4s V ]{Fx<p6Xf^p<ަ}t6Mg$PJ^F<~_E(D"PD=;;;\8եI$铒֖8N$~eK"'D" %i"XLB4/'HB`JQ(@˱DpF^K %Hҍ(tV8UE %H@E@D,%Mbx<6ȗHOY$$)8V+(7 )D"}:@EEU +={V=p=D"} x<~ + SO]ӝ*OO$A:N }0墍pHwu++Xv4$kGؔ_,S˥Q"KH$cN$=Pa#իF*t̙n1̭c+ ֥8K"H'OJLvt@j%JR`tȊD"~@M.UXČ;2ax\X'D"$Q%f)Z&  M$mTH$,aD4 *E/QAz" +k 8.@* ɀȇ|)D%P EQ|Km&JұvH&r@&2=~y1`Tn@4D_D"KpѥQ=! =*L)Xʽ&ʐߛH?D[;]NФ"ȇD"2J@8d)tbX +6]XYyD;U0d3WD"Ez*%DRGT Yb݃<{o}a݅5okO~Żhr֝]Xԭ=-RtVSe+H9N:uL +1~~jqo,<_|<;KO_r3o>D(?H4:vHn/֖V=X/ wq :p~qmG痯$%HJx<D677s(9]̌&ވ,~K}ݝ>_X/Ķ)l%e\V(`&MÚ\hTo(Et9> GM9 :p5e)" H2"dbRV.4LX+YV?!zlc8:87bYzÆs*܊pƥN*,!Od ŕʱKm|y`ήW1j]umaڮ}t} #L endstream endobj 20 0 obj <>stream +H]sX?F/]I. 73.`o~ .vlc[%zlMnJlN+'gx?2Ѧ'0 lΝ;34xt5[|Y#]YPHPDF Y t4Vw^WEQXhBx QH~8{@h#'#jYF Pqb,biA׻a7£Xhb&abexxx>̐>vd9:n߾=OKTB R,Y/])Z{U(b͝wvO3~ab|}= YtLDx0 Rb)ᔕfP#wR&_$SPJT4 + 3a)}b)*_Kkx/:A6#G㘧\ GHD'(9E)5 ҤXHIMU[TlrQ,~uQ~.4uA]EX =gԬM +@4KJU| +}XnJKG%*!bI5+hѿ&g]es!N(6DM4*ٴ!e&@J5S#@KQa“Yӭ::0R Z1Q2[}S( !k4G^`-]Qgg:'.2aӁN#h%bZ6OSexZn 5׺S)ʊX +)K,k>tHStpX6(..d/e ;&q귌RK>A m  `#UNOUY ֬^'OˆGK(qе ;pԢ +>Vx5:Iv]b&!qEyG<[Y=Az֭~Zp;k[T8tT*V +eb0zYsq%AE)%k?_4 +x4F#pG/,OaJ9$Z-4vQ6D1GƎ7t' ~e5wÅ2b daUn 4K/uo`)*#1N/(J e%Ȟr ފn;H)]ɾ_LCe;E2e0H#,價yjn \\][= uoRo)c8խ" +*Eiص@.QA[* +墨F5vN:ိ%\P/2Ói`m(lc2/?~o};w?ZX\FHWЮ-,,8- uT8*SK4.>@ +~HmoK5^NDCA Z %Hn!o(WC/K>OÓQ-^w7Tzs}\G|ړť[6VVѮ/..7R7xֶQ8MׄAJilCMUmhVU1k8-~2^*R- IਢliZG~:n0zd iI>)s ¯~s߽=&sss֟R?ͭ=^ZZq _վ;4NNX +l`)D8ER +HN QU:X +)K.@jupZ Azixu]D<<<$N 'd4/ۏ>ssW`@%8daq5AQaO?r'R Y<Հ}8P +]{dp끢} l:m]i.Hr!@cCK1wQH(Q7?i4FQj+GR6q>]4r^K΅EF]rL&Lhܞ exBZL**ʩR@QX +BQP*V!9pKSZ2^M"L1-ERHM +xo*6RfFgq'g6fc6&Ņ$IVB`ċ/<D %?a)ntF' +5CɊXkTmX +H)Nvwpjs5+T)vAL=v܏Px Z.,LL슚䧍P`aЊ7X]uy}h0T_ԏKjmVSmrNS2N+&bG/ D1Igt5#\2-ZTQ5sp)mrJl|+Fx$ + jJ=AC]4.zr0l֯.BzN 6KnhɊ7jJxZ%HP +?Z_w^,r:)*TQM)襉`%-m竈Si4)vocbd ǧ) oŬ>_+D}Չ|LjJqxaρI(;Ճ&W_} 3<[dHz`xFpzpĜESP>P~CuXXaA88UwT[GTX^ +N! +A:)őY5M&T!ųUs BEP&&*pGa Brr?,uON(Z(?MLVR_!}'RVAl~*C׆OviGhn_C/fJBF꛿淟>3PI"noFJKB<0‹(WеMdeW>D懹~pdti{UөکR,.R +b, ʔ2V,E/ +EVAǐ,MH6Εހ +|6$MS}ʸQ m  .HgD0Y:٠{x֪vV)*F!gGZ!Zj[ +Kġkǵ~)] n 9Ûp/5M8Je9\XtOqDdsTM)^_m.o!P ]sqAhG2ab㔋:ɩ!N?$KB3!gTC5ő)A +l)R: +HSQfDpI#l4JQS7(js* 53lw57_jp*[*e6v7m9Wy_<tЧAŠINKE햬(Jh(啯iRv4qrq@eyxnMZ:j&*'y@-"#wٷҥCTAx.cR[4ȋ(t93S> K ByzZ[x<~ǟo蝻#P% 1¥ +nN6 )ys~y ,ŵ嵿n,,=>HbuzvTfNXJ:5mBhѰ9,.Y9JEjQJQ ^)8V^<1.p1I+Fsq' N:K5hF]6kJLVO$O1|P^J JĥF=,ȡ$_)!F\&8%()*R"4ij _w,Wrl^U]\\?޻`j9>>hQiBԡ +9y?),ABW ꣧kOv$'JP> A&WST"RE,J-B!OyrNB8Ģ)pPn ]Bi?QMd]˗;yi>*/؊kdZC-V Ia1vTyޝ 縝B`[TZd*Q I +Űq`lRJlGV>Һ0s̥&|jH5'x_By +ՓS<+l$Vh=9|8x02l:B$A\cQ*RfQ?fgsn̯مUd'_Z_X~ ϥ rt}+H?]EJX\JuJEʸv2ڥXTHHb I٥0'RNQ')n|GjU/F:ZH4R% ntgzu4ke5r/3dN)/r(:YJÇx (=L^ +IY0sFj BrGb8/95 +ȟN R]cEM,[-Gf`MOܹsJ0{sb ПsrjzNH+iǤB+Ty՟)+O6EJ8>HJE3ҥҡ^5;z]EJ[2"etHLAK-i +<(6y1gusq  J~e:BqFgY^jԛ|BFTJ8̇rv?yr{Ё*Ո}U & +¡" xw%UtAzX´E̥Cd3*@IJQ-j5VrޖZ][o{zY KbOCMӰh\.Ϗ?wGv޿?C:&habu + +b-Jj'7޴%hSNׄ6%q2R~pſY l܎ܭ@ɷUlք=5[wKn-. {_m) +Z巀]ԥԊC]*_q0֑_IjM[ؑ+R~Vm,R(,l6_C##ccXE1*RęI@9@p՟ ̢.?-  >~rtn~E' OV[/JJQ=J-^eKtNBHe$"RK™b$ڌC7b'6Q +1B YPDAhv;=D)6'uI_w1:zKw).ynMr>DF1Il^ڶPwE)П% v43ژJ_;'#m] >)rbj\e!\#5\oOng؃Wq:(o/6}=K p&I)vL:%DB`مisn930(` J L +K6:1k9:19>MIDJ-.e"DfJE.5KRlbI]%t8+`P$}XSRj(Fq-]oimMo^oE7P}[D_ƿ|%k r`ˮց`!:vrpRR5.TGTR<#j.U/ڧUvx1h"汳OvB6.r36_$2M+Sqd3M7 C|G|!sH!dzԸPZqKhTz,մft{cWX|^e`BuV*~?ѣ"'3l? b;~+hOý' 6YhUPo$mYAoGƟRf)DZf1[ 8=>R3:IlGRVY-մ\r V*JB]jҵpJ#yb?ZN[TޤerRU@*nR8N]=fNJʁNXj*/Ka/D#;@U:)c kR[Cw,a)5V~7P(m-XP4|>|4770_6큑AgӧyXW4ŏ953c6}rfdtbc@z5\5үR[S$ CNIGLT +HBBVj%\a=KCrF T)٣JzG,zv-gW,\Si~ki\_-e,4OBU8ti.1^CþltpQ-T;.'l6ꭶv]GOjpɓ'6m~3@rhXP2inLQ#G GOO+?Os%2>#̅qcͅgjn=!,vbk8%9TͽQ  CQp^ẓR)K"FԪZ"HRZ#KVw| F;@Ugy){?x.YrөkEED2WKe;*kW>}jON>eU&_ K@5s;(a|ڦx!G9;:0 xnd~R[*(*(P?2Bw's;5 u?'&1r{x kҌIOK$g1JBNUi$crCqN"'$Tq& +K+襕VM>S/qjՒZԑwΏ_Rg癍$֟^nVb%ѿ XE Ҵ5giSfK?tn9Ild^Lfb%gaoA? *r{u6R +W\oщ A#)):A'O(Od"b/`q.\R1K::n'B!a|`H]`y4iJ!g&DŽgZ +j'Sɚ?XRb3OzpTDcH4CG 3@0Z6 "+TMquUxkb#jx{CZR4N_Ѯ[r]Sw=%.S: dZJ"ZN_\3KEԟe+DGUojF[Wd )g{"ﮛX nRzj"E6j90ʪ'w9R;ivW~/vŸY;Rކ{luB/k5IHZvǥŁevA F>o0z`1p>:72 UP -g&'UPF( +iZ|8OOO="P[CC#_|k|JH ZړS6Xf endstream endobj 21 0 obj <>stream +Hr$k[^*ɖfɃ$d67"w[EI%RN($$e%\7h1Aq '$GB4`LDmoDJz0&ñt0*hRmJVjfzh4aF2Vۊԛ Z sONYlwePZ=ob>QW +e]*ȱ\r#e˹7_'Ve?#_%瞈9%=bH /y"/ +Qܯ[DuO"{^YtD|<kE}tDYfQ3,uu79#Sԍd lߣD7jm7kfwmP0-\jsXo `_tX X&'RkF\J?ym֍[^|?]}ڍ+obc䦕7nutح7n߻y(w~upOȽ?<)Foq66\yecWG\~Us×^ts)'^8q3>:5=۶ڷoF0)YVIIQt$3<>Lk}##O|Af$*Yʇ e">p= E`$FR͕*bR 52lE;յhVgِͶFz-khKrKom +b>5Ʉ=P4BE3YijIr\/(t!+; +AJqX^z ┢x?~))Ҿ*<}'nj88-W.FsfԊfIl65VZfw'Št.="6-T"ѨʩT #7@wud{%HPgwP)KFϋ~(GOC?|Z wl4ۀTi-e[uҞ|v88E^TyN,E6" ?xwz4vwHrv]vسFڲ7Z9|TPܡ,% + nr-&}(nND>ë87Aq*rRGο\7tKgTZ9*AvKaZ?ΩOI6K*jY)i4:vc OP#XXXXX.BeFQzb=GTJzJJ!N-  M=g[~z^lZrvU^ᰉDzyV[y{W;)t|MMSuU:);ә_F .LpQ ,&RU!jZ0xsM۬7IVa\áh&_|=:fFQ)%iaO訃uTr:XiuJfҼ_KJا%6tlK#hԶi]Yݚj?$'*Xf׷>9CKz0Aȉ F(+'>~#'#Z(!'?yBy?yB O#::t7?+hR^vc)St_A4.vipڈ3ySl 9jwi3+HE;Kx[E4aiw> ,5VìF ZB6#rvq.1O6KWnmyRM/@ +-ONҾ~tz.V\‡G@l֊SN/e,Qeo'NNۢf)}kT*k& ->'zxIGdz%'9,fJިۍ +]YV UǣGۨ6baa)bAbo ~F\XxLß~ՑqjH򄒟0OsUP"x8|  ~o߾J!DUKqtRi_Nwi)Nh:+Je@7{!uG_HȂ(!s +zH:RoE\베Zdwe.) IAD)&]X`cm 5 "t<8Xy—Y +H)NK]OӮgHP19[$ߺOCmYJGCCg5%^}?AnVXHYKs:K[2j,AYj?|v1IJ9d& +ϴe+t3R>+.Zc,!fօtKq9Q)E4ڟ[ vf>V^i˯ lY H:J#3/UsՈَ}װ^hcId«c? +FRN E2\zr9\O[iyjFj J ]|¥|Yb~[;'Ͼ}̹7O=1SCҎs T +)ՕBŗ'o>_s VfDŽ cNg)[ڄyCH3Kd8}ۥ[2K)t^{s~'&]T8XBKrxIz<ԍH W7 kJ'Kr㍟}xίO~KU#MPPI O>'=y~OT(#ݽGسo߁RX1E}5KwcUaFvJSt h:JryayaBQ@4#rBJKLesMILI^,B-W,)%}Nܯ=O׸F6^SdEVafYNF6rE9] -\,8|F7J]= fBA;P87~X{R?/ ^xj+''3N>&'(K(<|;}pW{M4ݢ k4Nv#MS: RmD4Nrk(|"%NX?fY)/Y[bƃ׳>&ZnbKMioRإ-rbbЁϬ&f^b2d$hBOf0?7RL MXpJ.Qd$;W'0سRTp>M!_Oҳ2'U RF,Dt:N%2S#T)JkΈvZ 'BSL,fCBd#\Ȃw͠c#iYoCSRq$(5&YnH?l|-B/\>?p cSKP?)9v;ӧgoב<ԭkϞO7?EAIdb qKKc`W¾hR`q%A T]IQZ*PxrTF.\H>-K}yy&{L[gzMY􄜇]dAHgs =C!ĉ:ΩkYtt7eY桸^r?e-m,*Mji|z֩T_FDcЍ(ʹ ^D՗stFuAj$*)U]-RByC9Sn[; EA+Y_nÇCJ1/np fѡ(UJԿ7o}x.]1x.\:0x''?GxvHP ~j +?YB>J#t?p75x}F)D]8jkuYCl;!e9moViA TORwpä잔}!QEsd)0烖\6!wdN)jpe >@k!}h'LSC4irCv61s?ixBQeB8Ҕ?ӟ6;O&لg RBU>Ҫ}>Xm p{l0K~~(gx$a^4SL}iXFKEP-QZz$P.3(4@()rtJ-J9I=1D;0K!˫JEw{> +xb!ze~vo︇ԟ e| km'zgcu}SuMCUu}UumEŷo39R_ )8UD*9B(4AJ?י8(JA((\tg3 #ɨsTtBQRR┉*qS^ =`eGR}z`` _2(Rta9(CZBN,q+_!% UH[Rr]|eQq"E116|H}1vԜ IuS^Z=%- HyKhjiZ\&,M}MystYJEګ)b+䴐VҘMD߳0ݏϿLJTSKGherC[C[JEʏ0Y:4(Paiib) E1욄jFY*q:_LYg"/sGHZTQőNG_ID)jї%?yBB1"TV*Ohc~~OS NzMS* -'MeH򐖟-Up"*.NK/<.;tv녙qh£ ǑE +1Ep=)h -Ĝ+Kcsߚ c§au NmF1v}EjT(JAZ>4l싛^>S\d~ ~Z!SᔇT%M܊saSp6U,bSp*C娓(#H1q +v*Q S@*zolɵ]f%_7?w!J%BB19AgmWϛ[.cM𳵡R}CK]}3?yB,>={s'OgXRUҹe(:_]iF|QoT5NK* , WO$Dž4mآ]pEqH̍ +Y8Ǔ& 1:= +iqK9N 4`I-IO܆y`qipSAcx=_c5DOPjR|}/'p]4L} -T:be*5*M X5NWyNiYsnfXaq)8@U +Kvki-({۹l6ڢsKt".Ye?O$rrowhV#UVꋮZu$1m|'؀|sĐd2qLE:exJḊ/<&x;/',YRd*,UUuWD -ڟR<dKJU{E+Bj\J!fRK JSKR(Q;]BP7A)iNZJ.ij/7?#JJT(!*J jB a??BՊv ?{߇%^ ]AtAvj4^TQJr Ċ ERk*@! T̩'{MdFR:]QcN^Yׄ⢾[9l3UUm*Q +!1P#b)!>U8WH4ʫ\Ou=!Յ~ XVD) Em>}5:ImRKTm3>fʼRJSXTmi5b؅a T) #E!b]Y׼rһ-l7׻(=(᧚СGCc@Hp!LC($xj*JO[ +=nܼvO)42Ptu#; L'Ӽ\ d:JEmsjhUKՁvU()9zi bҝVs{wrfjvjlY=)Y9n* fUJ2 c!-ʩgThV[_976n6ݦ6mӼ*8q΍#er1W1dA3cFvL [tO&0/ +,NNt%vNE۲ϔfҜIF=z%BU:+3{{MX|ς{c=e xd/F={ $1P( JJxbիţ'*R)myI!G9`pJ!r5_6_7{;- +_MqHFWYNHx$ε$KըH tjKW,ܦ #?|Б : +1Х`!6gm;Zjք\6>'ϊwH})B(P1D=kFRSƺgB=hS5R]Ku9@J-m|vXJ.j̎/iѿ`BE|ͣ.1` u+wUtL`)TJ)ޫߕ +lٓf:E=_fphd#94r BqP +%~BџBN=8ko^rl6_z_ 5T=vN)K)]rJ!յT All5pj5VV]K my|Ȋ,[jL5"PPKk^Zڇ3+d9{E +-)F=[z<B|Ӳ S!e&I2 -x-}22o_"3 ?y":E *xSh5ŧ3Jdl+Mے"ỳ=Z3iU/U#NEYmQѢR1dW;aPBH Qܡ(^Vb9i[J!MvQK)LPM("ƽlYTK5FSp 804<:29|o#9WVj/ m_VꋕV]Vi6L`cc`sc㤿qf3$Z~B8vl_?~/ٔ~?I~Bi? Oݹl]n#JGit?+deiF[jԄITKT-9gI '٨רC} HLA2irFΏHYhu$iKq&l V^އ'= ETp7$⸹Lxk*ȇ6ʾ1 E:R޳ H-95e*f iƾ |Jͷ&7uCb` +?+j)ĞUt1 BT<-9%Qn`5f]u`gd&Q-u6P-2;](X5 .2o_$=*通 b8&H KhNP}ki\D3>4ZH*g'3gco_pcp{#Db$? wpqs׮]H! NJs +H)-*]DRTkTU6-;H`xi2l u)mRvj)w+­ ER Bg^N!C᪶E +I7wI(ZMiP%.g|6,䣵|TBL])x}SH)|HErWnWut( ׅSJ4ʇLWfGċ* +37R[~:r0FsjLZd*]3Ԥ҄Na†(@SAq'ժFus*rp cZ!9tOGYzmZ(^p"#&$N5*&I%PȉRҭ;W^( %/lErJ%Ԅ9G;!t0ZUI얚АҖA%E0+ݍd^9pnE ؀qeq@Tb~\>z6JgzNG9wrZ Xensv3%D +m޷E:&SsA%ݯrz[`}<^b\-DCΒZ#H-uՁiԋ4*>(fT?SHe+wWW'.ȫHSLtĪ1[`m(/mLER=v߼Lҳ9jxjۅ^d| o~;86APPIJ'(M('M($t .\tʕ+#NM] +HOqjuN}Iw*K˸&H Nm4uT|*mBNR\QEANhclBtLd#ěHӟ/Jp~z0SҥYjiE_Ͽ+Z:fS/Ýs2)e5?T]>u!K)(#ƷjM1℥F;Lf+,t--c4JCF E*E'ոsI;Zʋ)I.uw.(i|Hg93qq!"է!V!)XOS@j(^HpxqG]ߑ < O9~40x [X\ D˗ MYJCJ[JCJ[jҐqwǓQCc̶r RVn-mMr[OoJtHRPDܧ$EtBd IO-RfbE9,{ʞ'qͽR^uHk>鬥51Ę?K~ 6io +:۩B+pj;v)?de{_XpbW88gd6 5YjW4i&FTɤ[j&lqR9Em$wѴΖۛt3WBQ? )m) )mRP ׳aY?s* (xFq0ǣS׿{G?䇠ӟ|w=:AA? <OPIv"^ruK.C\6>hg,XXZTVҨZy;:֕SUi)$hP&m4/f@J%Sm R<3mMΧAhX4eIpBfvEGTi75.FH4fSoUxzX;t=(o?MCe{lZջbL=1&Vl_͒&?z %_0 +.69Тif(%PF^BkUm8qE`SS8:]ئ] \ NFsQ['M}pQd9WݮGmW}&Z+fsp6'l=~04G'_\;kT:{)1DZE5xp~嚱 랓`?8<> F?q~o +kGD"5i*M +eR?Y2?{Bt/pOy-@zS=>~AN *Tۨ*HՖ˔R)SYimIM)1Qj!eTN,HnXZ3T k&=O©An _ +y?@iԦ`9Tt + +) 0ԚiQ0`2'-y_WsٻIA9:vvH b|7j%W]98_!o6z-f Yy@e34jBWYVŠlD)Ňp*H?XzR| -=N?ӕxvt|r? yxt-- +Hg&fTR?1XUJ'KP(ؤ=%ǟ=ܐF7yKlT)*p*}SiO8~͈9G@jԥ# m% ВZUXJ3$AISRl{Ft?Oۦ~3c%pZHUl Uqj,_VINx{/r;EW:0$=I_nAʢnGR*zOB $JtrF*-KW46`XY[AŰs>u{umR&ꅐ-BjĩVT\+g#8z78ι{xBQ:n{fs_o ̤r )d~bOOU޻nw&p޼ysff䋂OTΦ4)Щ8U85 +ԬXRZza2HUOҫB_7&R2E(,m֩YZq/Ҵ+v !ev3|"c2caY:%؞A*-|q~JSfxYr 'HV[Ȗ*Qf]1[NU{%ωm=8_ER$IҁS-jAP PIQ SqŌ i`fqZҝU/Nrum)>*D`fUJPAӧr)P K&o$d*MPd~2B'='߽wwR ?N +i4ɥrp*NqTQ)lZQ֩n~^%6y!UYji3l%Im*SfC3ո$Nv2+M_;j4a))ڞ'NJc2gT a7/#:M+8_IKDT2yA9]\-q,r|ҮZ!=tZJ#+;n>Iŕ^TN\@Ѽ M+2SJpZ +jHk"):RTE:00&öB|3:NKm)JJ닒 ~:N9SqU)-iuo/ r\[ S3HSR}Ti\y+N ZBtRH15?H&Q'%*+T7Aw&ׯ_~gK)Q}NJK/LSL)ۅU*aPV,Թkak^Rv4gYwËsJUOyvvҲopM3 r'Y3|ȅq3gy&X'1B:S StSbI_K·BTԣ u6;Dvtk:*I|V6΅$~!MpTͨL *Ti?\-0OWZ#-4WDE(Z +ZiGVMVfSW Rq*)◛iZ `w?h( ps#;xL꧊P*O'F~*z89o޺ڵkӟJ< R>Z1HUjU e,e!ݕb-2Mzh9hQh#Nm]tr|pI7^H+ O-of֔*-Efm RgdH\|"cR::rNZJӮi>]t*-iUDb];bhK8@* іp"ТD Kkd3F>gw}jyzشշK^[c^Խ/6dWtidf,BtV* to_:`В-ac3loQZiqQ Uv +FȎ#tR>]EBg8ZQm'AڋuT h&QHN`-m!y+O?~c$$9쿿B*o4'#'Ss)٣O=~2H_zu:J;|}nHrjRQCZ4K V +EoiG!GjHp!,ARKo).|H: ۽b_Q۽P'hme4 E|]SE \sRR]^*P,<6nimwТ Jv!RIcwm [I!Y!OH7핣.$h \")!j3`C 6'!0غ]'PKo  :K}i)+h kv& H|[vNl1[Z\@@jũQԚϦ):'o y5[qsYT +rW=~W)'|Zo*7`'ZfXN Qx K1(*\"N!h)C"D¶I85T)k,8mnYzVkU +H鐔 Ocb:pYxD_w7O? 7 QIGcc߿/ +dzpjꙫ%bSSQiOStR*)Z$k U:`Q|E*\$KRn):@J,=#M[9+vz\ %l>ɯNɊs:˭R˜Α1c^Evtw6D< E[ +V/'U>5(NX HB^4+o̰śMmQGeecYࢰ$`tEA\}Q +%XFxNGsj5{y5YUGۤkUc6 jh29(Jpgn<9959QOJ(O&A4I ~M2@ +B={<~=靿>D~HNER+DrJW) mwշmr*\Zuȩ AjjՐ2R2#4PX?WYI`֎sK}b%R3Qi>cJf~H_4H7mV_{ ;RMt˱n)l!TK |[JuX?4~a= +r\=AF?İF`֎KCoۉ +<-m(ܶH錢3X +Q[JE6ngS{)~àG!e,5h?p7o~_+'Ԩ蓯bO6ɠ%-7>F`l ctaaĻx}>H㩽x:BɑT/*"S**S LRT tzH1iMt + ߊ|/cV!WsKG9Rҫ-v>eOQmI{A!3Tye +e4FmTST)ws?/8犫o':ZO)|\v|bXIR4+Ho yֲj-C-9>޻Z]%셄jyu\dbQCg!*EVaZ4THG^%eKL%c,uz9SݦHHi/7aB%E bxvpNȅ#;?xHd*(zf~^z磱HpTX Tߪn7qBIq)k)i$[)Pc85!,mFfj^+C.$Ԅ1lMJBZB߽޺<bK4bC:BѹgO'B_Li2KRٳ3ʺ:,jhʡj]yIf4hPT֚uUǿNAu7o:}=X3A +)iS uz]xTҬ[t\إ_Jtr{3Z{leBսXs/T<+wY.mUbw^6%z,B8YKx[Gε]v)̶?U2; IR)$'>^%4U.YPZġa|6JdSN԰S3ՒsqYieP#eBfRY,,pU޵o|$Ak׷*J x>(D?`dGx`^㓕#ysss3338LMM}ܨCմCrʡʊʹjZK,!ջoF'z<Y!{HIjݢXXHX=;0r;ZU qRp,y *lg U6 +]I"-ъeM U(}vZm]ϣRB'&tqfGd#썶 endstream endobj 9 0 obj <>stream +%%BoundingBox: -89 -180 523 612 %%HiResBoundingBox: -89 -180 523 612 %AI7_Thumbnail: 100 128 8 %%BeginData: 6246 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD89FFA97FFD62FF7FF955FD %61FF7FF9F9F955A9FD5EFF7FFD04F92B55FD5DFF7F03FD06F97FA9FD33FF %A8AFA8FD24FF7E0303F9F92BF9F9F92B7FFD31FFFD04A8FD24FF7E02FD04 %03FD05F92B7FFD16FFCAFFCAFD13FFA8A884A87DA87DFD24FF7E0202FD04 %0309FD05F92BA9FD13FFCACFCACFCAFD11FFA8A87DA884A87DA8FD24FF7E %010202030203020303F903F9F97FFD0CFFA8CAA8CAA7CAA8CAA8CFA8CAA8 %CFCAFFA8FD09FFA8A87DA87DA87D847D7D7DFD24FF7E0202070203022A03 %03032B032BFD0CFFFD05CACFCACFCAFFCACFCAFFCACFCAFFCAFD07FFA8A8 %7DA87DA87DA8FD047DFD24FF7E010101FD0402030203020354FFFFFFCFFD %05FFA8CFCACAA1CAA7CAA7CAA8CAA7CACACAA8CFCACAA8CFCACFCAFFCFFF %FFFFFD0A7D52FD24FF7E01010201FD040203020302FFFFFFCACFCAFFCACF %CACFCAFFC9CAA7CAC9CAA7FD04CACFCACFCACFCACFCACFCACFCACFCAFFA8 %A8FD067D597D537DA8FD23FF7E00FD040102010201020254FFFFA8CAA8CA %A8CAA8CFA8CAA7C9A1C9A1CAA7C9A1CAA7CAA7CAA7CAA7CAA8CAA8CFA8CA %A8CFA8FF7D7D537D527D527D525952FD24FF7EFD06010201070202A8FFCA %CACACFCACFCAFFCACFCACFCACAA1CAC9CAA1CAC9CAC9FD04CACFCACFCACF %CACFCAFFCAFFFFA8597D527D527D527D527DA8FD23FF7E0001010100FD05 %0129FFA8CAA7CAA7CAA8CAA8CFCACAA7CAA1C9A1C9A1CAA7CFCACAA7CAA7 %CAA7CAA7CAA7CAA8CAA8CFA8FF7D7D52525253FD0552FD24FF7EFD0A01A8 %FFCFA7FD04CACFFD04CAA1C9A1C9A1C9A1CFCACFCAFFCACFA7CAC9CAA7CA %CACAA7FD04CAFFA8A8527DFD06522E52A8FD23FF7E000100010001000100 %28A8FFA7CAA7CAA7CAA7CAA7CAA1C3A0C3A0C3A0CAA8CFA8CAA8CFA8CAA7 %CAA1C9A1CAA7CAA7CAA7CAA8A8A852275252522752275227FD24FF7EFD09 %0153FFCACAC9CACACAC9FD05CAA1C3A0C9A1CACACFCACFCAFFCACFCAFFCA %CAA7CAC9CAC9CAC9CAC9CFA8FFFD0452275228522752A8FD23FF7E000100 %010101000101A8A8CAA1C9A1CAA7CAA7CAA7CAA7CAA7CAA7CAA8CAA7CACA %CAA8CFCACAA8CFCACAA1C9A1C9A1CAA7CAA7A8A87D2752272E2752272727 %FD24FF7DFD07010053FFCAA1CAC9CAA7CAC9CAA7CAC9CAA7CACACAA7FD04 %CACFCACFCACFCACFCACFCACFA7C9C9C9A1CAC9CAA8A87D52275227272728 %2727A8FD23FF7E00010001000100017DCFA1C9A1C9A1C9A1CAA1C9A1CAA7 %CAA1CAA7CAA7CAA7CAA7CAA7CAA7CAA8CAA8CAA8CAA7C9A1C9A1C9A1A87D %A8FD0627F82727A8FD23FF7EFD070128FFA8C9A1CAC9CAA7CAC9CAA7CAC9 %CAC9CAC9CAC9CACACAC9CFCACACACFCACFCACFCACFCAFFCAC9A1CAC9CAA8 %A8A852FD0827A8FD23FF7E000101010001007EA8C9A1C9A1C9A1C9A1C9A1 %C9A1CAA1C9A1CAA7CAA1CAA7CAA7CAA7CAA7CAA7CAA7CAA8CAA8CFA8C9A0 %C9A1A87DA85227F827F827F827F8A8FD23FF7EFD05010029A8CAA1C9A1C9 %A1C9A1C9A1CAC9C9A1CAC9CAA7CAC9CAA7CAC9CAA7CACACAA7FD04CACFCA %CACACFCAC9A0C9A1A87D7DF827F827F827F827A8FD23FF7E000100010001 %53A8A1C3A0C9A1C3A0C9A1C9A1C9A1C9A1C9A1C9A1C9A1C9A1CAA1C9A1CA %A7CAA1CAA7CAA7CAA7CAA7CAA8C3A0A77D847D27F8F8F800F8F8F8A8FD23 %FF7EFD0601A8A7C9A1C9A1C9A1C9C3C9A1C9C3C9A1CAC9C9A1CAC9CAA7CA %C9CAC9CAC9CAC9CACACAC9FD04CACFCACFCAC9A1A87DA82727F827F805F8 %27A8FD23FF7E000100010053A7C3A0C3A0C3A0C3A0C9A1C3A0C9A1C9A1C9 %A1C9A1C9A1C9A1C9A1C9A1CAA7C9A1CAA7CAA7CAA7CAA7CAA7CAA7C37D7D %7D52FD07F8A8FD23FF53FD05017DA8A1C9A0C3A0C9A1C9A0C9A1C9A1C9A1 %C9A1C9A1C9A1C9C3C9A1CAC9CAA1CAC9CAA7CAC9CAA1CAC9CAA7CACACAA7 %A17DA852FD07F8A8FD23FF770001000128A87DFFCAC9A0A0A0C3A0C3A0C3 %A0C3A0C3A0C3A0C9A1C3A1C9A1C9A1C9A1C9A1C9A1C9A1CAA1C9A1CAA7CA %A1CAA7CAFD047DFD07F8A8FD23FF53FD04017EA7FD04FFCFA0C3A0C3A0C9 %A1C9A1C9A1C9A1C9A1C9A1C9C3C9A1C9C3C9A1CAC9CAA1CAC9CAA7CAC9CA %C9CAC9CAC9CA7D7D7D27FD06F8A8FD23FF7D000100287DA8FD06FFA1C3A0 %C3A0C3A0C3A0C3A0C3A0C9A0C3A0C9A1C3A1C9A1C9A1C9A1C9A1C9A1C9A1 %C9A1C9A1CAA7CAA1A77D7DFD07F8A8FD23FF5301010153FD09FFA1C9A0C3 %A0C3A0C3A0C3A0C3A0C9A1C9A1C9A1C9A1C9A1C9A1C9A1C9A1CAC9C9A1CA %A1CAA7CAC9CFFFFFA87DFD06F8A8FD23FF7E000101FD09FFA8C9A1C3A0A0 %A0C3A0A0A0C9A1C3A0C3A0C3A0C3A0C3A0C9A1C3A0C9A1C9A1C9A1C9A1C9 %A1C9A1C9A8FFFFFFA8FD06F8A8FD23FF5301007EFD09FFCFA1C9A1C3A0C3 %A0C3A1CAC9CAC9C9A0C3A0C9A1C9A1C9A1C9A1C9A1C9A1C9C3C9A1CAC9C9 %A1C9C9FD05FF52FD04F827A8FD23FF7E0001A8FD09FFCAC9A1C3A0A0A1C3 %A0C9A7CAA1CAA1C3A0C3A1C9A0C3A0C3A0C3A0C9A1C3A0C9A1C9A1C9A1C3 %A1FD07FFFD05F8A8FD23FF530153FD0BFFCACAA0C3A0FFCAC9A1CFCACAC9 %C9A0C9C9CAA7C9A0C3A0C9A1C3A0C9A1C9A0C9A1C9A1C9C3FD08FF7DFD04 %F8A8FD23FF5300A8FD0CFFA7C39AC9CAC3A0C9A7C9A1C9A0C3A1CFA8CAA1 %C3A0A1A0C3A0C3A0C3A0C3A0C3A0C3A0CAFD09FF27F8F8F8A8FD23FF5329 %FD0EFFCAFFFFCFA0C3A0C9A1C9A1C9A0CFCACFCACAC9CAA7C9A0C3A0C9A1 %C9A1C9A1C3A0C9FD0AFF7DF8F8F8A8FD23FF5353FD11FFA8A09AC2A0A0A0 %C3A0A1A1CAA7C9A1CACACAA1C3A0A0A0C3A0C3A0C3A1CACAFD0BFF27F8F8 %A8FD23FF7EFD13FFA0C2A0C3A0C3A0C3A0C3A1C9A1C9A7CAC9CAA0C3A0C3 %A0C3A0C3CAFD0FFFF8F8A8FD38FFA0A099C2A0A09AC29AA09AC3A0C9A1C9 %A1C39AC2A0A09AC2A1FD10FFA8F8A8FD39FFFD04CA9AC3A0C3A0C3A0C3A0 %C9A1C9A0C3A0C2A1CACAFD12FFA8A8FD3CFFCAC399C29AA09AC2A0A0A0C3 %A0A09AC2A0FD55FFCAA0C9CAC99AC2A0C2A0C9A0C3A1FD5AFFCAC9A0C29A %C9CAFFCFFD5EFFCAFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %3FFFFF %%EndData endstream endobj 22 0 obj <>stream +HYo;QZUjoӪYZUu !xx=KsQ5o&I$/3cC??cA}!L8Kܖ;unk\/-$^k\HuϊjꬍVaUvOpxUc^몇P-a>{`yw:JQHuVVV>'{e1(FRl8QhehxE9Z4'RM:Og8\[ TҜHERV(\AqŊXK:Tk˵h5fj0ݳnR`_bLqYZȎ=Z-V:H;⯵G$5Eܹ5B?e)mN%i95ܨRKהS9*HrRBJ5R:*sYs=O T)EglN g*4ɩRpzU~˺K_ؓm#ky™Wyl,ڟ-jyDnKuɪ +ۏyӣiy"X7 +`CS:Q>Ɗv^@J3 U +J)Xø=ۇܒeRWոNZeZKVe:m1~9t)N28)'8AxG\qLeO=Z$ClQ@ +QP4&ϫޙ{gDW +O_0N2tT'.Tvba%_xEf%#TgZ +HI,$״v7S&uO]%+ydz}#k[Gˆ`^֧䖷x|_9٪wZx_RabhWtN3ZKujNWj)-kׇh#[e+n5d"@J-E-&S-ZKHbv 8{zLZc *?T<})>Gq{}ɹ+ښNq`"̼T-\~(YׅZ*M3 C}͠߀ 1d5h=XEΗ3 }S5Ƭ9MW +4N EnT2XG)9SڰTaSQE d"@8SdӓSFo{ 7)jK!tRQ-H!'ZJ!5T˩p<=iIQgT7T +W*k0,ɿ H b5 Z:VivM5:'iW#`3n괛(DO )de:[U VO64纙x CN[:H/-e𶨫kS;kE^ H[mQE 8MRGpHC?寐 tiy~":B +j } &lBz}KizuHd0/ش9@mJh{uz|hcNTvKqb^Rb(ILtە\tずۗ3{0a>JDU!׉(JjTK)\rGA-iV,>L4=%(EU0Hr+&bgHŧl+k+[ۛrzQٱ8QCZ8?AQiG5TTR )a)N9z#6TF#P+.w(}!EbHRb ]R +R҅-B!].G^ק1L)`;K!ك ҠJ@-Ő CK]0^֭kkLSA +CNRiboU4>q'ኆA;>=H"W. +|V(BЙJtL)Yz_TOQ-OU>XY#ӵMKE66,ł٥)KiZ afC-]R'm![*R*) ǂ+o[Q fwܽUhEb AZ-.-Epr UIw*IԀ_1ҳ&3qu)ԯ( 'Rxd_ﭬl?^Y +|noml~^E-N';}EXuXs霁:TxR:tܱiN5ml[[ B_iҠRR )ɩCJpj634 mIR/RMzcNzWseH!9BU&w ]R[EŐ8 +KZ8cT/(ܩ޽tlu'qG_Q kC{R|C؟͕ ҍAS4W +<{i4t ^vOs r}b'n{SJQ +A:9C귔[_r٤J@-HQR9 s ulxk>R[sŚ۫a.a.:Hx)Ґi: +*VoR*3= *g\~3H]& + +Ct(趂{ ) +½ּ$/N~_o,RO!im0s KC9ŖQ}QAT,4J_9$ 5 Uѭ1 o|;-U+9HQ rJ[ƥWS )a郐Ҋ!}S:lhKC o,z[xw"?b`]18uG4ShҖ*m8HqAQKuĥb#n_mu,պлRtRO3 t}s} w-y|Ԑ:)4WB_PT@]j9Ŗ9 Ս(H1`=1mKJ=9.`8 BJ-$PZPKC9iPKI[ B)- 9塻ANu:ZyU3d"JzG"HY6YJqlcpQH.%8$lv#JpK??ʌӕ'?!@tG5|A-V ?PLqwi4ŐVד4At4u[OA~#%iLDR,}Ro)4`ifih4Ko)ǂtY`,HEvMz+D^t~L>J:"RtK""H 6-bze׬ u*:d00eеRFc&@ +4\Hс!MJifLCbN1.QBJYz[|y- SFPE@ZTTk1R_..J)EQ*RMȕ𔹘ZCCr`֒*fXXT~ (̼8,RZeʟL7YĹ`ǝ,BW)H^ώZg8HvS;VBB*xx)ٝ` +eNnuNz5x+V-nH‹-3g_kgsH|R Ucw73+˅=`d"bi*eZB&L뗓vCMD(f Yhy‡>tApjdt//Ёx[[[Kp5lC:48Pҗ6@ +]݈:{R]tPas;*^bK-U(TL*}Rn)[XJ@-5[i:6ZWipU"EۥjuR%{4xԨ٢DQRSQ+BGiI@hwΝ;o@T#8jJPSSTb]T VTdJ E?ӾPkJ՘qW3c\rHWXcDQҥDN+(KAl!ŖBQ QSPH+1N6Q8E֍" IydW@z-K?kKAj4FsReNm:]WpjTiXvKT.?W@鳑vyF:K=uV+eK{]lS 3(oosz!HX[Ɩ--i=nhPtfGUzYTJCI=5,4@"h Rt(q虙:SZuFpm~&'ba*F"7i;#R-DѢ;dˢ ^ (Y :F| _@x!Z3H4FiU8"9*+}P;H!J֒dQV$E<) OqFX%[ǩ RkZ9]&Tc1rR:3Mlt_'#GveN ˖2tqY;A|dՊ!k|Na+VKMH. ],0jў +\ҒHSsqeb'cX:]eHN ׸rƣ ^^ni.Ѩ<!iG瀱2HRq&N/y[!%ZܥSNkVs AJ P)+VNMKTSR+ujrJj|ZmQ@7D͂Iԋ>t ItR9l]H-`v5@f$He{frwbfx/o*j@:,^ԴL1EF lY3W&M:ȅvi6^)ҏi3zk ?\.*vAAh㯳< = +DcOS +H[RQiGb^}Ԅ4gi$l].Pmjv45-595t9PMKi). %Qzj%eBo5(:dGVHHwRe}W_o?{D|?,Ggs2GBJ쁔 ^e&#!K5!LB\pOХpՠ:~lH`)|;|}a~LQ*ΧBE}"p7Xr' nΚx.Π9KĞڔc6K *uyq #7v> t ӆׄj(R9H)n. +iSZ(ZN2R(C߄;H#`Q Y8&#hUq)Wr2+l7DQDik0k@OjW>]I9)Y/mPg?u1q@b8ݔ[ep~g\&8*s>p@āvj9?8pu!q1<)E(nq<#dBT)x>9j^&5jZ?n"MZAZuZ!4HS˱W[%RjQ}s E{Oь""@/? Ϝ9?R''ϛN::,wo+i=.;~sa)8%f˨sȲjWw+ +D>b0gK.R}'E0d>udb`V ]s [o7S+IlXRMRXn5#3ѥK/堄DԯʡY>dk$s>?xϾ~3^c(w +OE5 +3H.*G_(G / i/ߎc^ +ݘd>HXI/qdqJ')d8VxvϏ9J^>ಮRD|)@fKׅm<~Brf?U 0dC臁hF u{Y Hyὴq"15._@*EI%<.Tϸg3p,,2faQiQhH,Wqd h QTIXOdO̫{;OWwi瘜CZ 7Wq)o[1Q3m)mc(GLDlX(Bx+ 9Լ[i6E;C{zpyp[UZ2ɷ?@2Zoyl^jM|ʊ5()bRi0o=3;{?'iHGW@jw`_r#,&5K9KzhFqKi,&\̷acF5HJ鍖6t%gi-&a 3T)HPt_!Bft?00̈blH*+O8> RTK2C&`heNY]gT؟* -9($}biYSwHgwb@漼ꋢoPny-{]Q g-s퍖N#gȪF.8nTLvS9ԹcbW42D,i6&./G+6C Ls!0.RëBsq,*5}ۛWYe1܋<5}Fu&d,5RYz 㔧vmmou;˶U|VN78ʸS BV&i-#eE +b)vxdXM7?}~HߍJ/]n?鍢i52!%z;htZo;픿|L ]XzIkQY@ʏ . +j'Fʯ$e@i_|XzH]ZxOQ}эlƒp`韝3Q-4u,rC O H9"*YX:4}n\OR +}%<-=-({47= ~՝i%}$M>9,)]YK2ҧTbhEQT/%I A>8V*r*OQNQ#ǦaN1ub~NRH@$!\˘M(l<̳Frc;RTöZR N*ӆ~6ZmmSfd*[vt}A.zESc;b7ݸ]5Ϲah=$UL;hS=y'Ә9`2VOn~|OQd\8rtXRӽ'wH'U S^;xÌ*p6y8R5mu+ 4F3((j^}ED}#)*1Tv/,a)L۴k\6 헳WE9QU +o:ًj{OQJwk_N/Ӛzi=oZ/qODE?oq? y^oI5aRߢ0j~!8,Eٟ{&X7G}47޴ R^ԫ]jFM9tgJ&$iBp16G9 (MH{qDiڋjnէ/n)E.sSX\Ԡzt&˘'lB 1R&)XY:3,M8"(>q+Bߪw{Cʚ +қ.Bkf\œ'F8E޽{i_\MO!.^ +AvhVQ?{QyX2BRmto#ڽ`8Ah42]$w:AVKa19sv99JDT3A(ɭ ۏNIzVQڷ/ L4 9H7d|K9\&Vȴ* M>J5@TfQ; M/B(;Q;*ۡ +ЀNJnwYb5bJ4UxE+=_8A +䕘E ɨb i= +|J[SBՠUG +31:!0gʹ&!* 0ZŸ OĎduQ=X*Yދ&ſ.a)VMyj=%CZq#Jގ*P#'=dKu[xxC^"Sz hN vHwӡ߈2|ZM8(mBHΉk7:y GlYΓ(a4Z,]2V3lw~4<}e! ERR:Mz6?<Fw9[;d6[O` FlҍyN;=2`̲ˈ)H 1HBh;=@*)^WT# RdzbpLzdmb 0P|_[zk/-?))V\oF(>KsIIXfE,tHEFLU8xϘl'8k3!_ ==Ө~hZJ#}U:ckFW9{|:I((^#ރƽdiDL;a['ၺtoR 9WI!P,vsOQBl /#$TE5~_[v \K9X>y}֩,k6<R!dz4_zm~}2U1xb<5̇ϬGl͚ f$zEi%Y.i,]VnJd.4=Pԩ~ǮS5*Xjl*(hA + Z7SGG@q:O[»q ʿClc#v{?4e?#en&I+ȕcq[XP<UXN).7=,ȗS~o+"g0hR ՏӶ#Ӈ6$ns^Q(@*q1k"OB9F7neZVݕ7 - P߿=T_?]xtq>7Q JANI UB1dE ]TӺBVWxK gPG>X9-^c)U"ǓŴqNU(}7x!G;c-ЋZ'Ǚ`uou5w^͓y/#X{S̼S)/jduwݰ-zH #PuFM?ޏȯצ4b%/vFz6-*/t +Q=W.O=u8`SY}w\zߩ"!}N^PQ|F51,Jsq'mv+k@JoK|wU'] -EC$qT0Ѝ$/”2wDߺjbc~TӱmC;G1`inI*3] YAq:xS^a>?.?70TYO]TdW7MRCmvЫXG!kU>af4O,Ϗ-YR> q +M1P2-c,Go|h/liŝ'Y ՀMտ8gz\mxHr +: r$Nۙ`Z:hwZgFVS2Qc&+A0-Y~ᇯ +;0oy??'*QRI?Ϩ@*YSvރt =휜60<^|)Rt%%[%fآ~*ԒϢS_h|FaHO$2ǀ%umKQ5@f3ԠsK3Ս UW[ LƮy AsNAgJp]H{Z*&mqL䴹QeR-(B`)яBCp/q`)PPjʋ$^r}XYwIв&Y:;bz=(*HK}aa82QZڃKӶ9yf?Wh2MR]pr)vZ.9rEFn6tR}߷ŠضW!iIB~{$ ~lɪQz 9)946H@*5)~QX K%9Ԍլh23Ѻ\$UO̢C볫ZFM!ë#1xO7<eM!Ldm::rBʢcOmc}ϾZ, Yr*CMJv:Ъch^!HbnAo/aDNïOvW݁;끨HcrɊ~O-!4~GK%NST.k;{F RgA#[f )qTt'"IgBP'cd +(ea yQo]w)E%~(J( +8OeZ+Iu=M6kgRmf,StWR}~N8 +>øA>sH/2T(R +.JU'H!H C̯[7z ߶J@q|OWd!*V $?)ORDày|㭋h +7~cvOJXK\,Śym;_sW{|MfJ#ψ#ׅ`7rEp*Cz[i6x0xq/V3`[ ԙڋ ɐ\lVZ >rjSTQv*i(K (c7|2QpZr}.ꧨ~!>wiRLg rugwgEZD43͐B 2zYm f{LKRmW3EL 1 \{qy)r^^sͼ`uuH)‚z2&Rv 邘j|>娅D16֓WQH@z^y:uJ9yMJAMyB} luT^#W2+7 )*iR!jͥͅe+f,~wX|H?Gf{tFfNjɆ @O$-';Q.*2PV}yR[c)VxHܰe Mq,pߋQ)\kpoIb's+U̮,5/³Au.Y_{,{H,%CN5ތ'v>˻v0/)Dr"=]k+kx<έg 1r+-Ktd" bA DoD+HJL]l0:gg<{s~kTB}B!ha73Q-םǥԁF:/yZ +HIIiwǯxխ=^#.LwWQE՜;xXw;nmKK@n@׊y,PXw"^!moo'08!Tҿ ކTkv, w,5-뗢NPuNP'R`4Kg‚;t;'gULB" ] )2 zwήP/R+Ii? +W.e-|V 2G1M/[ @b!&VQFlFi&!D7 iR iyHʗ7yO=‰|Q:qkIB Ƅ[p D+K;Yu=gy^'Ee +(_n=CiXj$'E7,uWNvu=

    D0]=@q2Rٮ1h)mKS3ۢ ot"ӱ@(Ke +jH-W+;muhԌ/k*e[CQ҆CPT&._Ob']-vyiZQ 56:ȍj7!6T<A5/Q=zokSiy@2"`1~h4Jg5OM1^`;* tj#r)HewiiN:/ 4CQ= iRIۗߴ2G<xC7pߊDbn_%_(/9ZUǯMb}ayt?s|=b8bxz~]ٲC]-}H>}ߣNTOx $5;&SD2z~ ]Y]355|~GCH5&ԯz6Q'T, El![B(Ԫ{\aeVɲZJ U&MG3Q{ #A >^p'QYr5GiY^> a=͹я8jg0iF^rqPǭ +nRRʿH/J{r굧h~$=(Oӎ5m-µQ fǐ/^NyIKtOMe\,4[Bi3zY14EWC+r]ܠ)tŐe;tBl<6FrteSJM!LVk׍놰J]x3qhG1HC3aH&q"0A9JYpf>h sqŒq 24nXEm8CrCF Z>`=`l)a2xHB_t{y/BMpTp +^6BuAf4؛@3y7la=#(cV<ړ44J~}7 +B)NrJ=Z UR-T'N(X!U@gvnzI:5Rjo i8K@ʗz]\JjdL)R-H/3w澄Sw NXɚneǧjyvĝ^@>I8~MŽӋ1s?i]TEM̀6AV7qO봩e_ #uub'@ 8F ]HDH$$o@ⴱMj&oS?; Т>ܓթm3ڹ\4 9?0Ÿ\dm'֏Bf/R4g<)iE)\әrRA@ +l,9/^6kRN!5|rp} ‚ըMV8H1qto#۫/yI1긬OGLhYӀ7X}tsVb?rN:95(Vo{8 {Ny \i FԴ>'o 'W )I[O^[4c\~|f\.N5`F:ry) W`cQKZ(e?-TP +r^U#bg.y.$=" +[d0"yZ:ZN*szud3=ݺ6gTGmY.KL.ƬsLqb?{e#ɩT36~j$yl:zq39//JyyY rq_)IܣYx_3P=qňq覾S~}ɾVu MeײҢ-of>_ }¦r*SG[TeXŦF\Y\\T( )ɐaHX +)FȻ"Ư@j_^d}@Zځtguӈm5Z]4= B(9 +zc|ڮk>փj̛OIf!*ɧAQ>cel]P,:]j*0nEx^1eU0.X,"vB@NCBؑE{T9ɫt{LΉ9' 6ܹsMHuClh  ]09;#8Ro,uK9e,n1 +Q#"M!TJJV"iTM J5_'R}^g60(ҌyAN w0Y{Pt}g 钿C=?esr0j͸!QԎU.鎗]݋2@zY]op+ -H]_Cu{kQ7wRD.4{ڐj~ƪO27dp`8=ͅ˳&Ct@Jqm'DmG^LsfЪJm[0w§e |\a_p`9 'Ҭ퐊4,Ϥ~.2 7rT7?_Qc]?^W*jLNVR-:eNG&!ʤL + -4ev?d8S/ǟyŭQeU30Q6 Hϒ~/  I@^ ݏHj>RXq߂]SHsAlI1l/I{l90 ~uRE1҂T;&#)L. Ʃ6 ۜDh (6bfFeբ|SH!LjhBBʩ!wDiuvYXbm{2 NJ1!ۜ.A_RHIf +Hh#` |;H9Mm~g Y#Cdr MERJ1ˢblR9>*&@w}-7L}|*48?2I038Y\k8UuiZsj.uŭa{od~k:$B*Od`H;9nxx(zW^H.ͪ%ʰ:d)s]*,*4]ĘV Q*tB+:}a)mﴊT@e5_-j|AZ <)ӘٶvenMu"TԒ!Myb8'O(or>O$NvRnȓ7.+qnH|ve}"m)[%_%_]=j\|߆37XOb.e24Miζ\u>2'`MH;]SV e Q6"T E +KMFpvN544pwmy?%RGU:+)#Tp.jm.S"&G}(RD;L./ )CZS[)bR_4 CiHHi8iu*c%d۱)C~դxdiͣn.Mf{-kAQܥz- U?Rt}@5+Y'_]iU؂2) )9' =J_)̖SwVDfv aYrxjR~nqR ce18d*YY1xQ\V(;}ⵘۻ4Tμ,iUs^pt qytDMd^`%ۑ-9t0cdzHʐȿ2>"^ȑ%EJciheἺͻ&JQs (npbc-ʹXy@^aN>gu_Z-{NNtē遢p\ڲCUuJ6Ĵ m4!ͻdHה5!l|!բT藑"( +l2Z###pz?5鷖.AkQ[,CjZqi@4}4W(2FFmRoa/eH-fCi,md:uMAɯ4[ zNV{jzLbjb) f` !r$Ѵ''+6p6]]m^&8峿=Cѯ97V=~έoqBGTBڌڦiRD~Bz E]VI\?1->|#Hǥ €ģHk/޴gthQ@.ڸ U㯛r"%-2}7lE#iVEM@j\~Y'ln#l 0WSe5U^'{u3K?ҾGw*A)ۜ%? ѩF2 9Ñv "Rي2LRݻwwa՘2ZfA:t3N?)'hu^ux.Q4}E0C|T(\V8mz2*+[MY>X(9^`K!kZMl^@Ycm/a #nH?pfjy&۶;s}fs /Q񳷡 *c6L SBg&$ĀSHC(r4B]N*KKKw܁opR̮D3Ng~-elLd*9Y; +V-UZlsBTmrѢ%nH1iV5|:TTŭEfU5N9v7o+)1f?'`S=;+8WA8yLXFP#sh~+RmxTƶaհl/c a#'72*b7Gp> +H0^qS#}H])m ]a,*q*p-o_bB+F8_`VWqOvh5k9ƃ>stream +HW]s۸Cf{I O3?l6nNgZV< EYr4}H3$Ž88|r;DxQlnM^/mOM/ߝ$Mk{o7/I\l='4_lw98F£lkY]&Tbu\ ~}/V7~yrj]r42O]yz}}ۭlroΓl,[\KrvOUXvvME\䕿_,?"D劚+ B[\v-aBj.Ŋ?{uǥWZ bV Yh Z_څg6y?kZa~򚦩O|_#K#̭t1?z +3}8RHX(p[-~vqq}l#Ǒµ/ kverUbof>[}46nmVv݄2[͓uMiXͱBx=q}{G[irqv1ǖ|F/gYp%z/ImT_Awz*tWa| h*,ď춛'7 #;Ǜ2sH 0㷛|Pg@v>%PO5nxڊ;B2l1"$I60hi96>W:(--D.99U(%#Bp E+P*Fq\1C'AG.<ê!p/D-'G"i]C!xw`n~m +9y@v!i 6fl)'R_iu|݇a"C/9{q]fw;@@Y`wvrLYƼf1ӔraK>d+PpTd3ECppKtOs5:&1ʈjD= ,!pxLuCe:@}CpGaL!&G:柅|xRţ`Vm-G{Xc/GMn e[] /ҕ0ezczL5^\/W:,`+x(: hIHKX4YVQ`. U[[W3_e7FKUwGܼ Ψ]#N{q7 %sF WWA$ (#ȕDNC*X6{\pgQ^FlkMY'h'\%ʋ@'=[.ZO*ƜK؜1lMG1l +!Bt +4"n CG{v˫*d3xe+kB2@1C\hE+1dFVyF8q|XZPŽJ_<;A *"+:c bͮ1WmGUSpszPvJZ +5-9- JSMJJD +x4:%#+!* EO;A?xÌtn92N[DkEJ>Ig+Rfk+dfJϿ|l 9t-pc@6p7Lw6gk6&>`Q5'k\mP;ULE+AC}1nW-]vqg_]ʱ+{8kky볳.g?-7-+uⲏiA{.y9(Io243 q +ղ8sI[jR[mAS܎FSk8`a/sFKBm1c4Bla{f~{b |8](I2R@f:,<};2&m#9^9L49a2896Wp΁1lp NI5jlr8coN#4&la3?شAS9)ؼ +6XNYp-as N No-asOWlʾ!6eߘu*جC69l(u،&VlBI.[v=h.4wC=>}uw;ڦ}hדG<?Ej?W`7ZKazp]iu?o/ҧ_Kx?LJK]2uX.3\̖b`N^-,p5e%ۥ6JbQK sJ%r$EV-2l,2uІ٠:i`\ Ӷ(zK!AkSU]=<q5Z^k+X:4 ml*}eOz[\Is{j\n v.+ rY^GvM:j-Yj(o7W!EU~y+^_wFxx:yD^6#7vb ePu=LpU[}dM +I!bVv\\yUuˋkGW%>ɌjpSݵԿ}7eO0>;-f۷ )i&FrlC`<V䮴 kiucz8eAB@Zڢƣxõd]y&0gc6ƌ #@t45546X͡ %X+׿SJKJ7e[ W:ﶃ.tЬ`LEamcᵋ/>t4Vk{X(e],M63}¢uG+/K湟GO{F;{T]_~yg\۲?yCyÔݾ ld/[^pqw؅* !|Մ:-<ÜZf&+V#pE,z$we_"ryg\aǧ1v:"f$IkEڵ)9TVQHWxS7 +&Nl66)$˖VGShYԼ9IlM4ڿᎮ{"(mcVwNиʑ:K-J-v66vSn.E"dx~gZEד-+Mh?U~gQoz~E~s +-*73!mt:^gYͨ]VnFK߾%m +DwdB`5Ӊ9MEEtyō}mH "P24y!l6(ֈ[C=Dw1嵖yC$IA4AeM䒽X#]wmՉjo2K'90 &c'6 0G~lbfm,  h9]03?B):FbAs0dT J (Ƣ:AZ + AGVJ bvZHˆ~T/5mqeD;J~];;"m A}s @W 馽nZ;X}V]p+p,gWPő9SΊK楝r%9Ev+;]94alYo@ZLYݪӛV򖊹(-\+բ1ϥķ/QC>Xwb$R҃]IViլ6;JJzXZW'Vʾauj.5g$R}Ma58ׂNYs\˺^ԣ^PK/9FhwVW(Pjl5s޶ުnq*^*Y|Ƈ2*ZpUl-FV 5އUF\R2E\BHwРi3ÂY;]to$K37W]m@ZvѶk;EX(%Ԇc{zH +e0blND% 18KLb$zĿ2n + Ν%c8'|&Bca-I/JX$Bidа0UӺz7-meザuO7gB-g.+ +GZ:D^p ~G bj:v8#{ +$x;I6ᜯ=PCUSwjf6@b2F凕G' ytǝG#哫YͪIGosvNVe*a4κQv:ILuxZxk-2س7e{٬$Ր~!!Dp(#KJ'BK#t7b~eur 6c]y1iXc39_=e~U6+F. +|ln}vnS؃ٓv+m4l(M}6&y36Lf +GFߡ%HFCx/ y}B?oI䜏J&ywl97i{#aԕdg'z6!$I$k +iHLvK&E WҨ5|*5i>9&v3(/L86,zQɨeK3*6$lܝ`֗J* S𴃾h^THꜤoWMfwͩFh^i(5tWTw,f=Xl] W<3U\x]ijN L;}؃ {ψ+f--sN2UL"Uʚ[\,7{DXBԮV`Nq* N +Tj\9)U\J-JWo$9;gE3Ԙ.ɢluK[wf PSXSa׏׷pݟq-޽- hMG< 472tA..~jJ?!&'ǒlEiC)I{(Ӿ"!ə+05wk-]]F{5Ź7cC݋&U +.Nh^eAS bSM%|C0(q-Ұh9F$vJL3} \{&͠6tgZniwB8 j'ھmxS#ZlP|~Tp{gصit=a +zWZ.f_Eįwů?{ :̖uNmtW6W;{ofOD?p]R }'F%_ځIn(WB`2J[>C'-;G;.?~3fkᆭD: + >3 g7A:5-ەj~ɞ4`},&]76ffZh*b7 "TLyo@4JS``2K 1F۠x09ZX-K>&Eˁa8j)5…B a΅!+;VV*/+Ks4Mҡh,&;jM5eQ\/$%" kz)ۤKYZ; +EC{qA ;/N^JE8BA dH ۧ8K7DKYfu8gr^׃Y~ͪQ +:hi/{MڟW6:W_ޥO{1WK~zノ"r%S/wg_zkC곊:^뭺8w{'Ƣz|}f;յoivaj,Ux2-{FAmlNj8mؓI cn\x%z}-O;ڋZ"I-[[:HSV.[]E /0$h%u}amUoǓuś*dTX +IۢF 3O;-vW*GrR.柮=箿yRVN -@%sWʟ_\'j?ԾZ)TD}?_Pw?4?×ݗ=z=s?ZluSq&9KWȏ_=~G?w:n~yF)_zί'[NœRaѸzn;n^A_skQx|#Ј)fi.uq<0gT3NS4m{))cJ12֔kx|;$g,)P(Fa;͗؟B{c5$.0| +p~LN8JT~.3]V?չh=QW8@_F]r۟]M3N*t +>K.%5Ў)-iDoFy\MEmHX^ bañf*6B6-cGEAs8g73jMԘƄ{b1XnHxtoS±ܹ}F+IJ][fк$}1 N<(ԽGmx:@&V!{K۞v-Pltѵ1Ycl +Ѱs`竅y2HXѬ۹)l'`Ә UZ{'Mi䠬9 "r!^|xPl-ztU1bG @wE:'kLK{zK=: Ac!!]jW2@FXLQx9^sNXo.8 ]NGrNPr:P.N;]ᱬqH,Iotv9餋w:ƴvQx9w:~`.Ӣ|!ӽ r9]ᡬJb.qxCnr:tm!mAc/}xC,w.^N]GNXt+([NXI#EXkuѮ1\VGm8glՙ{(SVXHiLNzS,]VG]eu<Agu\/~!=yC"-V{Y.xcnpY45Zsꤻ:eu:7:y欎^3eu:>Vi8crZ5iu!gu꨷Vg~8"a~:5t:ڇs\eg&PȧQiP29m>4949ݝ<͎8~YK8VA86c8Buz\iDjC( o 4Vyd:=S>=.w,VON)grϒAkm1Vgr;erШ4wݙb11.ѝ1L5?׺chN.evZr9ꔚs9rt9ʺ'rzd uf*ss9f!c!qEF帒pwKqv<ϟOc&4wV.nrJ<䔜&Gj>M ]js&YJ;MN`ILNO6O jMNf5G&'irq3azWR[p^! \ +;p W R[p^1 \f+-j B5 \Ӹ+B\9pv +kϒ5F\Q>&Wɕ\c|\v'W]rE\;^ OJ+׮N1>O;}7:[F@nU:uyn8t5?Yp%U6n0&#x[3'@`jM7S1Ԛ t<<.k4!#_ti6"a6%r,l>"*5rI!"^p޷f3lt KwGk@0/3F#_Fl#_F~"2¬ғZ2l6e援ɗf#ZNQ#_Xgzv>fff,e@q<ِ%c\lC=] s89ˢ#fS3<0n"Q%4pbeoVf``UC#S)k- +~>᧏o?}},@K}?}_z˿緸?^W|۟߿?W?|N#W7Oo.?^޼qLiX,YxGsttZFw+R'}cą68ɎZ鸮c7l\g"ΥXdP'ㆷXpgB:Qi%Qy'ι[e͉0Ŭ׆xX. ̛<(' x΋؆h,N\ XwQc9^qU%4sg9NXa/0w,<rEtv XKjd9Tűk#Q˱4ܐG2Efr,Wc2Y\`ίiؑGq9Kl0n\4PlٜQ xguGr r\0ε|(~a'rNX㱬S4Nz" %/YNЫ@kDK _~NHVJ]Z'=,G%)%b[g| Q\Vd==ٚ魆\p[Ӈ2 +.Kr~qYz rYm^/.{r9z jGJҧғϰN#-걼Lч"b+z裨/E/d:51k,k>B,~JAG+KEٖgx2Z,C_t=X=rj2bނggzn.C#k`興 +muކ>p^/97,7@v!,_֟ԭ !:nLcuGQmP\f/*uKT"MvNZ +tZaдI|鴔,+uyO7{L-XKzRfmFZ6UX!R֢LZJ{rjtoLG?Tсgѵ^tTN LN+jԲR7sJӯMR!z+Sj^od 5#2_qkjY㙸B- ,dž +uE;Qe4ͨQZ̨ .4o;Ì=}F5kZ6^J Iy.PjotwΨ18QcrfԜnQ˚S6ZZJִۨmԸEשRKs)5B2$6Թ5p5:T!ӷQKa0yԳ5qF kPԼF v]bBD@F14uJ=j3JYS':Qh9ApGȇ(~k9,E ,Z臥 QY*uɳTֲθ,T~آiT;3bJ:0T]?0E(1: > S a0s-RmMSlXű]2bڼ/篸Q:l(e+Z h(L#)n$GR̨sHQ2^ Z@ZG)RY g1aKM_%1jwXEFs7f5Q~FrcK-F5FqE5F(6K3k؛#F(GQ4f1J8/ wEh\/kCV!v˞@Uc= =C|kބR&PZ7*~ᰖg[AD'Ƿ;uJxꢵb|&pMoB3I-w7cD7 oG6G7<`*7)ӌm[h: mS8C[H&u*Dԥ&k[6j@ҭ6/ɊN袛ǎyMDIȸ&ueInte(mP膥9эFM2ahtZ$bP4߰ero(on V=US7߸ o5avM6M:r6M:d&$YohoJv|csjrd_6\tC2ppF8fc pdPpDcd[:%حBO6ź=ؠs_ز zyp,UV=qdYLPo0=ߐC-g +;/ׁ!9ݖPή{o(ZrE9)zʱ>s1gk>t'{t'CdH15ޖ@7tt`nPИ{p8mss/Co9;=yox5PY=_7EkЛ̀б8 ƃs)wg<tV!}͸!+^;D,q'MgɤO:yt;ұt{jyG茖;:;m'7گkҙE캲C:XSlѻǯthVY?oH ؓstұlU|:cvU}״<'*?#>tVWpL:8\;c=]9GawZVU;S98qNq;{*C0S"i˔C}eS:} P˼;L~Coq9ԫΡa8^K9UsEؓ9bsα p(αsqkߞ}uWgSc*g ddc=ƮaMr>o? ws +>9suaܺIA/u<+c+>oԱnNTP˞ey\xhshԡsU߃܊1V~Q%Ճ:lO})gfnɇ0+VPwJ +.W'sirϨXSpzEkx̭dq'J]襙[QfZpV[EL,jCjdne] ̭€%3C=۬֡7Zָg0~T՞:~$9[[M3ʅ's+go;@U:92-;Ƴ6'2;|̭txbQб>xN{j53#E%:\ 玽_?͉fkV5a0qp#/D(m~ࡁMxOGyLul===6f[k|!|ygu_)ۜ}\vK,ۊ5Jy o9Gts̲gdwг'b,/~wQHR,F2d/y?J=>cI3IM1k5O>F7qZNyL\ʓO"{i+SfϜAzM<~f0>=[-xcY/Xg|OyXQ*<|#6.juJ7`6RWIRYe?"eK".p k#c!Etyl 4HԝsMArMhL&acT)bD-v@++ +!:o,T5^lp0";c(t"dMk1B4z-9B[pMKҢ8h-َݯ9 8G;QXӰnm5lGB_!QLڥ!uMІƱF3.: B:.cd38L$$t%iy웨U2'F95ex5g!CVO=+H\JpL:}#L)L|E(cu&qK&.f-u 4Zp'@a)N_uV+Ӑ1tFYUU8Mj1x!Uw4H{Ysj5YqVAYp;ҲkohC0%y6iīg>lWQJgSA)4uF) +l~P +;(LYJGai䝕K{0,h:P#oSʜn2)}Qy +]Fy, 3vo[/7Pk TЅԄ 4ru 4n鶀JSi Qi&*tun<.rїoR2W)Ikq*32F#]4B#iJCL)0e0[L0֗>14-aJm)$R 5rҧ](Փ[(b7T1^Z zhƾI]#)]H`?I[w R&]7JqHHަ2C> i\@P9JZz8JmO5FsyG(XSN9e˳9PE8VP8J8bz#8$8|!NqTqÞc\8M8.jN8Xـcx VpQ7uMe "]HwJn5vksSf_ S^(V(Ö݄cbp;7X,`Sٶ鈣"Cs6'm2^N X GdB5qqOkqB(V7(k(82/)qzǯq9㈐fN|ZGt1NӪ3+bӚHAgr:esA9eCN9U@2g/)ڦdsȉBi\_(nqӬ;CeE\%Ա"o[tHH:hܜ"bf頇)]C,qFt;BpA`FN:fZ//c'R˻ybcXwOXG>stream +HYsX$:,d:IOı/c0`&@lIƘ}_Ig*Ik+rWjjnN##=o| /_fsѢ1j%iDgbfc#Cڽ_c}|, 9|\Kp,fsGQP(J\-WjZh۽jWivJ)Q'jڮY$7 uJZK 1;H7D cdݫHsЏA]/kԭQ4}qJ b\CGfau K%&ysv~̄ن1s/b$Qyq05F&F9Y>x~r#z"!|e-2J|V 2cGv=U=i[%KƝ%-1% !njEsLD, \7H`@X1ͱ(qi>0odr~IB)&aUŐyR\f+y;3$QotťޮW6G?wQb96cyqiI+q^^ԗYOC}GtnM׫^fcO kas?@vZ ̣R Xb;`jj\ ]NbǰKE79}\wR ;ӈlRi/`V\W V:M ۫I5inlZk8}ĩ$ ezkuxr^MLjq@i!]lւMftbn ǂG$$r^^^C +׭=Bj0@׃))U1xbYElEjW~$?kV~`wa8;#i˥!-)ҡGs՜ nEA((Eb$O(J)DgϞAǏAћTFHZNUT{)P"uyC$WEQ:rudw=ZR1 +)HyK6ҚMjQhzUQUZjA6SdAz)G3lRJJHr"| +sz8MW[Hמ ) i/Lқ~†* +QpA/z H)Ҵ>ͺ$$lFkTV2:)vĹFgLm$ixnKut(yH9*RX>I٢M;oCE2,bG8&a2dIq )/)}8 &U _`rԦ@QԱ6ņS+eRP:0aYj!W!pV/}3H]-jbn U"b0QAETǪ@hi/?6:yİF$5JJ~Z@ipRLy^T_[idy[I2y9tz&=3bt"BPQ.ւXaYEP$j{N1ͷ0fw)[E~ZLc +ҘkǦ@LQpK?52D$.׃`-wiv̡c868s,N?DS"t=w/"ڶB^aap^ٞ7 4rP,4-7,#yZ;16Gʐn ,ӊ>Q**Fhm4EHrT*}HGcjLN٣3EK/EPQ_K(q4 O!fٯChuQy b=*˦mUR@*Z +HN,tV9=dGlpd9U7s3BnUɿsoVt)$7!җ?-څ=0+ܱԺY.,B1NsR)|*Xj ]3Ay}׭IԨe=BVC%xex _R$=dZtEaY.e\F.%^ mJ89/>{'YJbMZ `DPױ:9)H9)xo{R9k;C[k:Wec5lc78p&X%fқ)H )2$2lm/:N9ϰ24i"i-[ejA:ahX EpS@4膽PB bȥ=@ +!F"34KXQ;aX8 +!Trs0ap*K-TlcJ dxYbů'\ԡvݟ .~PWDž?0uz?P9n,hs?ꅓsiK2ܗա4> +?FX@N+DQ`Tac(lf%TP<{ɓ'hG"j[krXPZ@u:N[*.G9~7)7ќMY3I[}hUR->Z]+U"V!0nk0Vu?^@%TybgЕ믈؁+!ݹ9~πH i:ZzQn +HiªeiiEbQHo;{{Ugذ}ka)P`gTPYӚľ5 NKbV +^ԓ\srnMز$1DUuדXn.Q\4l KVde:9! P—UzRcGExw|MV }ڈX!K?C=zaAhxgiKNac,Mp6dy>@*QDR4,,u8Ȣ+2 >*~ojEM*!Ne:lTKK=~梜^$~nv۝n K Ѯ]V4ʊNi;%)H=8T7H*o6њ_f_?A(Z(XОeLR@cA[ېKW-ͨy*kGt)g'Yz BK^ [)XjX9o`2$$ Ej8.E#Ls];^}KTҊ4|>BLj0z9Tom9fALȢșA,rߝ4% +lfB@ռĤG+ BZ/,ƚ4Әe#uwT'b&E hQ͠tE"&w^& "OAfS=إ!Թ ++H}Xv& G|tXNJa.R͓ZfԸϟU+ uˣ +w Q9 %|Gg{zs80?yV t]"vvBG~Љ6m)uBU=A(_li,%71E34frTNҌ0Em5<]b@V$b|vnMܢ1,텀rM ;+pgecܛxWbh4-@}: +H߿봗B7n\vTeR%c+NZP?W,%qLΠlVORJ^?U+hRSoNV;q`گ1hh{H}B?3qqf^益x7<׻?^oEtNe+fC3TIˁT۫"Ġ f zayQA ǜME<|E-h0}5RA9 0m&]7{V_ Ũrn): ș9yHt]T& &h3U%nL  e:"jNu@h{QA%.%CѺh秉߻:\%MF9РݑoԛS9\JP!L:hN({̢b!X)zVݬ Yp()"،@D[H +75Nɺrq[ +5Vf4z9(=O]W@"C@ +Nwvvnݺ +RJn }j H5UpvE^iyCPf29袀JVIXV_jtlPVunݫNanTgT=KvӫEMÈ%,݈`DN[t;Jbz +p1a +> +i!D] %ÔTy@N~XH?>6 &Y6D`88^xR n߾ <)TH%gj +euNQS|D 2hA "^jRFkM2ţݚ)|kX4N[&k/v$uNStx4(tQ6BieŜ Ik'̴ +08mc@Z +%LDԸiX !3HQ9H;2.Ptqچ X9cxla;& +ys^d +1w#Ӽy'V(,hh>Yd$nYT-w^:>+~nSwoe%tQ9~:9X߂Iփ>K&)!X9Nl,u?V2z'3'[8]AQ(!*3xju;ӘtfYY!FEk?|-7ʎW.mFI<yQbVcx2lg$H "M[,dou9Hz.bY"HR6R"C!j)Aqܻw@(8}-8}ӧOQP@'t氈&axؐc3ul7꽨g-662[[;[[[i cjT͕Jinz_~crg)6d)V]|tmBw +ZZ *r`Jh,hUy!ډϣ6@zc5r|UPk59.$KG#4nJ ㈇T7}X ȴaQ'~G!oim1ь;A>DP<~z-bV<4qcWf@4m\x. N +"o\3[;8Prtr8( +_333BϟRIQĐ+,+E%yמtw#;'AZOyz.Y8"n.&p6[x'gY9h <)GA(\tEBQ Et: i(D/B!Jǟjy{F9ۨu:T$I&-> ͗|U=[w?DKxׁɆ.r2%%D1#0nf7A.S !#WkTmׅ#^&$l~;b̸o8zׅ">_.F(Z HZu-Q .xj 7^uRJ +ѡ +2HڟO. ~1N$4NYDzĠh5O/l6v3ϱ0 <]JRQQd`Lko/_ٳg#$Q&HoE`{^E3b{]q=MI? W(??T5DKգJVo6vT^x[G+S}[hy+gXI]_eEJ.%Tks4D)V/ЪA ]HHi(ջ)@%@AQt) iJk%xC4=>iTơCW(['i> Ez"#(CrtK =7T>1@ѱ P"eTom>N +~s7M߳ +,S7r;>zkkVo™si4 8dEjÑNPVΎh,<Ԣ:` C++?:j"]8pqW#v%{2U'dbr@!BB +anOŗ* r) MMM*aKKSWWݻw~zCbz(R©4%-e\A +y®`LRHә<,s?o #miZَQBsNԵB*T饖J +sTR9Rj)S,j#![5sv:J$)f饮J,RJ0 yAO1n:d$Z*Tԩ0p%QB[R ڸJAFob'Kbs~Z0ǝ/>ڛ(={O'Ɔ %/#qVnķkD_IEΙ30[x&3)d*) +G( ҶܼynQ@k 黽}Ѧ1X4u@1)ś7;P4̓ť҃;V?yџ|ac,Ԗw`Eg{mɺ3,.-y bN ES֑-G*E H)TfR&.$RSrQTBW\ԺHQ[*Wcn6N^V|j?|?[佚_vu ♻ęKig^.~abw6V~|r֣Ʒu9L,Al0V -zRj0QJ E8 QFP$ ҞihyjJNi?XC*JҁjulX u# B]H(i.+˸$G?8_ݚ9gϢt]ctZbi*TNjrT$"iRKbPFpJ QHk$@-?.U)6(uz&)di#^*|*HCKWxE|T1ͱ8< +7m.$4"J 3S鑝QwyZ97bʐEjZ?F+ 9P'"'z GN ? Q!?RJqRIE%RQ@8|5BCf&i b eH B&9~+ğo<CC +>t}*9V=xvҢGU`UlG"^)RRTHbyK) +XĩX TU)Y*^uETTu|T +/pz*)=aQKxϧ8iڵ[Y`k:=Hli#+4p+s <"=]森n;3j4a7;ZNo[mO Q@#މPE)bE}}} ~6GݿCN+>>#ӭwTiJ8Ef8@#(~[Pt.[ q'?* +UO|r5s'߾h1ƤuQ- +>λ]BrK%uЬՐT +B*tYRRŜRK7uFrKŐԻ5哧dFJ8NGwdEsZFw8!%hpVcEvɯ]ql> nMo ne +' ݋'g|/C(cu :!$h:=<DŹVgH QZWQ/Ő +R?|uH^oH{ .`k)TN rKv?59p1Pt(JFS =98@?:O;knYd+LgxtY>]`/bTŖ.մ@?Z j:jDO*E hiHhYYTSZRˆ֓vқ6攴>ΠIwyEnsSC8✼)\% vHGufn>[cIRo;RU:dG);?=?>%_y%aOQG.CObgOMQ(;$EBQC.t :Ni+QsiQUY&=y֭[w޽a)ziv*TNPx$Ptz&Fy6Xzo '>|\I:{Z44,o+6e$kZ6t +jEK 8U-%H RiKuBK *k*.;fC#1 !š*A*TNٝq!{CH5U)K+Zҟoe 3!̤u!\3Ndݥvc3;9Xv)"vRpN=JeJ-+PKUI2E/%T"PRZ`<{޽{R~_Cʘ叚݀Tҡ\8Etj-bwFÑhlb&B'0g2P·R/pŋbN?άzBs!mǚբ{rK)ElSU7 kVpfi9x`1js`z3v|IieKBK R{.PyjUVC蟯uI2cXhNtrS.teX'Kޯù|jٮPv:ݣW_XB@Y-jEdjmiAZ__Ԅ; B܌m͊*BQd2*T(f8LE`0F\./hhhx۷!$I:_)4MJLKJ2QEJlĽz~0I:::6HE'?|w$''WC)={)wr9@noD뜡1ehJM2Dd)Tf)qJJq +꺻~׈,脖RR*ۑR-_Qzش1oiNER_+$\ɩTM0KK X%NjKQ!-(X_ cmK1vk7(Էjuˏ=A 93l* +H[RefRwQ)jX}}}җ/_דϟ?>7Ҧv5 }CӪf <P4Ht O&SGޟ_\EQ.J/)ϟl\ZL[} R@JYP𑶔 eJUSKu,BHü!=Jވ[aN̲sS"Q:RVH4kr ~2xGT6->LP9l³4 jY7lq.MS皟JHqbSCުTQ,IskG B'%B6." +Bz=,dSHÇNTHZ:iB eiTѣ7ZNwp= +>o(6219hk뛨0'y-sNlߓTb;m6[,䔕fD7K ү2H,%H U_lBH2HwbO\ PSgoԼ;bČ=)A*ũ+-%H+Z*UP+ZZ BK_eΌgwv~bx1 |a$5냥PMnLFNaΤ]~\٥ _>>v¾U6Uysz)--jO"TjG̥!Rt:XZ)(AECCǏ$IyxH}Ĵpo'D1aZ)VUܪ)d=N9=Z吪I!l x Ln! a3`l [&3id, +|,!~B/_3IRGuQ. t'6ſ@dȝUEf;k͘"ӦiSc܄YDuCdK$-YBȼF +vѣYtiYK2DɡN$3G;iZJڊ5~RH1UUU޸qW^O__tŋ+ j[jXZ)r/jq*S5"Z6Yt[{GB!E~,x2RJꢘ~(針6u+4m3FGbL68q +HiJqgSu``\W~Z(VBѕ~r>`LS(jqTL4q|W6l}/]`G]Z)Hsi"`Cpr N=[ 8bzJ[49gcf d5ԣn|q^Ree_"qRNz b'1Oz13QktÃL;\b 6@ ~1権PR1M^ +?6o޼yڵ+W\|… ϟ?{3g`#*;v RCOwx;rДK)QjW*mQmPӍ$ׯ_`;R}ҋbOX*ENaw̛vC?u3zpj|%,q:k% @T\2.0?>:`Ʒނ9P]Q@JXvs)USS{A[!}m)E`?LԢG8V[=duԁRw}ܕ ;H {plReGHNgQMڈ+g)SXܳݳw?^:c}LNvYM \NH(O1b"Mx5Z=P" ܿƟ/o_W_銓?YVvӲ>-XfO>yt?'+ܻ\I5_VBNsas%<+V!B⧪><|,q,ku9ل]l2;?~b{Mv ?TMj IBNg-Ҝb&# +;Z#^-zct8OT .Eح\]JlR.y R5($%:[+!9XZ~)݃4WMQ#18 jl^|wcƨtuX9z_dC#l݊fѩG5ţG/EiG,M<Eo!!CQے#Rt7[xl`Ї*)|DžTNJ_[ #t}<.]ܯa"X'``Bg蛧i@ʟa cRy%#t77ebNSG\œR_gOie S]NMWk:5y>N҉Y5싨;7 qgdQ\'c7@`sP85U +pD)H*EBʺf\#U?p.|Pt5N؇ܸ7E!Mr5NpXÉr6ܛn?R0ttlr*S>..KI,M}%r]͋#H{|F( X-fr r:dɄ4Q2EZVW訖%1#W/Hlru>Z +EW&9Tih7G@L/Nj) ej3JtQ@:Kd^K" X$} +pjr@/ ʮ[ Cvvx&<<>/85L&s3qҫžA̼ǻ]ۏY8g$ MW|A0:nI%L6qKSB'}6ɧ iAaaRH +ie"1 }Z!yZTR"jh[u*~,E&SwGJqz$7T"vxHm:~@OsRp͟?܅3s9EɬtVQ eRHTY,%g)R_?缩ݸ+uuգBQX6.jmT`))@ A‡o)R Zʇoi֦ fg3 ;F&LkTwtgy^R52Zq#iu;<^@/UֺOBJEi kQM,͵Pv}t̄`yH·E2ui0_omxa 8GzgwOý!-SI79XI_=J +EU(*,Ci) ni)UҢըrfdKp^p#Vpd^@QL)D#BE/!T+Bh/8)P0{5ogcGlz~- +)NԓRR +iVK/)T@Y߇4{"Dghܼ:ٽwi:"c{2ɵ>i7U.)N5xe9,dPaY!rQHڸ&谦0I٩J-|7otn@+(U4ϐ怔N$ b.He +e[[[Wg]PeG,J/F|;ഋNtRRGyK,OR@Qj"*)"RQj=&/ȼ-ns p᪠f ALQ,NM 5s!p/+n$04stҵUs%N)۷^zW. JoDWH1p>xVHT𼒟̂*[@hLP敕ia_s$`(ƢH 1 =Ee9RU J#E鬢l|¥thx5T_턺ς +?M F 2i气A*R@o OƷ܂P,yʇT}\P\Y!fI4Grf̃vCpn8)cFw:Jvo@uˍ XGdHNȂ%VTNCj+B>(]wQ_2NθmIn87nMQ + uTxV*O7[+kZIdW5RX !W ZRU\f EMYm5n]ZYI;Er[Ӣ*,A%C> )\ +(ϫJjEuolb1tNvQ%l:O;3:C$?CQ + tQQE=CͿٯ4 I7fhjwۦnmU00TЊ_(VJfD@Dv{&ݪ80mILns'qf^^%lV@J6¶Mf)C-U.x $j4WK˲? !SR@JHӯ1W#RY5s[$Hz/A^f~i)L[yT'"O#%7 n>aVTai 6K3s[_FpuTp=JW{+Z*6P;əf/Y1F( +KFDi-,) +K)vK[d.r%%Jy0uqCp訄qtwUA8m?uA $ziMm&R|bޛS.j 7g|!E)eY]&K+=J7 iSn!y!Mw߈"_yLwG':7I~k!B:~#=iHh9D!1~vB@@d&@l8/5Sif8m`Ρt8=i( ťi`PQ3+ȫtto5\[FJ9=X !-Tыp//!g 4BPEvEDŽ<sJ~ endstream endobj 11 0 obj <>stream +Hߪ^ ş(g,ٖjP(ha:4w%dB'I^w-sB$s-K?Rtǻ_oZ_e uRkIm揯ӥT0ezn,-1do42&Mjp%H"-gnˤbJ0;V1m{*Q0|Hqx !͐T/QVfE[>:޵9->څn$51jcR{0,V:GL uu磘K$FwIC${R4ӱwǭE*Bwføj/>#R|c|&%+p^jAt]ʽh3Fm]c)M=RQ/.3LĆzjdB!IԦhؤ 6Mu7^%u{LBl +\-t*5J_>x8~kn'RGUf@ϭZ61&xeV;9d="LJ<[L]Sam={.}ّk?.[E@֘Os@{nFYZXܰ6 ps7稵9( s|m̅.\:朰bYsԣs9oqcu~p ~.Ed\Dݍs9a23szt=8'3f0bNEIrqa8"lڜu9>_ۜ"js:6q`6+_?0G9:ϗ>g]zV :j)vaiu3=@s7@ ٠K?@6( tԖqy:`$b?R"tA's"T1=&JQ]juLQpITBq.*ԋu߬ ;X٬.S6B!Y `l^sY&9֙i7^M(i0&3`*8ޅ;JkϸcaYH,QGځ;mI$`qqƝs߸5t_\751p Ց@0rj;'6 Ȥq7cngW7فΏ"f`Ϥ+{]dN0muwPͻͻ+h K߼;j:yG-8o ;Yy'X^6m;^;Zw;-nq7.I;ImaRv[Jq;Y!I;dRw-.aċ쐜 ^un0{;`njH`aÎz<`:) U.`oF;pجhFCz. +jPmޝ]agr]aרmXm|w~F +Uk0sglLzO\1ts/IU78̜A>=|(avm^~0o{j0n)XcLf!}XAxfTÖO~jV Eotm @ŌZk-Q]n1p(zjäJ% P$} yƒ1uY=(D?Drw{f@eLG:&~OcDqU^M2u6`+g%yGf"HAq3W'RYTU7 O6䴅 c|#@y $u-4H`]ӋDZPz=_f a踻nM +o>~[^o?W_K_חM;w?o~?x_azXm{v +t ?.SGiCR61$jFk.]>R#mDA.&| R0,b 448 AJ0!ai"qS>s2bĠwB@(qKHrA9bx-.s M\> DBG8+Z2D҄2  R MEgnriZb;71lc^poLX.^AmHlq;t`5uj,"@ӵM^~1Nix̴= X95[,ۇ +iVfD&vڋSh5@sGQI:ۧx@'#m2,׬ $P;9[ #"Ax^Zƣ*DCKhk-7 +T񅙈H?A`X+mhMk֚07_l()'Fac^n +[vb53S n +vp&5YJY`)Mo]L0&KГEYJz&&'L`SƬ SSDnr S'䕩0H4i?hj)7MF)yJa]钫 wtcTaco}I)rMJ=KkR:as$MII=ERa<)gER$_HQ?HwnꆩMM~ۏ7{[ԍXq^@ǯ31:;cFJǯ'-ґ)iVKn̽q*qojO1谵 i9H kr:fӔ1i:S12ږ*b+ß61CMN?2z7"UUŖ9#ce\UcġtpyҡFt{R:ܠ7r􍫞ju\U63jγ%t#˴-yVGKsVZ_!]5:=Ǔ|ҵ'2@'~W=y?CėrykW= GÄyx=6XF1?]t^kP:}Ց_tLHɛVR:썬FVܞU|W{+f EApNINNܙ*odȊC:rZn s,D9^Ů̪guĞ9'8!9 cηC $m9vaω>=<sgeIɜĢ ep#91rۜU+7S\S)aɢ +|{r[SNIE3Irm.y7)y|Q9ۢ+'s){/ydγYɜgs^9ϳyvfqkG@t}ij-<sC|9YbŠ!jps 88WaW~"&*aE9>+a=9c;yczUII~}7P1YW |;۰ʜٖ`=Csr׏9ɩ#D2sL;9r\8})9qIoyMz+y䊒޶[ijorY'׎crrşhɕW}+EOǴj:ciBg\h?GСfcorEޕ9/yW49%ZCm\?smRw|叺_3J]s45$G]7z}ڳ9VVaon9mXZ dV07OzuQIz<}j{yHC6kP:gaf{m/k -KXYB:%-V'qHL}ֺ.D;gv426G66|>Z|tyt\"_y|R{AeKG_f=lGzpaPBKH6_ϔtK{*Z-H͟Q +.ZhHR2%zgQ2-EImR-v]%վGFg{9,9ƪ Bݛe7b=c,w$;'Z9o!#XJъbdEyOϢyxoS"-)KZM ]z3UAVoo(-gt`\!A9mv&Ze}n`g%LipBgas G0+hd6(dMhd.t(d `1z99y[QL07LYJRB?,eh`4FҸROS|Yl)Vm0垕t` ;Lna0mɺ'LC )4mWCMԝQ +zO"4fRkz.:J[:[qB2$)B$န R.J &Rk"Գ8G){0P1g]՛[srL 1gf|bTzMQNx)]Yu669E LnFh2yaYPCQoF!@:!uBf(Ya( +֔X{ CZNnAE8lp5pD7F7J oŴ㭲8&7|MoИ:ިɖ'#78Gi㍲n\MUniƋmqumVY\h hh.% mNhy[mتܟtC(ZnЛ*Z\b z'"[;jGxCs6tN7r1tF1o1͋oA۞c󍺌rM6g%QWM=3|S9+1፫=Mkz/Milߘ!o$4VE|S|MiֱZ2X::/1kN8U@N8iCNԜp'qNJ ':,''RwG +Ԑ9png'!8s1c!G=L; +KҮOAcH9ik/rwNu)Gz(X +Krz:)itf]t zNŠ"b%6Cm/!{. L:\s^sZ ݜn{9z1s3+ ::te'3H teY >AX :{N::J=3@w36r)fktwtl HI ɵ^c&UÒHW6sy_SvIGi h/!VgI:eVj" t頓ypQJ4oN:НteyH*Rog]2l7ď+0'nsDsoNtpzy8'8WsùR]:<\մt0ǹnY8WΙL\mc\)k:j#7訛 :xwj{qn ta[K.fecIXQtm9Y#4q}r&c\gy:u7zjDtu\}.7D+B@q%U Qcs&qBaz: sԆkr^ccyq6@gcL˸ZJW.m\ej21CwA:fR/Ǹfcp/߾YnQ31g}+c3[M;sV&s&K ^sL:ژ3^Vho|b!b樳9HZ@$ [= G8Ї`u3G]\qL{er0zx^{8quqNcm{'cMx2NуqZUX=_CRqЛ_Dt;Ʌ8ve ]yQlA#˓qMU A3q2y +Gk8hk<PKi-'|<%'lA4 Xk '<i9jIc)̀^cC|AΞ]r@Ƹ1t䨛j@F  rv9"S9Ě8 ry(gsH۔̢sI_csF>sǸ0gN89CQjl$94%8gzy8_B]`8n:ݯ?R$*S.!.VTS=꠷' Ա(۱WoNM.qymcZPkQ 9PY=|+$l[Y<:j PD˅:pDF=@vVnҕ7漻ku|Dd[UE/ԱXʎ:jDxnz|+t˭K|+B[98J=3nֱVWa=Uh::J:ucu| Gvg\UVФǷ4n}VgH Q7xLVK1hyó =ߊfCJS tD m^c$穁XSȢTbeJ95 +qӫGo%`ntt-MYN )fY)v8ފ=t*2;DՙZf@q _y%U4q9_Q^sPYܽ'5aYS.߱MLqiw?nhr<y!wxYy=pq5z֔=,eO/ 뱲t:@Vߠ8Ylz9ЧڼЧ+=} ȳdݓN>9A }lؗ>ȧF:]ɇtc,-@56=g.c8 7^{>bXSVE x.;^t[tyJ^-~3>~k{Ce<#~0 1qfݽfF@;2+ ~/?|ח"o_珟ǟ_>|~x }_;뽀oWOG{y[Od߻1= 5tWl++T\ &@ uaZ^MqkO?Ĵь!&nj1FagV"{,! M +k-MjU쥼84;$@847u'Dr [Bf_qHxfĚzD =;&~Z9y(:[n"V^j'=IN6H9S62ګxVb7-)۾ Dв.Wkf uVu!o6( +rTxgR:zY+KK{ZzT@o2){F`T5x* Of*L@%TPk xsx,"xE/]o @P͝)xPg킊i8Z") #2>SsyMN GL>NzMQy<)wSFN^g'-2`F2rK%WS|f/~eR~7MJO z/K_&0rJE㓔QcBRcwɕCmJ>?JD+ܘ$E\WIQ oAgBcC&dhVG(s\5EX8GQOەcr;cXR93{"XG#c/qi'y,C +1J +\8t$qjE8ޟΞ8qz %MyTul%o>)}! ) yϳS85sPS%CNyruS8ԤCC^(ճR8]q?☷X:R8sp}+czOM$Sc͞1˖b_3Qq'5K*8݊+C,_>]C1; J8xqd|s!k.ǑC3D{]+׆}yD(Z<>S9vUN?uiQ(r3+<]OPkT0k=҄y|x:tȊF̡wv*#c;n襳`H윗&;a1QeJ<1K,Yء'&MMVjǿbjZ;C6=#cnV'WToNz+Xer|[&vr1ݺvƛ\iUv۰OtvXSrr|ڵk]]GΝWgWtۛ]װ$aiexë2{ڡ& 1kjo|Y#O֕#Ǟv=疧kW񕷧:>ߖӫsu ?ÏuHG:ݝuz9{Z|䍯ȭk_ǧu9o~#굾?<+1ͯۛ_w~SfZiúζQأ~a:Q,+u8>'A]!u<6 ,cV㲧?c YNyC^=p.'ڰ߫J:Gt%QY:~I7R1)ayvIťQo}SQJ5.}iwYn#G|xF̽nϞnX0uiu?pZڊ+f"N[C:٥XڈW[[3Khk?SXtّbd;Y?|ᖺJGgG78:ڐG-Ϩ:5QǍףXߟR5$_:.γُgs,YXstֱvM{Ď<$vȸ:Ų6oO1)߬Lr)r's<:oev;f$v#bl;~.RXj#XDSX\%{]Fb7x$W51vvZ]C͛и;F/ءg9]Bۑ&v-?5a{S,4CLXyoeޕ:Ǿ!1cbpꘛ!/-?wby!kX1%ǩC,b'QwҒ7w87 )c&v1uG Z3s\a=L1In;th`Naaqa?˥e[!غ.ƛENC<Ć1dj+@ L+#u?;pv;w(;=ŹnW Y KH\o%rzX p`۷K % zX^q9NHyΧ~ea3lwЖb-e ߸[qıu>aCS==,Oav<ΒFݴ5ؑGvHN.3`7y×N7e;p!,g_X'ɡJ 6v`Gc>CRUuS7~됞rju]iD.5z.e-PEKb[C ޙsg>P0(%e>KC Ӊ@ؗx#>?^֭e~AwlqrfA _*|{{hZj?}m>tsÇ9>yk?,hkt|Xjq,b]7*rvZoPMMw +O>HB?VLT6\~kR{YClM$Ltm_/?~}_?oz޾~ۻoӇ~@gI;ۿ_VǤ1==;  2db.uoԬjxjkՎGzP3ѩg& eό`8uaQw|ʥ}N'_%!')Z^y1 h)ԒZ|kL! IIԸCPXY޻oq/BJ=g&馁\h4¼x)H5[ i=Cc,!VЀI/O0#]:Yֳ>Le*Z~,cjJclY9` kXA4W dKΔVR(M4cĔu(W3]l+ }g9_)m(#jKYs3wU? >bM}qpiJG&sBwlҲiM]sTmLe=9|?n, VFq i0ڑlvkCTIi%]ju!yo&2`QnfIPhA(v#||΍ِ +rи&9%ȵ^% ]^CF86f^0ѬWvk brig^(ǘJkOG!GݽY} d9^R.1 +^^s rz̀x##I䁜bւrzJ[A9(mtuSI\{x)㢜*1 rj% ', ȩ9 +I[ CRNN#(GcPPSA90(X3(ݹ%S:T̶Q'8*uwZY3:TD9rZ[Q5r;cbl-(5ӢjiQQwZ1Qd@>C 딃}:Ԗx]r)lS.aց\BuS.oP.r}rlE.}261|QG9 Ǟqt Ǿd&U&z&rt~ri&[y-HtڍPbE-h-.=L">;Mf>3󱩯9m^ơqC㔳cPrcSzl*?݌.t\%1=FAK- )Rłqԫ +6]Du|j!>U19iANYTt|*b>n!a94Uiq jqе q #JqAkүQ!4oqoqeq=pp {!C8}!>px3M *&!V;3$k-q,hJalC/wtpS7F\X o![Y8hA`b5i7nd4/!6d\$<^c̼o^6㨫8B[孾GMXKP{1|a}\{YnjD8.)rԳZ1W]Lt .c7 *#!a8&\^7p\⠋h8$rFQA2A3 a=mBV/qZq{7X_]d0U[U =b@qeրKf˭2TvNȩq=ۭLۭjcV)[Z91 rb@?fۺ?\ĄuU}Ydq9X`(M`)}r*y*~d S]exbĪeG)QqL:J@VYDY]UߓcqUy!nUTQvkeo3i9qU1Թ9*wcV5#JW/)ek,pL+G URq<^Uڽk0N9'!ĉAwYұ}*~nU SZ[SGKA;p?D1pԹf8ʜ#9Ye]C󈀳pJlᘖz:[9N qL{ NPqDq@Jݫ8A(74M`uZSB6QJ M61q⼽ kA9hۛr^w[1՗WE96r`ڍ s,VOx1GO9:=9mr +sйsCρm + p{Us490 EۅaUQ Ḻ&ȥS1U y]bǵ;=h1"+7>2 +1Р~40pxU{;Kv{Uns&7Uv*u+,8gl\W5*GsvsW}1|abi|U+ǫӼ*w1UyFQܔC +^h6rL8y䐔(3 7yUC9\k+ATrԳ r,憜(HfBuJ9W MgCrf6.%^trLKs9:TCÊ|Pje9:CyE;V'E~xxf x_65@Ke]K(=Ч;[7Ȃ.5Fp$cu/vƲͻwxc煷s~˟$_G3¿?&=*gxGGS+x*ؑeVyN]yhK2f̭ғFNm5Բx#ScߩuPkdp)KxE3-*Ըe\C4e[p,deXd|?d+Fr,&LU1pAѡcPs; }Zu3xO%ًR7l+˝LIh8@ARWH>j54 l!Pk]iQؠF\Sؐ_$H3+=F}v$14ta]@>4ST_cZ.ʵ3싇tlԡ|-7P^ˌ d,Õ3F%U珴 ,Nk'8X]ͫieԝ$j4z5%/6~F/$&ʉbCKcfJ@CRUrEMt.y2d= `-y"Bd(9Mve9@ݒ%@ol@BOщ5hJ').7ӔQzՔo>M.)2MQ)51INhS\A:8=8.|N;8iMG5 )+9EV]o`W}=EaLYYb5IL51u<41ERD^,E qSʣ/^Ix9~?NCMR))c4D<[@g#!gnԿ/^=!LHQFk-*9rup.hz鸤_H*\"M[QOUGQk1ܤ2ú2aEU(s6m/Q0.5gKq.8dkaV^Cm͙118nwzy!1 +p98~cQ|&o}J~u7DL+q3ní7hKijׂYvv|{oq_ߌ#is:hx|3 +p"Jxtyi񍥽GYVz7Fk21p}1 py#3+{X +l1;p+Fg9{6v_BqR#R8skG +KO3GhF,-P5n8_K<iH<$XuI<nw 1N@mگq,ٍc18Fix4mI\*ZߙCncZ2ǼN)7eA9~fy3F1K[sZctU:ǸKx9Oo<鐇)'i:\X!^Ɯ:d0gw9uU{R,&ҡbSgJ쟼!#_JߥCnN5sRZْ:dY'uzX :ҡ/:,cғ:f*ܕͬLϭǍҭCiRc_:z!%Z( ~ {~uh !M 3+jbu +3~|qjݗ=XX.G݇6b݇Y=:aZV9k`l֩5[MȳQ1esc+UCM7*1k|Zopc\UW?wLa?SNXrjP7J97ӤRG:iZJVqtWJ OSڕq\:rmor=km%u'uQ{+jM,ҡtِIҪa[\Elp\f:8{ +oYQ 5`9װTt܏o90wo]Cv`ŁN=BСԹ.tLҡ]WJ>stream +H OV%uVԪj$$IH= C|`Nh.ff\)Rc| ow"a؜+yMt^LJ~%iipO,ɿ($idL/+ +ϓ7dydQ)"1vzeUL-0FʦI2m-tȧyU> uA2R8j)ҳJNE_t>=;;sً|%_w޽qFuMmM͚fɏ%ZLeUUT*_o߮l&45v5;z76-s\6AVu˝dsNޣ;:xㆠySԲ%jߦ:vN{W顀Oʧtc!?da(h$ilfMt #{#KzTǶdGIl&A$4"|+ܑlOqߥ3nÞKqh>ciLLiz#Ф܆[Mp/|~,a c,fAFAye\ZO.]s$%exr}YRv%d +ZDūtQb[z/Ȑ ~OVgK*fy Iv9ޖYR0:|;5.ZNҰ`%HI S/ODr78χu- uKXӎϺ2{ f!_ۋOu~3@ +EYH}]5~hP?2 "f\TxZe%N_SAT %ĥKU^չ-jXHD$#R<.84o׍ޚ)2ҤKOX'bހMެ]4oN׏#@KTeU b(K,, MĬlw~Ӳ pF-`eo)<1rJ,ŵJ))ͬfVf6cVYlȸZt]bG~5NR +Kq8x265ȦYzzgOB`畻)߿s ֟ii}cçNKr.7RRC=Wɻ<&ϫ{~ZTtkWHQ}S/(i@Q82//*+lbe&nWEӱ }1իMss{x%l\e9e~%Q L ϯe,5?s)B + +Ԧ/|i#aY_`c|XI}XOtXG}%[-j,-iY͑zk={FѨq$fǒThƱhւ?U5b1^4k{ *Q;%GРWVe=z$& BRAT@52x*pk2-j0sRv&e]dCs34y(2N g-bziDf"f^RrAEI\g{(]*^ +5Tl3mllߠMx4Zx6^xW' :zk2̋^u2ZM6h@ eɾt1Rm G#&qơfjJQ$37[PH˚M) XK}ƈEay7 +ʺpueOҹ&.Ox@54 ǖ3FGEunA rZZrπIQZWfE=&-9 y /`0gF! +F#@h}x}% u߯7՚;[dv$R4`G:Y02³SvtX)Civ@/e';w.JDR#@ +GGO4@zv;RRk;x;:j _8f{.%L8df 6C[t n۪I+iuٖydֹ+ 1g+A4|^j[y߂Fߋ w-Z4@hoM~ !/T1FMJJʱ {2)E9+U0j- +sO@*a.^K][oxzl4kE; \׽HWƪuYPr7DA +IY!*(r.>!+EheLj95#;eNRP4fIΧ_Nt ]Y]>JxWP$ԡ8UIfQV~KہM{9"r ,NG/ =L)4*&p(jK2~kvdqWJNe1?*#.3E <&fV :j{1^i+Vu"6RQKRWU777tϰPZ'Ra|.ߡ }rr緗([ ii#RhK/47o<\00 bm̮K8SRyT2Υ L<|,X:3Fbh[]6_bA*ubŐzHEcCm*Q6p; )H ']Еaxr~V 8G|EΛLSI]䝥0UC y"kaGiֈ7dTI[D}, ҽ,}/W?:H9ޓy FЩMՓTߦ, `OC], w[gi{e&\qz#E[b}sS.j`({Pl8Ok0&HEpK@oP4`)9f'F%**Fp D1< 6-aW@oɡ̲;)JƩneMښj{{dWi:']-QMZ ZsnɮIZX8; VC͹uYn<>^H¦;J c32Gэ֨dEƲKϧS;vaGk Ҷ%Q~ = t&BT(U%(=*@mnZ!*ռ^~.uM .oOMYӾ1`ƥNP@Z%]{gی})RF(8}DLacqP +rf\; &Hs O8SJTK)M EYP%+YcΊVla1h[+S&4e|0=>H3mirt %,(JCLF9\@>9KA_B.@" J~r,S:(] ҽ8mv{  lՈΒAh`i,MfՒE*?ug0ϝkMǏGw +]t5Ē9ы,{:tĉG|~Ǿ8G@)=O@z-P/b 'AQYPvJ8@ĪR>:cn Z)rRm2$/R|?JA Z7̸Y3P[ -Θ)HAQP@ ^I_VF\oW;%&l}@袃}RycÊSߔ䦭Re,h +sVA8T yDI@  @ + ffM@4 M] =)v?A?CFX( D & T%_#; 坔X퇔&E (.+ ʟ>̴g潁LvX*;DFc}PS $ =i"eSTTZ)fIڵJ4 Mڵ IǨPJӣWYL:qy K . +?R_]/vŎh,]h*&ۜj .פre{ B `;ǟd& cn|4} ha u39 !OHj612+]%'%nl+cu~y*^OpiՐ[QBQ` X+N,R|IBh7eƙ +Fu}/W"V6mjnHm۔6B(9 llg|$B8l|\iMVDyLtKv-p!i]=1LմD vU63iN0Y*51áu!ԒasFBQc>GW +Ҧ=,0R\EJQ w"i@Ս!S#%ivp:΅col=V)+늪DP@n['@J]ғB) '?pZL +G)oo9s=u'#Eq#I +ϯ|[ g]G/\g]ZqwJ~;*ĠV)ZU[;;[jNk'e) +2q.J)r0)訖c٥& ڶ +X[ګ2\lR6?|?iE HU3a>Е5<MCfYxJD- !])V M¦E1]pAԴPΤ +H.&nj "l-yd(<3tQi4$GOcCn5¨ga +NPP$ 6))Yjb;i4š N3&*MvBѸUSI& %K.U!RHivFR'.>3ȊSwiƌ׺͂Yn.t87@ {Qjtqs}֬۔q'MDYzHiΥ RRP6hPj{|^'ӀoQ(16'QmwD :o8RHi@ /,JvRݨAhc PL#c´VQu f3c/v-_P0L.\?o/^#8%ht䟬[o[hu䥭X f7 6!9]J;uYc3x6G.2.G|ŭ d&X 0ܟ*:i 0Xw4 +}_?ACv|Dd$3b'lQqVUª[SR>EJS2$i#TLʡ$ 0RDM9 ]ӳ#[k[ٳ~G.0 : YLg39 44̢#:$g HU[0?=!iۧj#BnHTV% Q P(x#=b862Wkj0Mm5pq7xI6Nl=u2Rن".gAMt}iwHkm:=ѹ]ꯘoa5a}g677*:M r't#~B -']s /n˯G5RCvdQfb(u~rJZw46%+nCcf4I*5y|eoN{~Kn,G}R񏞑N'Ny,2Ea3>DR?ܗSZwi2N3vf; _&i.Ӹ&Y+C[]/  rG;j$/y Gbi&gNs s~^AhL U0RtĤk +4֦a4 JcDoPJQ xn6H#"Y-ÚFBABϗy_[6'6 .u1M> rxK"4ljé ## ^KUK +(fuJ.FsO+ sΝ8qzĈ>9s*K+H\vW6~i }TJ؁|CY;ĽxJ<[eۯ62Z_>/78Ϳd3[YЈyV5mG,DЊCAʚO҈Q6"3YA]Xb^xi>ԂԚvDJEiljdT596F)' m-À2dFC&y V5P(DjlqEH߂R*5|2@L(uAsV=RO2!@ǣGBRL7vn,dg3(@R~eSk=.[G)? +eFM$?ɥH3_q),D+cux^1+6HB-ꊤn&#Feʒ&!Dw%m/wyvon)[ԯ9.Rmp3xMY N!2"tM{5PW-]}nW? xNq u)$6@H>$A|NŬSqM Xn@(]kH.yLa=cڴA>M$* !R"Tv{o^y_>Bs/r):pTTsɴP"uZ6S:f +ovciXjs7Ql;Y 3Ĝd.bUf3RIUi*HGcߨq#̻JDߜId}kVܨpەxF]},1GCXB:# + $:,4jrqk +o_uۥq|lu:]wtJJuQe-Ed)(dڎuzK{K'@?auhoBN{hR)\JEJHKK"GHc"OtTrGޥ<1)F/ul,h!"U̟88ܺc{$c3?i?Nb7NvĀL$tFS # t I}qJF45g}y3AhgP߷tA~oTDMlRi#A =(}s HUZ= +SC,ꮂ8wouKijp۳Ec + d%"e"~%s,?pH9sD"6v?Bl$vzT@ ?Tj9= _ +>T?x9ϟK"FS!Ϟ=E +4Tb{-hn3_;]$=wyq)J*BqJuy(]R`XGv4Y'[NLm%6 gu `oz)eB$PR!!SpFI&c6y$ƌ2c1~,#Qt>nӡۺuU5ȼհ4l5khhfoD WÐR2Wu7%㡼+o\Q5yNqtc!9qǫ)U %E=㜓rIUo ^_Uie(O;di͂ :P\g7ۥ ުyqtIRWzaqaXBڛCmǸY) ϼwdzkx*/-m9k.ŃrZh)UlQtt.:;nr,uugXJ".C0ː +Tt>) Ke)t]<Y2 X4 !!YD()ґ56hF95j39g.Si:bvXf,jRd썅u}=TSch)|`Ӎ1V[ELME֠F;td!RNed(Zi.w2BMaPPl+Ui\wGV*}s +Qq`J"I=}NnrEC7%Ge)N[[s?_n~~_B. +ϮRtt7z[ƕIJˆH!򸚯Ov +U8,pNRSW])XJWdCuQ PQ PO>KGۗG HbD³AAAҐV NyMXG``) ~:2%`) +@`Rv^aA-d-i,iLݻ\ָĕnyM@VstV05.80omtj'"MYIV.K1/0)#K&p핀8ySOG3$_~zFY7OW|.7rԔ6>Eq?:JZ2 -}4ϵ-]"gN.WW)2})CSJ,.(K@PaPG-!R q`2A,  N db L߰Naȹf 0m U -@"V鑠Uh.L(KAѰVщ}iX']%X +l X5rc R2P:Tj,1Wݙ曎*zuo^ռ ?Lo}Nl'LL2KFZ`x +1r[,yvɂwg? = •Qt*F,Hӻ<髍_v߿p/xv[mϰP8tY:ڊhqvQKwfqZW%ȢM.K)Nymf)NV7S,EX hB~~8T{5 B& @yl/I3Cd"a6h)BWZMuT!HV҉aĜ%m OGj`LX҆)̘;\T|Я *.䒖ʹ/3mLW@)哰өx2JIB7idv?r`tSFg +)WkApWO6|"Gx}G~ ((Y T2*1ocxۖͩ">t'I._0i-4]]sمũqqtDvߦYK +.fpJ)4 %ށ&p TRfq +^HJ4+z%gih>iQ5 B(+@bƂDx24!$@eƣX +AF )KR~B1˪|W Et-wH1b +Uq@Uۓw_.;&xNJQ'kl4OlXy$ h_n^L)_MߎfsLǎiܥ}^ӁLo~~T"#Ś GDh$Ξm{"qQIMRX/ إ6ޥEK!RKK\Q3:uɉQTFK)0-siwis)DJ] + +.]Vb@n 0B&@f͚EK\j@Ծˠר [HC u&<2b{wH'" )nu[Q UY5R:YW44\f.v)K֭1RU{%aIM;Nri TIǒ& [["Mqo|yF>?3Ģ>yT8Q%yrC{9%ѓ zh2uxfQUd/])ykmtCOE BG3Zj.vzv^¤*dˍ:ծS".] ;AHSp;X+x JPW'z'cdߊYXVMx m2[2y2Fz58q/`'jB! +;Ԇ" C^net#̨֦+ߌI +\i+QmBk# UN\-cW˖+ê qf]إE)t0*1_۷q8,9rq%>,DI؇H=,"%bɱ?tȾYBct=D.MD#i271t\ӭܙ|GE&*ͷ7\r +@uZȘi,r6]Bδ/7*s, T Ӝ_%ԥK!Eڥ7N_v\ҭ(ER#!"RU`ɾe¢ҋ$5TLbn>:8J H!R5>#>n".p:,:Y_h.uMPva~p؅j."uaHw\z3L0&ޙVpi<Nٴm2zmm-77`Q4+W'sШ9!f|Ef@Q6]oll@b9i_qc({dl.6W}:cȵ՞KMלJmڋ!Sǝ"Gs)dK.9-I<)Eԥ]*)nuXEAxLRK4f-~\T$#xo1lԅFTu1m_`QHXgC8HݑK=7-"C% +dŖs7߾C^QՐz- +}yɷ(Y +4ߴa//|%~=uDvֱ8~'4E2t.?~s#Xt!V%~H6D]kq?}ӗ2W}=]s.W}5U~CڤvN $S2>Sg +^4P-W҈^_HerFi5#S>S\uJ\C-N2!R.2=؂IE+@`-{c߈,-N z7g7Iw%e.F2f9"!;?Ej=!%Ӎ <"wP{y]إ"izD4c`[o;<3<'^tu ,%8U *GU[ 4djXvTʱD*b))ei]8KPflHѠj4eY7,UFg| 4~ߚtĔ%,u0I3>@R: +U!y#5d`3`l ;Rx^J@jÌ7ɴxz0X3iMCOU$ͳ |H{Ch,py|H'NV q8QHI޳+h7kxjZp%K.ګ<]yyU_sA+x/{ͯ" x>ngRb ua llA"VSUӘU_&$a)Ɉ"5D@= Z2 Lk։ϫgu-Z$na-s5 +" &Q ƮǏ2fnc +jV,*WV\< +ŋϟ?ShjEũ3g ҷ}:F -yt1eYwwwآ`c]쿟>y8MΫnގKpTWg%^j.i[*xWUF#+Po#vFVu䱇44 7 NͭTNY;,R!ybXI!DUTFcSɃ~Ԙ41 +[0,ͩIJNgВ#^p/ۍE$h!ē>m٭#hD4 1csiD#n MMS@'H#!,^GOP4L:9$sG~5icmmmuu… eeeΝ;}= =إz;H>RÄH+ͥwʾz<?l1w_GD%W|+Wfܲ +:/_(k:~EU@Y='ioț3 +B:~@Nzp2P2lXvS.wilH&ejLRrda)+:8>}`]qZ!z#J\ u1]rܘfO;CvSj”\8oSX p;-`; +(6C2FWw\zFXmD֓,zы"8jh+kL[2 +_}W]lo(}S?OKҶ? s endstream endobj 12 0 obj <>stream +H۪ l{$JjB..1d8~[e{UjTU_ZG/y{_CkX2M⓺imXUbQF4[_)4lrN`}qĴ;dr-MD-mndcnsv󥵔ۂ݄.^]z)=b5`6bv!|.!ml%6ߴKHgo'.m.3}.#ւJv)v6[TM;72 A{pc5M{vУkް㔱Y' ?X!kux*:xXN!us_c1!:KJ@ Rݼf lQ\::&J + +uoW/aF!(]*K!>8,mb]b[S ;Y3ZzHݺx9<|5U@B ynIscvTeQݵ{\g/V2juJg%Vmhve|0H:?:1><=(^Syzf9 F==͞W茅K9W[+tc0+hˬ,<eq󄟡Tsϐ46lO~  +~ԩ/AQg8H3NH؇cFm^XxEk}|8GN~ 6&|p\3:m;=x"w.Ymy?DgK%2ZD[" H=RSZY hb Q|, r`;f[_}w_~-^?}|Ww݇O˻׏pu){pyY?ǛkOä2OyCgcj"?_CԿ㦨+7yA! ˜$ZFI\&yv%\ܰO8F~+EHN՘Lb;A 258NtyI11^.)ReAT)[7=Wycۧ4HJJ,o]OŒ#p =hQJwT%ɉd%sQ6p)A)2lξA +]S E +$ŘIYlϓM rӔRO4Xꛦq~b̆o&ׅS+|%oel.Lgԍ7N8( 9O<cX8XBjXG}F)b + )Aʡ +HhHH9''_ +pzMH 咁Q_7G{G)@./2̺9 +}l哣˾1O1Jh˺1JF !;)JVE۵3E9㘅8fq#n9aTpu߀dC~J_sjtllI8 |zpkk$/ ptnU tOv 7gzitjnеz cjnA]gr0 @wy2YLWedJ\}'Pk} Al!ws7|C!{E:pg$XG?ߔqߐk+|c N:ppau&3/ {1p+Jˁ] 8m E[ i:I8nK3VB9])j 7zNGʏS71l5aƜr9]T͞9qJ?9vǘUc֬tȫksP:8Nn2[7x"I֡6rcF2ޗ;Q7]uͩC-ҡ4..2B:&mֺI|:F՜ƛ_XMԍ7!}1/MAj2woNl-QШku'Q{3w;u6|ԩ4[:.;m+KĿ賎[ϙVuYwN۳7uhu6NPSޏ:EE%tٺ::.k]6Ku:bfe>u+usܺz[\VYQuYYg?PՏu-=n2v똗nֱ6w g :|h՚Z;[qYSy"OY;BsYWx̬𽹲uZ03 +f밽muSY)upҖ}ƨI<;OͳbjEmՠ3:)'Vc+)zXJXװfPQϺ˃=wXUY:f ͈?of鰐ܪiJI:M<N3.sKܪ٫K|G ȥjtuex[:d!9IJVvoppyq~~q +Ʈp8\WGxsKf¹f!ysC>|tEh-AZ:tu!w/Cmq\:Utț'W:԰ݥOYҤofѤocz!k[ݕI9g1t5MIǬ1W9uNr rHq!˝tz=kX3tI}րq絛K!w :o=wi9;fC6>9t,/SnHDž7c~an+]:1~ѩC+s?éCngwR4WX_~̨Sy~Ec|eD1#c_W_N]U-^P[Z+šRu8u <:uqgP]#Yl5<:؀}Ե5:1"jyqꐟFn4Cm~!߱S[y~E 1WQfwꘇV1cmFOb~e>:&Omݡc޵'X[5׸A\V_uq:}NyU+s1 9z攬:n=b|mBةkyz;u6I:;Zݥ-'Wef]:NɖC Z:]ʌǡS.uř7Aǚs͡C6Ҝ9V"osm&PB;]96+jP+~\r]? ^NpDW߹m|S_3b։q&Zt@KK?ÚZeUռN OOCv3krYڙ"ⷞh۝}2ه[c.Ic^iJ:~xtzSoF?ͱgҏ`'A]?~I28Y >ݝ2>ɵNOCk<,tk`Y<" 3Hݜ@g& Hk=7j v Ͻ7o>/[^|_W?뇷ǿ>_z?{G|$ǫ׏wRi_PZ +釢Sj*y1ylnhfc9fxpPԨH)j'wC 2'`w6kR&/c_iKO>O\i◪Ƌ w/`v7}R&}9Ļ)_UE_=&E_.iY>f| B* L\E_fR*e\L=yϴ Us!:ϛ,7{}{%^@/ @/tђ-jcQm9/A;b/wB QdOQ' ̲acbK vbB2A:h]:xLq GC5XGˉ:~_~N6C7-A\f1ts.'ǔu9RS7=-Q 9uFʆ: uahܨC v^.u>)'uu 1&3 u>Bۨc B4:>YGɳ=aǘө;d`G˧ v٥;/)V+6W6i}NU21K:y鄆5/eq,)R`}2\#kS=pRp~N wp']턣. [BNDž;jg8ph/1&{pGo!R"R.1e!xоUxMz/:[Y"iOZg#OG}[ȣ5]ck]CuJy![Iyڵx@B/sQYC K,L9{&hz}ؠ^jئ6@C R7=QpArCszCj`C pJ'ziI=j~I=2uQz9z%Qo/acP&4DǨ'-㲩XN {zL {|a[:t-1Kȡ{L,F Ğ/ {J&(QyX), 3=/8tl)t {R {Ү.Q'yc/"Mbͧj {cc=ȒՐ]]-b97Q]-u,϶]-ZjaVc &{\3['ư]v-^ W;:7" 0VϸSrc͞lb'_`!'S90׷|ZB1zV_d{PԣIDmZ}-ts!L4]Cl{#I=c,ogǤlu>mluAIRsly(=e_R4 =ʞv>Ζ_e w[[|[ԓֆDzZok+nmDn!.wAϳ̃j!;јj-oA'}]=`tқ Ay2f/7ny2(y,Rn"cǺ]m y3`yL+q#O@gw US<Ǫ|En V¤@Cg]y2&xtꄞAɕ zz]zfۚ;(Ӝ>1 )ǭAilm\> 2Ɛ Jarq^ԟe[9O3^-if=u=νj7Aܫ꒷]'|jS| {(;SCy MYScVم{]…r.]m9ka^'M=VhqKRgqMH1.9'^-JR~$oq/֓GX3RvI%oK.v]g ,y% ||[v-qKӗM* 5vyk>Ⓑݵ]*-yc'pcri[:*R:t%o*v]ʠ(&d7saT':yQOTrC~NK}[ f3@zh6^GUP:qbi qN_M>:"$k }tVd&ԫ~RDGsқ#;9LƚDž1g2EP, + +NqT .R{;p ܥteu$|b9 wN0ǴO6]%R+@ "xmw E gVXKraHjP1L ]eb?'q̽~vv1Wl| +؄`<ͅ(IA=RmW AqJ 91(N՚7 I]tLv?O*?#rXC8ȡe f BN҇f[$伣D(ī ) šBن+ YEirX]0t jw?<ܽ'4Y羭Oo÷'/^=>:l7[/o?ۯw?~xCMy}7;28uBJ]퀢N턟^uO/| ϖ_ߨRJa.Buc0VC:*Tk:oM07i7h~@p8 I3{z;;kYRbp!n~ǫY.LY+RPG䶥F8;rkhˬj45t4BKc \ 0HbtH5KDJW3`jgEDjXȃU*# ]cjZF:T5y*z|FobuL"WaNe+;-:ؼ) ` '"_ +K`dU}<u)(wgV*c QJD2j4N*LD` Mnn)혒2a8kC &>'iak#lc +7GoqLdWW@s"u`` _un@ ɃmDP$]H)gDu!]Fh MWtŚۣ42*E-`:^pG{\N$W'/ zxrKSw TYy0JGxunAٜEEOaȞe㩙1࠻&q-wx67mhW}>ó6̀z|NZOX8qZgHpX25|%k%NYWQ{|¹ '&GG8ʕ053[_]rj ;X Pw0ye4p\r{45{B3EkRI[=` ܈Uadr) ЉVj)c|'Uޏʓ} ]BR؞,=oasd~Sʸ1Dݷ }YPGJc`C]c[&P'R+IH>O0wϕ}hވ!T~`!MFwp@ }f43+=Eb')NYlhvp]PJð۠{'}H;>oPP$unOruegs2^d-eFVol8|fϮmFx|BdOr6deOFƹgs6;88Rrmwt3t %G^_u֎pQk"]ƫFY@jj=ѱze[OCRj?F>kgZkecYɗU'?⤹XF/3P~Qޢ)TIN)$7Hl7-'PDQ;TXk%@e1)6ǮA~BK-f,gŕ gޣ*3zPxmj?'.7U`v:7NVoGW^$``">j +B$嵠֩8 Tg IXP*(~ާP*P4b8gFiAƒa$Czoo/6@q;+;ٙs (s}#EXa2 +4YXl!Jo_Fm@'WTò3 J*8 N Z"qviI׫b01ZKtt*ߵ;]\hOz\Tw&cߚoyՈJg3".`i6ua?a7ܴf* !.l7+w E%h!C[>_2hO3ë ̾{so?ۯ}>%Z:( /)GY! ec$̓cYK9} a{wWZśw?݀_?_܂w}a{/+Hˡz¼󖿻{{^zћWb x\q M2q[ a)V| :>ǜ:%E[Ӛut RBfY9i5g1$["} }831\fp`;u%YӘvZ/$|f RvEY0'O%e^v۴=yr@eW!qF|`t _Z">Ϯ{o?Y"k(H<ǫ^9gMjVDvO0)iVYۃJ8އD-iTkʠPJi!pc`=XR<Ә}㱻76MF:g[[mZ$Ū+w:'kPh# _Wt)yyu:X:v?4/ϖN?jPIU vQS]$4({*KRJSU+V5}Z*/zmHUt{WܛҐ{wHo dS t7EϱB)O m6P rikjg%@ai쁄8Hc:t6TZPcOZz̒&rBXc* Yk).^BYJQة:(R-Ē$Ps1NtHv5zI MșVs-E1K3Uw6lkMʮʶQO_LRr?tS憰Y%37b,N [AHRV:1d`NtTAmBs2ǂ\=K&D}(y=@ɧ: sn2Y +-Gg/tW~x|pEPo&/+EL/Q%U*6Ij' c(j=}BDr֭7XF*I.Yr +֚,-jPsHSKKGj^+CUzGC U#ZR.G52l"J]~ʴiF>}KJ8)TvZQ:g?q)^G (UuF+;$M5 ='-*TzҭY(j)-*^amĀ .vPO-La h4搻/,ݬA[d(.~ńևa:$Zb]o}4AwҐ.bDEWLbzkU( +fnT~^Lo7S9?ٿb[_;Bv`1͵_Wjk xHZW46^}nwfg}uu}bׇ:qfobTM\ްSeSvPj9)G mV xG+90/ӫ7~>d73św?݀W,Sw}a{/+txWSE1C3Dul]O? ~@FےQ)&کBTb'G`J|iIj' Se@v~*\GNdWb +S\k1d&oT;]a@^r)$#*FD0A^ kGTmHe. kWD` hPub."KWD5{s0e˸ڎxs*Aw3PI EKjZ㐧z\q|mhUR +JW %NCW;2# dp}: ôߗ5u91.U9WJcF +[|DNla]`+pbڕ*BO@XOK׺F1$ZNA; +0.*E NN`B3}ΡgxsȰU+x% d)rg8/>zpnOj(pBq3{f +^Y aX`pƘuccG֨Jƌw9]pWNxj{N䡭\zFr30L_u,fR !:X-ZSS78KN$Z &:q11L5Qb +3,E5qES@ezRum][&rB M^ P]OF3vvP  !J$%$Ei U`KS8YIm|G[$B^HCiAqɱUZ5@1XY|YTyԯN8*̶ Js ĝ}+%~sm\kXva +mcVP3.hr fm`b0D|+*'fL GJhJ8kjk+y]L\H׽po-0Ҍz]ל +$T_`/L/ ? +Mуn0K_pR鱖7k'S]?b섘WÒ-GX!*+kԒ _Z7zn2+~~f!P0Dj4 6WYaeW唷>l4+(̐هG>J43=-^RxsQL5i wYS\9W{`dkO0Ts'xqɈvAyeҦ>W2[F}D ߡR{$Ԯpk##'i9L yzh6 b>tWqRZgz +=!Mm%op 1bÙyһ6 F3sLh0:'Ff>kEA7p'j߻Zazk;,:. 6[{8c|=c3w^7C#+aAyWyI+Z0{L,~P=t٨R8)[Ý!^cB̠ 񱿧xZZs9c &[Cki+2xQF[|BZC)h쵩 QQ6wf Ko8ۗ|z1sHH>!okjPWg!`HR4[ +{ ٻdu'.sh~F( `QF^_s]CօR0z[ODj^#+>D9\EȮ1s{B#餧_U*〟W!~c-LU4Q;ŨvS19S35֮^1zՖk>aXk͓h-X/ޥ6>?G6R 091P3}鰵BhEM}JiͿc#֟bD ]cj$WpS^bkr:˟ʹ51Q+]29Zpq/PP}ل9|- +k]x,v~xuq 6qz)Q8e[ `} fpXk nTD(#jT1a +`߽}, ~$]sZllyjy1>@T,nfcȧ&_#Yk6@G +|S dɯ g2G9M7¥N> +*Ks1<,LHx&%$ޅ6 W:`80NhZs}/8Ck:L +)+Ǖr,q;[6P6쑃C{TŢi4Urgm*gǡ~) :1$U )KBE?J>3A+ 8w6W6T`mWbbiv^8)嫫bVFПTnYsHP) +x3,R=x0@z8w[ABݟg ia˚`ˉ9uԹ晣76l1]:2O?2(e9Yjme׊>0)pTӜMe'Eț;U'B6CbAa]|Y|XYn䝻s9ى:FI95>stream +HSSYժҒ)KCt4.GmD a [Ȏ4k" =! 5`ry=pAz'v[Os{ysĉ?8p/rQDwwBNɓCЫ1 '(vmM BT0ܳ>t^1R}R^'/@B;My[ =BOGDkӡzɽ|+" +d~s\Tl|ArԆ.5@PW3Rw7{"=m~e_h]aMlDK4Kq+v5u]wڣ#PAAQ5AMdH;?lbcؘUGM#}¨ FMjj[j)guEӗ:JfU%jmXġC8|(:00 jcTNJ#k12:|F)psxyJcbRWV_>}[;u_ߪ+O~uVSQwr<^# ͳ/f +},dӠZ/ ,H)K}X@&tL/tq3 +}JЀ + AaL#'!"I  % u&v\Ճ>,`~ܩ-RͨenCZ չEa[D~7Z'0D +@ Ϥ>+MF0YpO 26LF8[[[ˇ89@C@*l1,Rn7pnM'iJL l\gU9ק\to'U_o& ҽ13p 9_yUg(dӊ, :S,8n w,UB)xEqJY`))2p +:6I=D}o.pPK5?FQ;胶utXMѕV5VM;tGSI!k݌jkl98j+KB2+ SJWOqe(Dx*T9iܜd(\(%`) vN4cr={9"'m#$@& ϒ\LZQj|>Y} +ifz3]SГ//O@)p7f$+!lx^} ũ1U`dMu`)Kԝ6Em}~ 8i(NbGlDz[{(JOl*$vs2P;} +UhI @=rtwT^SI؆ecmrukt:TV&o&?l}"LAVR#}B + %T} +PWAWwmrdcX+.=Fœ̥8/_%<'=ZbJ/̿_%AZ685YCf `unMq$GZV2".mllP)5mҽ8||b?k͍J%*Lj-24,~K3Ǐ1WϬ-(H$0Y6u?rY $w4R3sYg(JEVTAk5KuxE}RH`)${[i{IK U@iI~UQx 9ݰNdlW +f5秴%6%@f20:H8%{7-V8A O):BCv"=YyQ%A/5/'%%&lc0`}i[%`4%,%1B!' ydIHwXӘGYe)aMs8f.8B\\4hrr Kk*﫸 +p;:to#T̲EAXFQWCKwO)|-!&d&KAX? ?Ppt&׾AZ]cs0~V}-˱%ש]6̢S}Ouk'UYJMʣn`)lcSũGspINɹpbn XZMs\{bnujj{}zX諠<ϺuyU_).2;"!Ipץ&˖TAin^)־' +jjN'4S\j"nH"V)J[d;0g),m.W:& 71X +!JN?8a^@ +a%tuIرBHAeĜxq516݋#f9NSNJ9zKq4, cK3C1 w{ \gQ*@s_T5DX{/0IBfaKaf/:V#TAuMҳ3'?Vp-nqbGM4PG5kYS+RE,/0%XA퐱 6q,DtBʳԥ`y.WAUSnT\*WOs>V}EFAZ! $ఱ#Tyn&"bB\b27[!n O5f848==Å|5<nwvB1OԻto޼!5sg`NRך6Euw S{CE1K{&OHgSHP\.v^Ѷ-n6 "Ȥ,[3uYA"4uMH$V}vMBi'NmbHR95!rH=4Zy43z9C|g&TXګ4uwWMbbBvRb\q&!- ({I4f[|'so*7|]2E`)4xLo)JOƖ`Q } +EKT+ZӶRfqdY%Ԥ}O'^Չ!ߍD|#,e/E) ¥]#~B2`r +Azc+TP(1PhAE֦(a~BwVgآy(' A4$,ߦw9!]-_i|'Wh O`Yri"MIlj(GL^;mTG㋥Fyl4R]- b|qZX-bkL.U3\ؚ)*:0z~Lf-Kє:~׉DQ(9⩁iڙaN"Bu6ܽYONJS>:_+ԪPcf|i>S}ndlZx0qv͚FU ^92<Ď2ա_C" ]LZaCKߗM&+5>nTg +ťb}~daZdZo͹yŮ2y!؆)&H,s0;N/W`QTvwm/mzkuz1[4&ί]ؘXҿ'[VبU]_/fǶjwWuH£a^ώ +Hƶ + :E#u(,HB*c P_\Dn%C~f}η+'F]\/ 1=R`MW.ܞ{PSGRc$Qw 0=5Qhid(R*))u]lzpt"]3DJm$+Ԟ'&Q}v}ڝwo7nn΋w;Z/|.W8Mh!葄/ȥx:ԡ0$(L?Bȁ~:ƖWUƛC_+%x: qLwPIExV{=;DB4Cmڹ]| qB~d<%Xe"0 +U2.XUFZv&<oM[@A.OjS3O"}LDY/O ,)aG +~ixmQD a RtG9Ij)DJb7/MT +NasaQ!)eY7Ňܥ ǭQIS0 eMN* IaazKk„Lu][mжHQ xL%" ڮa&CM[TAІHqHePE t_tڨaع2Yr;mlC~)tRM{a&iu]R["Pmq!RF,Lar)Y(CHQ֖ "/UDeBj)0}H0*tg꣜Im4:$5 1cB=T1alb< IBz;NΝ;A8MѰGX 8 $A{P4R>H215F0LiFѴlOdZV9t-.l Q 0L h + +!<ϓRsNS"%LdQ\b>Dڍ0 t;j;iΖdQ-N>*0xh"%GqR9$Rvra3qz Rmގ 0L +RzHdWt +a>p)EfDj:٢y?A endstream endobj 13 0 obj <>stream +HtWI <p=b۾y ooUEI$b {ٯ~q:: +ԟJ 2 sryS`6E4 4 錬1׀&Vyw: kW)i_N+4Pq\8 .{UJ z㕱^>@  On[CܝX# F7xE Po:Mr \$&05$9"`"' ~>ŎO$}X@ͯ 2-w7*A%\>!T.˂^HpLѽoޠѧ`S9 d'(0z})' -w (uIuУ9E :^^'SDq0}A7CbRԁy}o]RN8[zj8ϽkO:❖)6rw99zNOWWIAS^ s@7 3.J{vSN-Z2yuLy+Pv^sO!0eG4[K]_>2&(AD>KhnhёseTٍ &ѷYk:^Rx ܒyW>MRj[lq0Ff ÈB[Kmk @!S|Ft)/(lX_UM>bdJ< +:|4GpJ_PK d +XpV6X)x`Yϖ0hd&@j`[_b9gvSQ/#K&%Og*{hKʏc5`|T|;0RC nYCES=wщxv}̧AwH|]Ov]wO?;`zE2c@Le+Biߠ9j\a&R0zLl+/a# C"SՂ5{ے66ak%iS[%e:Yy.Kݜ"a`kL]0ΌW `b;a7@^t8_scPQm4.|s6n:H2i|VzQ +1&{ 41^c`XUul{Oi5`8+Iu6l>ys$y91_3 \0 +|R{`6^N z5ӹCx_Q/ψl< ;Z1δmM6gȻ~`eBrt]X^%CH۠Ė^{k )[׀neRUxrWKG>GKykݙBLҁY {ϯKwխXz'w87$F?-"aCBa!`^86&ojuwά1gjZRwuU8(l,Gsm}1YK(N֎ 5];Q>1k1%{3#\;Z&P4f'( ZH(.i Mҥo9Օ<'#9o?+{ba"wW=`}Ű.j.wj+N 9ם'JPޏu2'g.~p<  dj~j(yQjR +]{V{u˘t ,=AdtgOJcZGꔝfV `ja_j-KUe -=}u A\$hkVgV5=ښEEBIcvQp'u:ǺX[ւ +f$U vCe7-TvLI]S22&yV;鹴_l-3|FzP?ZXJndw$m H|)h>29k^ xEiAa +$N;?Μ]+nw|X]㛞 _)Ci}+ }n( ݉lei%pBQ@0#;k&rs6épۮ Ε/D0reiƆ% #` )\4.8KA0e\>%2fx0_3uX6nNPߨbb$la n0dO0ÏA_Ϳӷ_}o~?w_w6z|_ۗ᧗z+/Mno] !%&ZT +UFOO)usK4KJisYƅ t!M pOH܌ybH,vo6T.`šk<ٶ4u38O]_`IJ^4Ja[ri-)[ƚ7-kdX3;v^"O!1p`upxZAx"{V؁OXeg?#]y?1eФL{bRy M{obZA+ȭ!h7ljvUs@iӾMMq+i6HM%6$- XuАA^_!ae? 3j + 2CLb7uƖ9( ƺ>Z`oha' =.LhF 5M x\Wh}t@o,U%W+"wOwk#F&E/<\SR]@ n8bx\T=uQTOUdS(' D[,i{᫞p/X )Z{T `X)H?꽙4p@P;#K.puYVˉb-y~WvB+AjR7`Bze&Ɖj61 +3: Vg5ɥ{ԐiN!Sc`3 Lu>2:onlCx) c_H@XG+klZ?r)XObУ/w`tʱQ8oh}Ɓ3:^܏7@sݒ|G O eP nR"& hh +%y>zO@GU[+fQhjq^ؼX!FelY(}#Sj12!=?y:ݴ\A[Á371`b5Ӵ="YLՐF'@?ÀrV$_q/޿ŗ_}? ~?1u~ˏO|_~?Gy񗿆Ƿg{(e`LE}c.$wO{n/xV8ym :"P0i{Z|a.R 5~"5k1f"8Tb,:,;@T=t{}bD[LhG"&#VVU00q5m(Xmv!PrU{/0|FELu-q戏3@dj:Țe8bYuln͔x@,⍙Q9a+3@FcPH. N*GZ +';|`0Z 6on*@\6y48 ˚-%q:,=^c1HԱ)<`fLv聖:ѭ4˵.0lTcelwҩ=4m4M`jG?Ƹ ~ˮ/pE0Gh/bQ bk7Hm}8Xı۶H.8:֛2&Yu?N1Jc4 T4Aܱx48ty iLf#Bld,Sv]qVTpI/pp%M+`iqv_uRFKMsP%1Pȡ$H튨j&xW$pN&ؐ@+jY vxk\ @\W X* Wd Yz:b_U[ݙ''g"|z^-Y8O,/np偮1|b#l'>r33]QUf+f2@0_c\RA&jewHy}5TIDe`O{'UaQOVZ;ubcf^IK@ڶ%Tw0f +͗<̬mx+VZ" M  G4 PY}Z՚RW)761ʹu]l;u&\oI 3ǵ؆.++Mb[U禀ώ.غ#P0Mc h8M|j`%_e&vAcrcCBZ0!S)DB0VRtv]gb~D48L1,B[8sO\z  C:](O)0^l,wF(*c2 4!~T_m䈐ivta(@AOkW!p6_&/2V#d륩wiUH-+Ŀ N__- KO?|L<]wj#F;๯ݮm|WA[1gX][u|]P|GwÃE \7XӖ^ SMmD +X<_NPtG.F·U®ewb4s0!V\o2W2J&JFsŦ45ZҤ(my ҼuVLȱiA^&jBxUkgtWj5ȳ1`Uh.4&Tmp7 >[37/Xh>vNJʷ$n +< +Olu [f|많'j0d a @~I:%؁7 vTo,G(e; $֤IDQP%@|}RgJTy)f&Nny9+>©3rO,J%&S#佃ߦFVWܒ?j9|lkݱF G&!uPbr.1~b$Az3;3OeVVͥ2#-ws&͡$,ѽ~ QFcۯ1b/\-/8\PRm@k6S85z80ϰFXnק~Q~h5CWĖ5KWqR<{FXT6-VjB U6/ucA]5q} *[`mS$R6'>/۱Xyܣm&@sj!_ w5KO D凢)O1XOW'8^"^Eq]UTk d}cF.د޶q% E%Q(2k+^=Ҥ~")QJ{QKz ,!9#gL&Oz E{`jX< j~M>X5>v\b DN9B P"WH# ߆| #7Ա0| t`pUk3{ 6Mi0ܰY_+F: 6@5 - JoKwmǶ PҰ Z-@6Sy-UD=W6R#&ϧP;4MH]@ôy Q/;?SWEwBɫ8O@8+zj +n U׈J!IР p+Ѵ6aYBB9^iyAbuU$gp;`SA$BPOVn@B Y6^gg߅ f@zS]4P`L"* 쎚Ũ]cr BoAxjaqPTL8Stb f>V&Cʃ- ԫEIX;#f㻢`y$݈+\ u/-RQfB]& ~t3-Qff;Y,-c~ 8'0,z]!邍t`-P] h=t$Ĵkp˾tˮ-(Bb>!(7Mr2 +{ XӯÄo ++3 ԛ 0uKM|-yU>FeLT7y1O2%gI ?a쮻>J+"Y@Bh]G1D}S*[٦hY'B%ΚS^`mèy/2"#-;;CQpU +a9ʥHr;?|xo >?37?b L-gE6U7yY%1 |-ayTͧ]0XzË8@m~-'F>i4퍗i/Ӵs#=[i۰#=OӸw"xNi7e,z6cva2i=ihFiHtqަՖVxxz)O"qs`MTEeSC,]k1D7]k`t6PPJeS<_Wr$CtKp{gXlXRN\@F ܕgEvIR4*_F1.uYtHɹmo@d#OZB)'+V МWy.*"{_d6 v-#ayT-.Lf|t"h_t≸&%w&2a'_,xGUKLcl%gFyR֬g_;},m/+i%IG w,c&*ǘw>%˷~-'.y]H\qNsƾ1\l\콏ۿX\Ny-lSe$3 e.ΚS=/܂Aa"ff80BL&rfhܬXr{]i\cKۖp"Z.*:! M`223CEF%eO&G(kG#f&fhB'1;ؔ,bq_)c0rt"f T˂T;`w_RhFcoF{+[wK/2gxo.;ˤWX~E)Iw Yw]8XJMlͲ]9fdMɓ?IOl>IYOƮi=ص~Vg<;MPn5GWhFczQ+vD@I#c>k/h/P*zy^|f#N]}%#z endstream endobj 26 0 obj <>stream +H7rHtdE TeJ5$% H簎82DC sS)>>es{߽ߟ_; ++[o_ + +3z{ ++5H}daVXaY0H:!UXaf7|OdWozeO7x믿^rŔ];[jq>c3y!CDgO/^9a +5,f}T4Dkd&??cz,6=fO?>/21E˘Fꏹn;^V{z6eʕ:uzF}e3gߥK #{2b +#QFԌ9nݺ-Y$߹sO>m޽>wܸq4?wi/[W^ ӧO= +֙%Ȁ!H|rx^t)ͭd47qc"(Ͼ}fybb%-WYYٵkD{͚5iJ<鱣xFxK iҤɉ'bgYTODmΟ??v֊1#cqФA|4t!k?e,gz.]yfZhQax({w3^Сp{ر +xy,?7 +֥MHW^ϟ?{"ƍ7lڵKQݻwڴiAsn߾}'|{YRӃyn۶mJnG1`رD˞={_^{-T? (=:j(dXnݴiS˖--݁>`?~<'O0f̘AGSu[_ϹM_u1bzD>|pbE̱h 艙aYpU  .\~>s7oF 0"E d-c;>wuHyi˖-eeewi@$ׯooۍƍn8$0WGf͚>|8+VV.-]cCf(4`qvTkKUUUPQFlժRݻ-Y^tdIrIIBKCmςL,/b24TkNaBtܹӇ捠I07@;V"n1](!V,vNpM&LxG,Z"ٳgS.t;Hb|饗WbZ)U(Kk}`xqZW_ڵWGjaKL +ÍTK, JƥKҭ[ da+.|o`jG1v5:Μ93dDll1B=˙&.`.pfVmhN~'hY#JbbHijAA4E?7PDɹ_S6;dȐkΚ ß9"G<8/`۶m>T +֙E ǝQf֭[r磏>Z]]]ZZ#G;{WFaXYY +C?0h]^0RvɓUwJeC*eƃ3lذ! i_jXx޻ };vwPS %%%.PH3=VԦF)e/<^:ы|8g;u0YU1EaD( lTҥKͩ:?QDn8E'mРR>.+JF +]SNգH^~պԵ,?Wfzƍ;d"Drӫn]vڔ:ӝ'v!{vH`lr(21RkeȔ ĹzTwRrΠT]6:iJ=jm?KOI9;<|9_ rdF^ظlG.p'}Lt59=-َ229ҞE@Ws[cQHQ@ +(Y=2';`4!K!N%&0 'ڬ'AF(ɚ۩4C +js볆_b,gnGw-6w*Sf^S(W'騟l;]oHz[JJ򕲭:MJA1Í[[%MQB{mI3Oc%9s|u@L4uڗ 5r.T4¤3PZ8hbتN%Kg풄UQ/*"yGwIBϪ?gT endstream endobj 14 0 obj <>stream +Hr;wVUC*.HBޥQ-Hɉy#8,Q+Hr'V7$VL:/o +.엯WR?;^ :/\}ӅA/#i&QK`HMS3N"w"9TX(c&uh B5YyT(fUi:#`nQ d'Lq\-cFxvn&'R8٪]p= +J Φ$Q4[x&G4Y8GS5~=t5h|aLLU1"*3oae{=ł0i0${{ý}0hReW=Jz{=@yG`޿z'X)~ +Na).3MXZpv~XqΗط/$IFmi(ip`BʮRSrGi۶=Û'D{S,lN> +sbp/XțBmXUrABrQz֟iONDk}A쯺yLr7xw7+?yr]&JkDv bD Q'# +jxj7G>=T!*\;@3-C6~1N4\:$^ۇQhxE(3Ã[4*"eOŻbid hLۄxj*U9lyPVYE;(AW?-uAE=A0zv0h=;A_T#bȍ:~β4Ձ i>6s۠mshgNWg:'=,ES/wíhr 2=FP{ġôtOs0n_f::xx jBkD(4Qn:ocgŭ?;t[g_ԧG +Y qٹoLH<2SNGZ)dx1wXJ,YIrSUaS"exA8P'qydQZK9׻ow 4lS=> = xAk#<ț Щ̇}۷/(ho{3}TnwF9^&wHg\{3 ^t'_ꌄǫgNWqֺ ]ϓ^}Y=ihr 2=FP{ġôtіTs}-Syh::Q7ulxwïcM&˴5qTgp^ +Tw&<8 R)`ϾO仓3D[ƌ1>8mBp2!㜭e) 'ڣpl +JN2<LmBp4&(L0W)ڢY#QʈPB*cd""XA~o \4*S^ɣm;^p/Q'T/iaA*MG`du 4nR$aLLU1"MEY:@Ycxb'h50*vob4&cE= KiG[l_gK XL^}9Syut|c~Mhi(GL+0`, +@*"fYr&<8´v.j$䝬~MN&@Le0hµR)([h +\XUA3鐝 Ʉ#e)kD%G)lwCv gJіy VFU֒8Gc5c,hg_{@~96qf9Lwh-@㠁Z:&O뚹Q0Y֦gx"sW|ǥ1GYdý:<[ѮuŴMOg(ejGw|!xc']7x7@(sSfƊs=əLxr3(h|35>@|~52:ѷ0;t=}[/RA`"u|Dz8CнM 4fhH9gs.a5Kx5C{jV'a wC1a&fT4DoDs`9n1s+lڪWLo@#X0:k7)SUaS}ﱵEc/6B ?A!nkRNv#[9498J6KĂB~޾ٵ!U`>#ჃI1B:@׻,꧒P7DHgVkt +t{ןB|!ﷁD;=8`q9uB]/?і74ؽMW{6T'1ã`׾!nRh EY5T`'+:h:QxsiD'r%vnD',$)r ۬?S!^ %+t J(cOU5$(0΂=z1 +\#{^!!wr&(򼳆#Kk=cStŵR)a='DGcЂYàHtVF&T8,}S^蕍)\h4|`<p+':n q +۬u+سeg,|Ye{oe +geƷGJrdK{_F}+߸w@oۙ+*aɍg=h endstream endobj 27 0 obj <>stream +H +jw endstream endobj 15 0 obj <>stream +HWnH~ 116fcgf ,-Q7%$ާꃒV˂% Rb=ϛ_E6,GUSeŗŏi^#HMJk{0z=8>φMVIu ,̛'Utb8Q9(W73{|^=$(8st籰@ft~PpHw^=>@ Þd^YR=%jmF?+bvFv0Ɋ=RuHT$MZ:ODfڨBc,GG2/7y2&rr 57Bywx6熦 .L#K' #;L=A=IF'eJuijTםYYgM#{N (sQsѹLr<4WU::g`K/hv'Q#w˧C4nyZ 6 cCCIJ;<G7b>0loVUvYQ^5Y3Wӟ|>Oћo'`bt4"n$ߗş`+GGN|~Ɋ3o>ޔ)xfE'{}0_A9~X*D5P8 +c#2B#E14N@3s} _E7F֏#w6!i|$VJI' {R11BS* + M샘hoWL v" 6&OXƘ (y,e(Bx uB$^/WA$WZM0YEgڙFŦ?2$gI4X6m{]iIl.2mXpPp?'4T9 QNcD$uB΅ϔu2ŭG +!̙_l ĉME e"KW'N>إeDFPƌB[} _gyLMT.Ql,c>s5AV 8p]ʍ'\ [j"c1Ɉd|lRd+8];,V5̄h'2H,T_z;ݜ#'d^osB`yLp<$B $o:} +MXE +G?w^Dz31%Ę"l^A+m)o/>`-saf@BxC \ +\ChM< EO nb zE/9J`~ +h0Ȁ+B;!XCӂ&Zzx@ ,:/$fqȋͩRژ]_L&$,"4 fnAtBc4ZSLP&95"7nULRE}A*Lxe/Tq#˘  Ĉ n.zrXd`(JHEdHp VH){{ps +z'W2I"ih~e řtQ`'Re=j3V66 +g` +~_x]ӬTսj]l 5lͶ +0[ekl 5L/^-k#G[`!= bL^gڡ6z܀nAbJIB5V0,,sDZ^ɵ7@veg />XP 챍vRFD\ +%@[1U 0 bQܦ,vz]~_p s İ/m= 7=2m;YOxu/p& B\UNFε3:`CP$'D( UU1:,ݻj=W+x4c낱*4[`9|d+ֹ7u蜿 "i(V!ဇ FˢMxF!V c7ʵM8y!ol@/&yM)aٌyi/zaMA Wuή3g|ː)ZAJh, *z4$b5JW|I&\ԤNU.=qa>Opk"$${Qaz3\ɖtMO/˙*ല#|/.\iyTqJ֠|3lXU;ugfʺ.BS;U`H{k+; xZe8WGj˄SgŦ&uUgI_uͬXVcHn xǧM]k`` VDŏi\xa[G*(ZKhngtmZ]qpi`ZVV@ڒt_"qA %eUcܠK,x DҌa)IAm6W\2 vl+euT$ѝ1q!OQ_c]]v8!6*aU߯ @x]RO#D;PwbX]DrpS ha/{v0G`,YTǘVp,q̣OWk]ҫZegBzon글^?5%%8IpίTkK}A253;Gϥk2/B®Fim+vOf"AQA.EiI:KCC$R̴yאi+9.@"?oujH /aH8C.J pNbpPFy?>cs\kuRķ'f, n{jƸݢPwJF簭 +N ^TdJLdfdz9IzOzSv{ey\[$fF"l&+6cyXp[X i;ዽ1lz.púO8]=ǻ#@VQse} + 젇_#-(]arc0 0+MlPHP['@j,ڷ]a]6)jHn2lfY7Vֹ ZF.%=D˗ܒ<4ػCzaGfEңz4J󑧈I8pm hw`$@fkqj4L;+']\k_+!=_V":vH5`;5[+,8jΫDϤ\Ym ;ʵ^jl撉δ`ZamH8y@53 sI70o2|05)%!O>?xԢQ((Aȟ)6<Jbt)u4[O*ˁ"f3wqC)ikcۙr'vu0,pdݠЬiv |5\7#r8 Yk%מ%KS4pX-F_0C{usx-AhÝZ{v73..eme1.gPNu u#Q +f +,H$;Yo1kyTkL8ME[ 7e]f<a$J? +__}G=~j&*6~n~T%pK STJnYCzݳ3!fb fBRFj _ᜌ nt5'\KSYyWB|5b3aM tiBTxb k9.\,,~9ɂmh 6TbO)&F~:1񫏋OU&{:'qv`sCzh@'6_8fϿ\S#O$[`ƩӮ+4UuA[51yg\~2kc0ޢ5͖Ȣo5.#҉$-2] kl\p:=xNgg(,TO3S8=qLغNoͲ#7oZL2i&մR  n_z,v }LTc"iȮR6v7Z3bK>& lö_eZ$[fSS+s"0C 0NJ{R)f&d1'rfa΋r2nVj㠂fsZSTV,^q&]q;BJ .[ko"'gyhT]0,0Ձ[vJͳ=?,.4t̥f5>f/TCY#ȭUV΋Ŭ`݈"m jG~җLxK"MnnZum 8 z@݄EvVPVfV{۫Pť1"E܌HaJv9@ lK\un`_w&dP fpv2j=Y(ٿ0 +I8X20x`ۀ$!<,g[Lٮ +iMQCfdZNDF6cdA N$1%Ʀ06C+p?` t 4!z V#a ‘P ,2<"$5{vlv3[<[WJs2Br$Wxh/ v\IaNܶpDE^XNo&[@8`4@)5~_CDjcsyN#Sjj=Vkkvd`1jZIo.DRSj1'.mi*W>L8!v{_j&҆}̑p5&&g%=y!)XxáYpMͦ-&T9h6eebmmIGKA(7(1Zlb%G-'*A$?\yPZ= :FZZ`~6NgY|7ȢXP^gnzQ'|_p\ʧx?ͷ-+}IghU4\ROm;z1;t3<6PI +|lB%ڝݞ=,1=.̵ҳ&ҎbWRQ1wxMڢ qĵ̽ջWq#Asq |vRi ^UI䓇v.D&Iic2):M[~^tM.#»dڅ#*V4TxIet +\ۇ۝3y`rp<+b=1Y[MVJ͚~uJ^-g(,\m)0tD>z00 ve#طrj2PC32ni/UԣMD O!-(U"BQh + " J{}nZEg3gu~u BLY}4.3*.|]'8RF<$ng8 YhV<3Kx[ ++zl$eIܶv TrYrz-"0k9SӋBH!\.&[~ٶNĒ IC-bjҁlkm,:mjϬ[{WjXQ: ٵ7xvc鹴A:Ⱥ:o&4+\%RPЌ%W3MӧkN]r]cQ\WgJ~YXqR@ Y -K x{2oêɞEhl[a-^ݚ6ONFW"u4OªU.5R+70|:WTv'Ƶk-C6J.fOOc@@-BXK>}UV$Ak5޺PF{0b3>{w OsgL^c4eTN",evݏ¯)Z'D?xLing`XvM,@y-K4j*X6X’`aML-[\&Vyp0 )YN$k*ɪ{ ټ$U'% l&{tPFbe[>e" t|H3r)F4`qan,R *zFHwM"0hJ(Y{bX!qF(Vi~4A86rlOo5$>}hŞvÈ !<_)( +(J{Ϯr-eÖ6c;qZdpH\<34y}Ԫ;YY*J=)A%(.VGt.Q0N(PI4YwCPr!2mn_^bjvp)bH]8/275p{l㜾Zb_2~M jo5H ɝ3VPwY|wA4F[Ia YК.ٕKN6q@ѴKB+(b[uIKȹ05HY^"^z6%e'oׅ[iyĿ?H%;^cǗ!n[O7_ތ'>x>y٫ϟ՛w~sx#6O>y𶐂9_O|ԐßIOuiJ7~>y_={ @ǿ{ūg0OW_?:,~%<1ffN=M&sEc3'<9wGu%? ZNGo \I\f x>S:JqgD~Z" G_oNp &'4W3,n_4^!RZmz>bp}Z~7~0ۧo1?mlO%>,t<'߭ZmZ{7@z|Z~7w#vj#DU +4 7Ƨ5Ɇo;Y#COw_`OeC[pNU[`riv6v+3v 5o>53>:IP::^nFר^T%Cć9 7h]6*nuXnr.qS2:g ؍0 O 8Gd T*FqϟZYs#} +(;.uSw[@[F)G\h̨Nx{`Ӌu {j[(!9U{[CGmm\罾uD;eem`jeU.za?1Cn%n(+[DESwSwp3bX:x{'oen[nkI4O`WL.$gQKAl(sar(ێbPU([l60P cЄNgEw*9 T7MvuTNX>LO _Q7~7V\C[X=ϝRYed2&^4v1!`5u\0NB=dG[Q`_0fBGD[QU˨+[e=.r܍@,q +H xkfq邓{8XB 3T'<qF lMFj3BnUCxB¹6wα?K6H}|Yw./ڜZȥcla݁]ӓ<[̴.$ц|JR +GOS%Tg5 i<)jۭ븡_8/bUHp.铫$I +(ÍEe !9{}l3!Zv (zay +eҷΓTT>|{dkFcf%c֑J;)>ӯR6yܩ0''mO'PQ0geͳ]*)dc ca DDAfx hJMFm[mMNB|d'6b;fƄ$$4V9$Z#^Þ}S6/<58n[*Jz$qwPJWx[$'qJNgm I)yA)u.FtcSu1F L9|wjB @猗:{0әyڤ.c#[z*T52S_hdG_oG +m>,{壹J:w W%''rc̷ޝnо(WWݟ~O˷'|goW~>zDy ?ʧ}4@M'nc1\= գU͋W/L|˿^<+o?x_~^wajp[#;:Č݉4+}cUDkKZY <.,>}_\o+(@55TC|ҁ5yGM9@q`IDn +=@Pi/x47#Q أMh&yfXmUf5jVϜm}ԲhMvFsqv~b GANU`%JTNՀ[SKjrm6cjtKX x^iZ-4FNip G>\zrjZ3: JMG4tڶ[[?}0K /˟s_fl?g,/I)exlUHa7 Z|煇RxFS,(p,2V*ZV&7:>YpRL߽7A- )L W!}+/f\) +G='^X8cQBDPhI p" $8# +xm?#Z4I O(y _YE:XHw_Xz>Cv3$LW`䘃$RlL +E` c/-LqURj#ʸ(lȜy8j^cӑ FA+O`*e1GϺuQ|脱dWOFҲ]yAT*Y 94JPĵA´ ݍ9;T} $煱a#S̑2Dp9K۩.3s +I +vCP{l6U{jrnL1H"LņXNmdLaR塵.ܾ0. hO.n1Ro:&gX]aiY-w\m#:ܳڨ"nR!\X/~!KD#ɧgVqcÐ~䙾h MʘNk7֜'ķG['j=STjBsK&:xF5O']Å}WECqWkeW0q}b-%-$RMdi@UɈFRեXگqNNjN? x IЄzr@Cv$X )J +YZ8rm2pZ!Ɣn(k?h9wjv/Pl/vA"q遀靪9$B'xine 3:AFf~FRt=l;#9$R6~"SF,qP- ґnA[E4ŁlR4Oe(j|bVњՑsI^d||E 3B (IucbkbL[oU3Ս\.edu"'$ÍɫatApCxEiNpA04 a)m7Yh$:]mײ 0 A9tL"ԃ`;O +?b )i$1E')@^mpX?Jx"5/ӽFJ#ĞLI' ]`vUo,='4M!X `7^.?+gAI`&[8p>.NRcjwbTˋm ߶EΆ%'ۑ,C e +`ԙ=/V/ Ȫpny-ѹ PO`k< 0f# ] r#x.7cPf]Vt3xXbqc-\Ltk\ֶ-w bFn%@OP5aivZSS[$ӊ0[6rXŋ" H\g('Qy\1[D p|7ԙ"Bpž{hfn OadǬ&Y߅ew giHH{xi_=Ͼ 1J!SXoePF: u~I,SR6W`BBۻTnJKdO%fZzVptƎ8Ǔ U[ hv <u 'f {i|^lNxΓ50DKEzNZ MCnhc%f$й2X%uZk@O Lqn9)~B"# bbR@ ilFUm'Ds4Tm)qz[UsЧ;ɰ?aw&۟MMsB|tLY\Y;`jMST[A|4N<4OYj +zCZ +3Ilk) !KE fбuEx? 9]mS39|~ow'a3Y~7q`MSb@>  H(RڟăPzR5M5Ք# Wyr=c`.0 endstream endobj 16 0 obj <>stream +HW__7|R֞?¶9߇O_=雷߼ǟ{r#,ϱ$!ӓ¥;J1%}1X>I >~/|/߾y}cb='ǯwyt/e{YZkm2~GNJi.''F=N#S:'yLUF%щۨMvZ-ݘ)% G=pi1[]6rtCTÆ4VS +8])ԍzij,liBpCp$/VE9kzVQÚOcE j)'b3q6>kky z*:[Y32bb Ϲڪ5_F(F|f0.CH%tX t#Z[a1TPZ x3okYpjʳUU1sTV/Mt4cc6"+SQ3@9LS͎d}DLc~~ Sm{|fMn]̏?xv"t%VFU@ZQ<ؠad ( X$y&IwLWeuca l8DJ +&F^S bm`JĢwbaUx"-vGjuкd1`ɉUJVk@PݚF|Q8*k|SDQoGa lR c]r)q4:Ѝ5*V>FxmК.jԅgwh[ +hja>XVdʩio溚|ilQ) Znm*\j(Q-mrSc㮧g99-P[>f[ F` sQ=Zbu Rx r<(J34Uuҏ]C87-Zɍ JnJms84iā|CUY+vbBx% ha4C/$ 4+(>Z +qiη|@1 )\W-1GR}jO%BZO4K5QTYlUhji>y'2+&|1x$r\8%㎒F ?H}I;}y#[ƉnDgz77ŐŃ0}"XgL,xrIŐPtd+ǖ=C FР@6K K(ݶMsG_t>p0l0*J M: T63X&ƴRT[!)*ͫ~} !T9ݘ$2OadWoȑܟWͥ'NtxdȓE-̦J=9=sjNJOuR[Xx驤p4ql b[2} (hG ^(:fa W;Q{R.).M#̹&B(9t oH̙-HD_7; UZ Y#D[oX)uLR#e %Ӡ%$`Q" rP1J2o&7⪤0dWDL4M@C;/ 6Stu;¾^"׌ [p@-7OC]cc=hMo.6zٕ4fp,<x0ѡH<]ۃwVc@ok1K%y)jbyӸSZ} qTqgz: ż4πPyps˾Z9!.c$] 9{r M9XRRxbٲ G&׀;E.u 7-pgR1x+C{%y]$*)?e j*0Y1- ޷ BY&بUxَ>7pi2(Rz.+C/Q>j ԧ +ŏT +Gֆ"5FU#4 w4S*JQwaѼos= Oѧ ՀL,0m_w]I{#ウ0v骎CDμOi9ڬ_,>ҫjw}+r;l}~olg?^n;{yo|86pWX`":T4p`ߺ㏟=<</~\N&Ϝۻ˛W0m_^^̈́ތ4]9l_b}p .AYUHt|+(6嘔v嚂[hx_o7, >۾v@[' APx]ΧU)c JM挙ӀmC#!^m> <;> O[']o|™˿pNa6Z$1T„8UVqt؂965pYR\T8V=nP8mOI~)̰O#i ^6C(Մ2G F>nPRz]3vl,JfVuYzAw `uߠnԌ4.'1jfO9FcVMlYuF|\eYbaBF/@c~' Y'w5`Ld_LVuRI\Zi" іH\ `IGt}-Ә}ǨۡSqLMcmFn%i]bH aNW&6jCK*zѩfbB('GChYȭ腌:fxQ3U-!_WY-HsICȧ ҧ _54¢]SkupR+{ 4| H*'NYޙDMxn|[c:7 GB}U7mؒ[*c(/H=E],(^u +CuG.fa =o8Ð5XDȴKk0CWDU2B;5!ZㆆƉj qEu2-`q,N +ccA{{kt"6ޝ,p70NmI͕훖4*i0F゙7bd&DsK0遹f'(iKsbESNf6c@eV6Q٠C@!8q_] Sw 9h(o46GVutGӬԠ) rֱxadӑ ̥?GYQ׉SRp+,;|{YF֖8\m8R(+)E05\'lZEKVgSiy1>vvv8|NZFO'RAXWfs=Tnq,z cdf28շb7O'ˁt3%A)hSVUbԖ<%qd,Z Z15bG|iZWLGj=szMK))DhYp u`'jNv |zPə'ĖDؼx$QlC0l_K TcKlfdz۳;v0-d>R,b1٭Qĥhdѐ8N>XKՇl:2FN >_}Pfg6/E4DZ/X3Y> Z#-CM&Hҟ=E*pfr8'`=x?IfuiЉ4CX}\ yB V9ĻQVev:nKhlskKb8u0 YRb!K]Ξ-IH}7b66Rd PuVlG8U6Su^-֯Xwkno{A_fdFm-> "w˛7^/ʸ sb{SPg\Mc ijbkj ԯ$i{Nvn-/:¬pԣ.O ny|u(FqvaC7G!8v5b1c![wZPf[ vűp5EJݱ w'UBL(B+,FP~sN Cx/~I,sQQW+cS(ޫy]CiQ43 ñF")/~F^=uq]wI{ 6% ~̳{qnN/.qGJ]+nM<ОrA$pE䫉+y ɠ {~Df:`M?0E +bCK)p)kݘ…7\ Gr],X2@KWhDIl`X\}>FP90?#1UBg?l 8ds 6߅ 4}gՂ!3d# +*1v@*x9?}b|?V ֛mT#J^Ԕ(3ƾK +6%=np +;i00潌@ ;Qf_oL}/d)r/~܆nhA_N7kۃW'_>,>=\B % #d_5 K|HgO>./o@!6? +{XKM}6*1_ʹ߻DZP0;>YG[ !124.܎V2"0H7ʓsqm9#u. :w?@_.sޟ͑o{~qݧO/Ogןv7gh95~i@!0\L0 |@(^W6I-|?7,-or޾:@B2P8ZGHuɀZIN ٔQBP^Z7σ+2E>\{ɓÓWc}vj#I4v&HaaGIeܨ̋+Ov}ƻ2@\x_vrt.S*H`߂Tv̘"waJTgC!>w#GmTzVtb=ߧAV.'_R'I0!t:U \;<( &hP34(&cMpP R-gK]"n"E].Q1(oJq?\&%&=|FLuB*kQ +HJ +H_ kMk]ATsUօ\'zr+Xb]$ؚSt~jY1VR!8>bB54Xrj +BF:ͨ'kS*:ZpNUtnX*R}+ +A0V"z`hWciuTuT,cξy Uɫ[ X,k=),`ZFFEBF&F-ց7c̴: +h9uD e]aXjs+ÉڜR-.T 5_Cj`=7=$yz~ģ7WK*tr;=ݧ/vW %P 7΄(\< ]> ޠλ}Vi- {Qr tk%EȺ% ښ%hՉP +p5=LӅ/T [)bD=3) GogdEѿi/+ +?ACO"~B$H "0N Ϻ:#ԙXvT{oAE_@FוPIZP}F͟:?pA`\J[WU0O8= Vi`,v$Q_)] Zija*h)E7w7uc1 ZjWM.N2 ;D`0sq/:Y;.GďP)9T8 zoc~aznqVLO{{EG(XOZ'{5yX^5HG-X:S 7pwݒ1sCma -@Λ5-'oPV9Ooz%F+>l0Q^_pͿ %)FN +NY2L,*`WPB=;q$oM18+dCcUqTYGw, + *.3禷X´.J"Ɔ,v L} \U' \>[e@8f&$haoJKv~l}ҚepՁȵATikʵw(oXdjO74rna?: fG/Mi}u`r݉')NA\3tG^w ʠ5^H!%(q 605{,ŎcEV{v(gi$Y *~/n"6ܔ-"6qGԧ$.۾RbU22>н@*@w7jޫ +NX + q>pHWa`->[U(CB=aL|Nxvmf8E4N^-Vn BgeVp|^7#,(DxC JnCtUU;#Sܜ @NDd7;_fL `%%vo/6k $['O!HrDۨ5W*2_FH};xvMS?vՅl5L"q8qmrE.H+\H" +é\"f9Jj5+9sW֢BU*+gE`Z;!QբY. 9%` |[r^ +9C 1ևk A~-MXDNK;[H55cW^8"c[ +F}8^=Dg~sȥuIݯ0z\"t2,ES_׹tlpߘq\dfzhcrB-b[d\$݅m<#ׯq姛=O}$JBuS &AV(=@S>/)3f*bhhl :}%j)f;Nq!e؜UKaRm(8QX6g٭wmq,7ҊʏhyCIln˚{C@A%k1)UWy^I U+Ar 7OBlkbmC5_TVo{~H(+`ZXv2k6u +)σ"O) 9&Nrd5p +Dy;(; IJVI#~;1+8lj +Ϟf·vy^ +o~ȼi  :]Ntn:bCpޏgOkeH Y;*l8 &냵"%1N ʕR #9>QWࠨӵS5›cu9/c(Nj XKJ9gP~LMSa }A'~t@|/8ɮWzuKcVb:-C=ఁ} }E?۠r6[.@qyCH)c:8֬WL׉ I}-U!E@oY ivZw6G9h=/JGJH#Hk5I!':=9lR1~6ԑ9h׈/&-G%'V)]҆}5-@"~sLP;( +xE A)5Y MyU8@1}DajRI: +&4p9ˢL1\Q8cDⒻ"CX<`Ϛ˸cx9E Њ,^\pWjY=#YR(78m"]@1bn/5޺IdN$ ڱ94YU 5HL"iPWR器iXmY X65iw5n"i2[x%d2*mi~SW,ms*:#_sЁ{FP8g IpKyXx$"z-^ J0@*reO  t\cBF{XyM@@BBLf_L0}tbgFmMj7{)qļ0;v8 @D3 U ݋ʉڬ=qt=ë*o JQe)jm!+0э *)43iRoX +m9[,J('" 'd7kp@ S\ePC 4F,8πUTV !=npI&'K9m>݁7GKM}jpr&Z&"TTi-7T "Dy4א 3YJ\Pb,X4b4+=[ZIS[GSt 9yl\R9Or/NWZ2/c~,z 3H(6J"D }tc/e~-j *re/}Ҍ[{[KLEAif2 f B-HE `AdQMvjX#Eg\udO ֱf((m81;DlB:Ɬ2X0*Bi[{Էw>~yr'"{A,`y!>wKg\NX~v5\A`-}2"\*0r\55?XqhAqXJ/dEmXH'"`2wک9:@:m/4 #b<ȞfKI0k4ALQ_W?Ku7Vbx\^7ZZly$-+PK 'hbI|T{P_‰wB +VL2oo>jvCQb9#KKFpN=8qvYyIA Θ@ qSC%ktLk@e;$8I=ϩ?QoY$Yg,_0_> .A_a[ Z͊'ғ2vKI{8a,9x658Op{V},Dt$  dtgu` +!F.gC{|/g>ן>|?ٯ?~?ݷo/~_mO0o ҧ!1q2 ;dd!YVY=RlC!1ݻj\~?~?/x߽Kϗ_#._$_=Rr?P'wrV +Auht( {BӀ _P\*ɇ^x]ʟP4vۮpVǀnKXYA: +JQԒ`2kME@Xn] E~/c+zZLE zM4VVAF\nHpy7p x=U= jHjl,>;K}6}Y$#2.V (,D&j!U_\ +D$xB zZ\t ^IUKeVkXy2Q'By$af5`Wj/;!Cu_׭»"TPv#صi0N +eGAβawd'6عy:.=O5e8̅w(c5T mR*T4RqCtՐjGЗ_Z.M1Ϲ V52> O♻TUBƬ ,2M|7হ6J3+OP@GVE NV] PX +E<\,] +:d<> +xı8)QǿOnIpFF3rQ>r H S|HF zyt!sl/c!BWwl* hPq9FB^*L-# +8+7[@i]i<|XQ 1PvR&R\$fG_k*3LQ~H8CX{hp޸u^9QC꓾Hx!ӹ `>rxT6s\HLi.э +!]M^ fc) uR6NB@@K@y=v?{WP0-T[S'쳨7ȝjRKsk(d,j^<_/Py 2;7da~Is5 MKs +3PC kygXx'LbdN24%KBŖ}+]@Ћ/* w^ f mLt>'E%6na_0Cjm@ohjCI8o +#_KjP21pl &Y1Гģ#WHF|PJ1O5$p”`PbE_rcT0\+Un8UqRcmG!-<Dz&p'!zz>]Hj4£4}4Y1/c: A:im[ TUߓnVzHX&V0֕kyr GjY)kO?̂ekn-Vg`OH\Yo߯wS|[pTdRA~v9W>8zXtN#i :Ca4 +=o : A4ƟCs{NCCswY9 :@i9 84ܜEi9 5O7/n`-DZ@‘ӅFZPQyxg: +~M]WwN%/½}>9rJTBY6.U;:B2hv]DvU/df4%^x+(ة5E`ֺ +$V "`jėe9v=j_͎^h-w5 +|-4ۆKXjD+mt /+zh8TMq=p;ay50pX& z.o|af Z +?ǚᛈ O":/ +q%p!DN%6쬔򽖌;k + ;pm ATsnqtC9N-0|k*/]U^̜ݤ Yfǧ@Z & !Jd,Yl,|M!5wM}++>jƓcsGC{16ƞ&jT )es WuuGg7UWFaf=8AټmnڷV2Qo0f!ͱA^d%+ ,P'2rݠ>, +rR)r@7 xb#͈AhB4w@RS ZheAmq0QAU(U|4 YyDl9??p$({VR/%,tᲂQڸ1 +X| hIu5H`b7iKmZjh62"(d~88#%QBU˭&pY㋑RVJ߯1s#Jޔr[#D&\MW>Uq#-w#wNmw :[Pc2Q0@E[KGhioУWۨ 3V w8cIE; 7pft06>]s]b$&RxwmZc2]eǕ:0I +98x^/O(zuqKfM\_cܝ:X ɬ(9ӕc3ܴA#9ش>Wn7AW 4w[zD-0zyݦRnvu%(kk=& n, 8O G4n g58-WiZ\6VNMaoxym-L&HH&ަԜ͌{¨?pq[`ÿO'0[P或HǺNd#[ޖgc͢,igw_IA̚D;u9 bpG@"sy\r`.ܾ(U۵oo/E-5) +_,+RcP# +O}gt%zq͍WϞݽEn.;<(lICoGÿ9'jBaQS5]kBb{I\)9Q+zo%Kn2( /ԏ]&i.z}B6^>4͗f˾;VOoM(+Ga+'7Gv籫AEmudtlסH<׋oh2Lx35tYsT0^H}%l5>Yd( HQdߛ_$|1./hSzcHrpX_&RHox v~$`Dm/=N{Mʜ0B)_OWfiS,y Dz(鲋xbzY'9WqC+7B梟Y)}cTRp\skbM({ݎ%(|Ŷ(eEky* ;?g::9xwmIkHt9aa;aP_F<4&dhL{.UR';}}Pln>OYKLp褜\Ќ޶$@wڵFv}6}xӖsȶ *&vjjN>Jtxz ׯlW}#'s5Gz 0#ZYUh1`>;& +J+ײsQ%E2 Eڢӑ_f8Ol <Գ  6y6!e©>aV+?]9MүXMϏܣ⣱UMQ~&miw5F;գ'?%a.hlX/Qim-(+@妔<v7`3}0tvQF&V#0>uLg TV4:apmL5ym+iGc=4wgf 볯.1"fg̼glp?R~ޠ͒$f?c*['E!gjʧy.ò<j0QsGܲcň'CK4 `|wH~11E ړ`rCd;rOeĤx߆yBf 1v2(ە`Y.f{m.J7"UbsQ02 +rSA!N@uHcdeHV> ?ncثlVΔXӄ]6Jzn1>m8m꺎-7gh c8J@Gj3QYO {}I(F{R%JgT">A@D0J:l;s 0' c +3 5Xo @t+ H՛IJr@%}uP}{Şznkϊ=ՀejE1:?EĶΨg ;nA׀\ᖡ{؞$}q'm=[MyOnG@?,r_Ctmy}k@نuفe&eź}f+۰<Eԅt=%\en ǷKXॶnN+ v_d v$[r `mMsuqbPw> +h6.fCVЩt6s/cuN*-:E[qկȖp=~knN@J0~l?MaG-xd v3`,⸹`\B/mk + ٬, ^ЍxuB=RU@kD%5-USwW:Fwo0Iᓡ6l}2彾S(UqK7*s]M,) Z^~rÙt Exo vF#rb$Wwjh_;%6K#h 'ii=Fmh&?B9!=N]uq睥=gLIVִ39邐Y+rc Ec~R{LZ,+9Fy<=76O[΋<^ 2 "=8g-eRE.Id ojLA^.[g|Hح@O{ނ[?h9\s%}Zi+Eʃm @]COް$_؟E O#EK?^s7(nLےDp%efQ{9ܭdP,&e&' >F}+G%TE+r~[6=`11.G3s WvR0"_|h~I`/A޹~F[|;k}=6NmxYu:Bb='`M} ӗ.J삢Q3)pݿ"A.O˙yG] O]C*ZP.o4 8eO9& +]#0fN3ݐ%fL$vƀ!] f0xŒieow~,2,@Y Zkb08fUؐ 蟦mQyepD6k= +T.~Np]6s8-atfֽ1;̨} /ʸG 6+/x05|sTFY^E{V`}5ck+觙VnePf'% u;H:oIC \1\ז큵e V%RfS6BD~I6m=gY69$p +F> +Fڻ4O%YdS{)M.ӭX)=pgלQ8)p6e0ƽG/<$ ﳉjTVUB iX9YҼ ,>)^xclxMFLo'FcY5s82_ih(۸iz6 P0n~.'$ޘXUtdTOF#]tJ`+ψ%kC -D8å?%A`_s'Ů3r'A / —@8Ѕ#2Z4%/ypZFCW3e5Rh;'*Gt[Y)UNݺ?5llYvc ce%>./z +Aֳcf`_a2.[81,\_B5KKwSX&J}⯅ ؘԨjԐi(Ll+x N3r[D93(]AE ^~Й +_U ]Hrx O0i4׊b9$0XIMA{P[s-ћxPw +ҁf\=;O@WTN3S)=K58wVKۇw:^x{\)7W'/OGۙ!BfK2H|{hTm6'\_t'&B!vd%&"ɬgt P]pr$l/8O ɖyX2u\)+C!,: l.,G\W+=JE^.VSEGTz<+_hn"%蘭(ЪV]Nɮ"@'_=Ss@ 5lE%q# ܗN`VABʹ\dbA; 2yOI‰Ao;]Q ɳ?G!AO_h&WWC{: 7J춧R23ul3UBoP^LNlX㶔:ͮHwٴQ_tY<4ЃQ!'T gbRx2%TP*K"rm?rIP>4db`Kd.?iI]-|vK,uz`:Th%4IO~ +|5Jhp 0 endstream endobj 17 0 obj <>stream +HtW^ |}' ǒ(RRq"Ez{sQco w p8Z1{ig6WW_x4sҎ)zh,*a%LJ8"PO-~Q類R?a긳ֳVm<-}.󔡴zՕuvxZ%ra\׺¿,z4)k4az#}d(F6T>pڣjmQ6{x EYie֋Q4V.67sF_/:\` +.h"R+1Ù ou65Yw{OPpT1ZmzJ}C9 +U'.Ow4?5Y\a {Doa,S'y=YaHV5b]2B +gG9PJz2:]/i!Eid0E}3i̓0C?Gira?J p0[ q5ek:7yZ#EU?vr+;?/?yw7ݾ|%Lx[__wo?<<~SxLJݻ?:O<߽}?Z8^^|uOn{ow=DNOW?r᪀9*s0f9W<"yQ~f!EK|]yE?~яg9^gW[@z p&kNy}xIU9m &h9ȫu7]ǢinM03lùr|f1]ɠY P X +?_ș]F]\$R$9~jE$ Qf4v"; Ԧ%g15)v$i/ t&4`xJKߺnz@݃+R^w-qE\hYPVHgp:fa`{aOG:gHEkwVVɔ]YaAcvi X<+ ?m.ج@F#*=/(ZYȰ7Kd MP@S_ +9jp3j +VQ M|z5޸E ._k-i 1P {aÌ6 +C6pxf^ m +9# 1&~ڇ8.+_"+:̶! #3,kX)^HA +տܛ-[Ӽ ,n.hZ/ `iGMsBk֦Q_ϠY +ECt##L#ePsa ”XW3AIQ< qm|Vk+K"ی$ hxIV;Pjia,v0ʅrEnMEN&+%ίZ8zAG;+uFtp 8;IΕfإdQF-]sDGX_K$,.#D#Y(Ps:r qL'!^Ehq-sv?vK\|90VG]iϱ CYx +ep r cf˧\H޴-@%fr7LPM@lH!0:QUx%/Rʺͷ8 \Zxz.ˬM4iu 4Zv3T(k!{hn== 2tbzrqGwףGYߩA]MTWK-(<<Ǟ:[X![wᵁ(ǹ_ӑ+  x|k#ԶytW$ dg_g*R:ŋ7 qS<8V4#MHWRKf3@# Z24H +B%r;j^{Oj!,uO*8i:)k % HQSi[ǢWaxvVa7_nZ9)Ïp],%EG+-PC|c`B֦G:䠵axBuu4W˪]g HF2lxāZH.\Z)VNZul\KlX49.jD"ɀ0` lZIjj)if0&'[[Nxr̡t6 5Y؀a5 +E풕Xŭ&Iz AfW#6@4UAF^!03ox==Mq{]Z;lL)g;K;vst\;s֮}"HR/V9AaCkrt@h=[&EeY.]Fw]+&2rS{X̢!@ a`Dv1Jh-o@1 Q6~UvbϿwJiZM F<<ʂdvR H +_;UKiF$UpVD#4^͇\Vc}*ؿz]aR7Sľ}{48_5lO;l)}0f&ۂb:ΌٳtqU^%CsX1nGYRj0``e\o${ZՃ(ޛ5!Zʆ+<1EQ.ebƎ"3K*[X#idi_JwhF"8 C_o]8v;X]'gNӚ/zl[Pl==knlG^oŴM̼ꘂZwxgPZ>jbIJyll9Kvխ[3y3./6Ew_:ۚZuAe \U +eTn CGTK1%yԟ;k-RfL4 +EÎ_5*gur>T+* Z|]t'~,~`on󳇡©܌nX)}w)A񡃠z42FӮ;:n0gwQ;x#Ω-C$HXp|V_kh|si:2bVSp#=sGwWGy.T|-w4apwߡbr Tk)w}X[ߔk]A 68ue}:3gl_=uY BB6Brgg2P:cl#jJ0MfW% UDžMz.s(qG%1aJ,f//+>.ϧ,hU~Th=)#^'UgV%Fw>TI5 +?{hy8. dPv?d!1 np/EPaV8:Eݔ՟v%/Rh*U~[S-kʐֆӞZ Ʉi@:֥nzlEVKmA/_ỳѿ.7e)7yɋaY'sUCsq}Ud 6J`B"^vU`$h8 (fmYҀyg/^ +_17zowwWw?H>/Q @SÇ̞îS&b?B觗x_^>K `ZR$>Y_:HށME;(mS[QAeK"ֳ$$dZqf!v( }h7[e `N$u.Yu%{NnR@"']wsӝVԵۙ+:eX=%n~J-0HKvf !]ɉWv yWb&T}EKK]ERXb螪P;KcڠB=k:k< Q3e73H;cr+۱1dd#rLN=t{|J^]HER= +sʻm$0w6J[ 0E@ 7bh] }e/D(}iӼ&.{!(0J1~z5o5Ɩ9;pG{uտǼ_Oٔ?'>$%ݻb(LLa5LЬ1*Fr~̒s0{6r-fD$ې|\Gz-'$v=gβq3sꡛz8 dpVD +A @5Խh NWMܘԬ +Y)v4{v^m@~*AL={pQ#jBf%(_mQ@OdJ_dTf5" a3u2&G,@o[*홐39Q|L r JJ!X5#F 㟨tZ/@>t[<)(\c)W&\l>-F*LtZGeO6e]R0Yl\.zX\9 .,% $sgrvdIaІ"Li[9o S4&BAW mFM4@mmCKл/kB Z؀j.DGe1Eh%RhouY d _P~lb |fU)cU( Aw]űvě!X ٚ&9۶7Kw""F{ިT‘4Ǟ_rd J]f7w'ؽu!0O[.6Zi8:W3K]Z8UNQfc2Ȩׯ߅(Ĕ '$3zzlW,sAu~qIk*ddQ{=o)S%B𥯥IZuFI0Hy"m?#L +:WőřjΤ:.gCYHEO%r>s߅۠0GP(agsY?][!%^0R' #/)AjSIV1U(fV4Xn4%h[V ,N, 74 *tm֧a/$Z|][aNN(÷2A:3np'q#|$oU`&^GJu!A]K^ oey(Ҽ-(h~M6G@:KUa|(Q~Y`ul\;ں>$'3Rʽ/nr5Z7@H=*iƯ_x 蜣BFT# +B.2YoZOKIoڈ(ƃjA +P?BZxZ7yO,hB tEcsKlC#L$Ku XA:Ѭso=2gdvJ?ۯ;.=Yܠ~J&+&uC(Ƣ ;,("uXgA/sc"~2v@m ֜?ӦA`R \gb/7Wv3@Zb^hפ +G4O&;!.İ:$+JXuG '*WΣ៞OwOgr)L[#-CL,(}zOFXJÇCGA)^@xGsݵ3& ҫ[W2$P% KYFgciDfLȼӄGN.GsҐͳۺU;HS|HPinw ~}ϕ7ecj3zm+g5ЗY@$= '4KZl8H"AD cIgȪy;,B$9IK ƓYF#A=`Ƶdi# +Yf!n‹䰈-ӼV5:$ =2:Yt(l`bLxmjkOl9+sɦ&s.y5Ky)XDSSLwF6ԭѨCchtNds۪w_]FKU aȟ&_+17Kh|a@1qDm(</Θ0Z nmw=fƤ4a^{E"-\t&O#pl*9W-MsYN\)H<p-T"ÞQ\ɦX Bcܬĝ'7L"q|4W+<iIsj8 v0)6>V")z-\}ew`?ቆg(cMp3#5r rۻdŀR}Q[1=VJ}@kcBm8]0_}GǬ/f^;$b2!ݯ ebo\XEĐi ib=68̊q HSoiE 늩"(ldc$q7q" pFz^Gثk9Zo~hO>b$!/Wvs z-[oW=EᰋXP\&/@$MoQNkGsy%X[ 4;.EgazEDL=^%VME򴾅Lr/_->Ӌ uDBk@4('Asd=[n r '2Gs$ywJ֌e%9Yh6i3bpmV&5kC9-`R 8}Ahup<>蹫 ۵-K`',?hRO\3NCWnb ! Uj3LPv:F:C18&pd֡- +@dp:֛Dm M"3nWN55F,~W;#/vPRƫLXʧ7gt*}#a=&q J\T]J0"Qu9!vPmx`܎Eieu, -"TK٪6Q.AЌ`=՜f:j9?6f¼1Hm^%=gڲT~/:Ƒ[ 63L{^Nu`.(š#hlb갽D=<_Z(BCE[q:kbCZO{c eb ?U69P:Vg ߥhpjLgx+a]u甪jr[ VHȢ@kߟ!ųɍHXVؽ eYܥ礚dv +-] O/MAT}9IF7! 0_Vsr)dnqe] m}+Num$5{"9X- Su,\Yw242MGz(wgK X6;w2Z_7ڃF4>:V[fz$pPv$Ir@*:,'ϣu;`dV,d&cE3Ip^w]tY߂C7+tޗ +`i+LɟIegEB ᳱtlc ?ncNKeF鋍1LݯwFW;wN`ohA+pO&z5vDDt?tdNjQg X#ΦߚiB NF?7o@IܧE/{8#Ag0d +bbg= ;w2w]fq)X~N "gxWFpEqcQx. X%p BҜ0JW8D'7:0qg Pwo)5 +EUf>h)+45Bxo[fyݏS45Jg^vȃNuymR4(@H> a1hѐVc.FGh_z`ӌ5>1/b%~\|΋"% T_{9αl3=SOڧ<܍"\#)6}'.oW!.:8I=P'suFcK=l(R"i> ^,26W>Hb5RUw+(>ꡋpvkϛlpl+7f؝ `B4 }}JZp"QZkwkb3{ǒߍ7q8,3zc4if T_Lzr-X(KyިNVGnQiYӳÉZO[Uӱ\4xIǫyr87^KSc4h )l~x׼ p;$/V}E=,N aF2J\/IX^Cּ~5,X,&$;j1+H1@=$$R +DPR$+rQVmRgIzՋcfz]keVm#ՀR3yՓ -_YCFYc#2D +nrE1}yvXq$֣ CHnA䈣|7wY\LՒ)lZU7ʈ&JXj%yg2c5hvFkCVr_v`s>GV$^LuSq5BluS + Q"-v $cٱr5!~v.-WFJ +?pG3nȧ[|(K}\LY>W(gtW4*GM̐%xj͈SMzhhQ`/sG<]6Q~_bn}L>g@f Gqh攜Rj xhw^tATJՒGcjLbRס3Z\> WCK m|=ڲ;[S,"`0ošCHo̔ȫ!q$g 8P=t櫼DWtS)o\q5ưL9w~;LeKffjr5]-IU[A~8 +cz|5h>+ nq6G٢zU0# 69AY9B[*L Od ,jpHz;s5 C`bbt&l%f-S(sG]zB(Y-F%=MSS!3`ZRE^K~R|\C@T=R,H4id)ƁkU[ =xHK0rFĠڷ(BSNkha@ HNFb|*6v1 xS^ %ex{FM)9Ɲ$b"t) +׭b|bܚiDGw4ӂ5#*X[+$|!X+A>$eW#wb(t τoO0A7ZHedCF[MPC8~3vMoBIS=?[aK(FjCwE ~aŀ1Q%e_V$.j" lr) Qk-ePaʪMrQҧRx!Q՚-3w ڳA6 Z5pTfJ@ ֱmk %/&Kֵ Brgцr+"AUNvSxd2"Czsz?TBĔ8w)hĸ;=>ͳwhw,Hd$ !FBE ʌy3((6OeWmjZ-jo&9$)mC5.#Y /RK\GV5mc1op+&L1$~,IuTB+J٠@TWI(A;WUy7:,k0*~$j (Fdjb4DnPYy,Nn{?V,\/0d+UڇE%oN 4l +r +Z=А +*3i5' s,aWO^:ZE@p[h: B]`7G3-%R4fݥ]] qyLEָyd6@^&ԸfJ'nѺˏ0<܇Wrp }a 䉙.^_~'ϯg/{q~|ˋOo7˳W7'b~|}{O~w8\.qy{by?dy+/yѤ⫫wû߽[W|;wjy|r?ꊇfws~Mçvbqxqb]-gdºt7>r} ^/` ߺ|_z6m}g'|TUw>~e}GѠ%l_%O&cvCc vYsO<'V/ 1cCܔHAKO'}%zKNSytIV|ؙ?ǬPLm{X7 3xL a=NA4Mn  +񗫋{^<~?P֓kD|)闇뷜ݯ._umJ YvAы8=id{ڢ( +Rl5dHr{?3$84i"H3| f%7ȷ;]7CfK 'B՞Ć-VqqgKlIսpdM/a%S7Uy*o +?J3E/!G @o]G5T~>8JwYC]" r;Y3/ؕޫAh TBI*"`/";`z78ޟ?/;r`:[uh}Ĭ l)w &Ϭ\=,*k`\rv=;kouJu"/<\c%Ľ*e%R/2VU\L%k=@Bb@:"Ye^rQt9/Õ:}--$+ZmzA^~J 1V<-֮8 7>}tBĂ8=6 Ch" B,xHC“.=܃!8!7$8R M)6l4}#|o?Q=` (.8'Ӥz,oqG^đ}R/-.;rU^ylQ?bB&U'ǃ^x?A8vQ0Ql"oR% :^IcR~ZJL#,G?@s^`lGX] {I9MzNP(ΖIglH{'kOg$NoN/R32 v|KƜBgu5ȧ-%L3:7LbS |E&;y=blp<ֳ;=v2|yKTnߟI72HxsrR5U5\HQG%5ϾV%JK,zGyR7[mJO5( mQ@k^I¥C@ ӥ;JWuקkK/NNY1X喩]޿~Ieʦ>$nܖwJq8 +8_ +pG89zǸ@V7rQ#[ڽb.=o^$ <^7mHA"CnЫbaQ͊UW ~_юw(n |0#,KAwGOkX_nx&yZ"O#;1;DZD'_ w!:ȣƆ +{ ⵀ |^pvPKx'\ژRjթPW4_U;228&hY]ͤu[0[չylGؙ$((mF0wGK>\',. + +oU|2tquk])2ůHѵӾum pc巽WEW5p|uYL* qiӤF)j*/b( \[<0X{ #8^7>`?&h -&k׮H=te1tEDcjhNj.p_Q!Ǣ%&Gv@G?y$&O3x>`' [ͼҴ +xi!o=l*fFd7Їb}V}O CpbmkR DZb\MhbeŖb] dx"JҮ0s1Y#Kr09hh_c`+BS!S% 13@ݾ_h*^uMqLM{Z5X`a%6Ue2oDGN:Ar ((%t.ב'C7C +Jڑ%- :LYU"V2NjMIdOr4ח~ŐjF9(RKDI(zP\x]-I{ݲH[C@##Z^z>~Az,޾tTݝ=Ӛ +$8x{v嘰dF3'tc =2F^DB݂Q J0mK>\|xpqA0MokteKҟNS1YlCNciRrT!Q JMLIWrmB%Nn!M.7 ʵMZk=HFyrIB:=31tXdhaӊ"HּNJ̓NEQq~M8ݙpĩ!zKk3toޖ, +¡X8k( _{:c\µOot#'M0=r%QGFЁK}} +5PsQ\aHBmLf%Ps.|wDM#ϥ@*=t< ȥ@'l;lL\ tXÿ"+qcazAǃ +[4h|{7\Eg;~4;|KkkpX;a퓵F&e~[es%Cd /P;pj2dUXzLŽ&҅\3pٜd'JPr'͘%U[O9 +Kڔ"dWR9QF.Spi'H."x9:^Q! NWĨxEZd +85)*2č?SȾ׺`E!^ܝ0 \KoR֒\|o]OT@O X+ 4&d$m'b}C~n2ov-Fx{ϦSyImWR{KԕNN'c'#7CkIS_\D=|QRo[(<- endstream endobj 28 0 obj <>stream +Hnߡo`ݩU皹bD!$H(HQ<@v"O?ս $6 +wG&j׮êu_B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B)Փ?L?-/l;;z~[޿~G&mKg?N}l>~ۗ-ys>~jfGo0;71{3 2'{xiV{x mK/}A[W!_|?7?A'SW~׿0;}J(K}2R+;g\_N%kR@X]Z(p>hcd,?O6Kĝ-"|[@VΉc^ +HH%1%2bkcYeA8-ϱt}.~\8bZ_6nK1 +F {HY,5?o%J%$MCxYpwʽckeAֻ5WS*mգmݔ!md$6mM1*(UY.~VĘ4+0bP8ݴW޾0[BAu;ÒP*ҠDc} +ʹ0꼣ƏSt/i2 .qvӂ3N 7r/ݏMn-R ǗS'Zv@K u,+lu ǏIWgd=f$+u`p3ѭ-yG~T:ߢGi`RWY[eG$,UCtW.S +=&@RTOQpZ;agk%8TrL(uW%5wAc#fCKaHtXGDpp XKN `RJW!WC^c +fݰ)Gw_NR;d#AhZ=V9T4AAR#PS{&dj) aJ3n:M{9CFXz@ܲN,A0@gDFCw=4#ւ#chP2FiԽ[DnbX꾔C E o ;)oqp ԔlGv6c1ꚗs Dh^$JImyEd@1Q \F `F>VF:z*>ৠY3)ܸE*2=@7I$7pl. X/:c; Wx(W*Ӫ:tk۝ BεՓL6;r{ +Xgׁ_3T#fjOxÄ^ Ȅw7_p0/,AxG@x1){t3QG6y;Z<+yBdy9 & e~x`Cg1[iJ)!C1|R퍵}(ýqəV@v§MŽݙEZK RBCie1 q~ m}~LG$24QjUjeCVZLC .=6f}d>|nod-#&ײds'#[V:T4Ȁ?~gX˶iXgp}@jǡýKYrjsz`C,(!Q>< +0CzqEQ z"H1tCBij l9AϩjJVMι{m۞W*K RHD)é#J&a,|3MEJ0TSϝ2-7T0;M(I0fQـJk$[]]tIkQ~Yw - K(H5,6 8Qͥ9BD,8'$[s..O4J〦F),Z ZOn|e{Y!|wqM|)e=Dg +L܁㛧Zִ(ƈaJڕڢZW0z~KkKy[-#4sfݟ?+JP{"8"iteIyga)&DU AOTIpVTdF2\BT~WEe$;IȤ)@%os %z=V[|`r;=K $_'d +!{UVWZH]TAm59QiخxZQ`AnL]|}DtDh fPtn(.L?ttJiRJIN*.hTHeR:A +&3.zSuq +~MvC-zƫ-\/ u8XE* ĿD +2}/4VG'-h^e2ʨdq?cߞ YASp,s)o-j$1|l#*{EseppG-+RIey(f~@ +DCTʒGt"Uk[ڛDY[T-'XHievr::U[E!iGlt6QFFɓ|.)͜,1q +C6#7U,\=,f!Y:n +C fA9xs5ɠRt CM\HmIԋZӸIvފzq5Ar48K9VBn9㓶 @ͩ3ҬSt ҕyZz^MZ/Q?l'}qؤI(T7u Mah؝ٱf14CiCV{VTWj.AA6Sgͺ?w8FXF?q#1a!:<d]dQhI.fņcWPbOQџeL 8H(}R/Z#WUя(I|%ѺӮ[$ xl o7?iIk/k{Ў)Bi8f,cH9AvYcإ lqe4rB5ZjwEW;hp `Y'WnۉWysqƕI6d +]H1QE`P[!WÛڶpnZt#E0~#BZ1/63 ~W_o_y\WW7˷W?\fO/On3G'7 endstream endobj 51 0 obj <> endobj xref 0 56 0000000003 65535 f +0000000016 00000 n +0000038673 00000 n +0000000004 00001 f +0000000029 00000 f +0000038724 00000 n +0000161526 00000 n +0000161598 00000 n +0000162214 00000 n +0000216674 00000 n +0000247363 00000 n +0000289555 00000 n +0000331582 00000 n +0000360909 00000 n +0000378792 00000 n +0000382702 00000 n +0000397746 00000 n +0000421524 00000 n +0000163124 00000 n +0000178251 00000 n +0000186979 00000 n +0000197140 00000 n +0000223103 00000 n +0000267362 00000 n +0000311259 00000 n +0000353936 00000 n +0000374513 00000 n +0000382545 00000 n +0000442471 00000 n +0000000000 00001 f +0000159917 00000 n +0000044422 00000 n +0000044193 00000 n +0000044080 00000 n +0000159202 00000 n +0000160755 00000 n +0000160850 00000 n +0000159345 00000 n +0000160551 00000 n +0000160646 00000 n +0000159488 00000 n +0000160347 00000 n +0000160442 00000 n +0000159631 00000 n +0000160143 00000 n +0000160238 00000 n +0000159774 00000 n +0000159944 00000 n +0000160039 00000 n +0000044309 00000 n +0000039921 00000 n +0000447079 00000 n +0000160965 00000 n +0000161013 00000 n +0000043225 00000 n +0000000077 00000 n +trailer <<8B08712331A543208E3B6950530BAF8B>]>> startxref 447248 %%EOF \ No newline at end of file diff --git a/data/flarq.xpm b/data/flarq.xpm index 08d16c79..50935eb1 100644 --- a/data/flarq.xpm +++ b/data/flarq.xpm @@ -1,975 +1,210 @@ /* XPM */ static char * flarq_xpm[] = { -"48 48 924 2", -" c None", -". c #5B1E0E", -"+ c #7F381B", -"@ c #A7624B", -"# c #A8624E", -"$ c #652012", -"% c #90555F", -"& c #AA7A86", -"* c #D4B5BE", -"= c #5E231C", -"- c #540900", -"; c #AC5D55", -"> c #B4644F", -", c #CF7F58", -"' c #FCAD85", -") c #FBB18F", -"! c #BA7057", -"~ c #965140", -"{ c #4F1509", -"] c #3B1314", -"^ c #45151B", -"/ c #895156", -"( c #AB8687", -"_ c #D7C6C1", -": c #FFFFFD", -"< c #FFFFFE", -"[ c #A58088", -"} c #945D68", -"| c #642D34", -"1 c #AC6352", -"2 c #A45C49", -"3 c #A35B46", -"4 c #CC8C74", -"5 c #F4B8A0", -"6 c #FAC5A8", -"7 c #FFD4B3", -"8 c #FFD8B8", -"9 c #FFDCBD", -"0 c #FFCFAC", -"a c #E7A380", -"b c #A2563C", -"c c #984D37", -"d c #A2787A", -"e c #997474", -"f c #AA8B91", -"g c #D1C0C6", -"h c #CAB3BD", -"i c #FBE6F1", -"j c #F9FFFF", -"k c #F8FAFA", -"l c #FEFFFF", -"m c #F3F2EF", -"n c #E9D7D9", -"o c #AC9092", -"p c #AC8C8D", -"q c #926A6E", -"r c #9A737B", -"s c #9B747C", -"t c #9E573C", -"u c #98543D", -"v c #9A5F47", -"w c #BF8469", -"x c #E9AE90", -"y c #FFCAA8", -"z c #FFD9B6", -"A c #FFDFBA", -"B c #FDE1BA", -"C c #FDDEB8", -"D c #FEDBBB", -"E c #FBDBC3", -"F c #F8DBC5", -"G c #FFDCC3", -"H c #FFD1AF", -"I c #FBB891", -"J c #E79B74", -"K c #9A4E30", -"L c #9B5644", -"M c #7D4F54", -"N c #D0BCBE", -"O c #F5EDE7", -"P c #FCF4EE", -"Q c #FFFAFC", -"R c #FFFFFF", -"S c #C7BDC6", -"T c #C4B0BD", -"U c #F4F3F8", -"V c #FDFCFF", -"W c #FFFDFF", -"X c #F7FFFF", -"Y c #DEDCDC", -"Z c #E6E1E1", -"` c #FFFAF9", -" . c #FFF3F5", -".. c #FFF4F7", -"+. c #E2D9DA", -"@. c #C1AEB5", -"#. c #C5A3AF", -"$. c #7B5057", -"%. c #7D2F24", -"&. c #C87559", -"*. c #EA9464", -"=. c #FFA873", -"-. c #FFB886", -";. c #FFC193", -">. c #FBBD92", -",. c #FBBE92", -"'. c #F9B98A", -"). c #FAB784", -"!. c #F8AE77", -"~. c #F9AC76", -"{. c #F3A97B", -"]. c #F3BB97", -"^. c #FDD7BD", -"/. c #FEDCC3", -"(. c #FFDBB4", -"_. c #FED2A6", -":. c #FEBF94", -"<. c #E89574", -"[. c #D07355", -"}. c #C06F4F", -"|. c #C09581", -"1. c #F0F1E9", -"2. c #E8FBF4", -"3. c #EEF9F3", -"4. c #FDFDFE", -"5. c #FDF8FE", -"6. c #EFE7ED", -"7. c #A6969F", -"8. c #F2E9EF", -"9. c #F7F9F9", -"0. c #FEFDFF", -"a. c #B2A3AC", -"b. c #CBBFC7", -"c. c #FCFBFE", -"d. c #F9F6F8", -"e. c #F5F8F7", -"f. c #F6FFFF", -"g. c #69302D", -"h. c #5D0100", -"i. c #A0402C", -"j. c #CC7D59", -"k. c #BF6F4E", -"l. c #C16645", -"m. c #F6996A", -"n. c #FCA264", -"o. c #F8995F", -"p. c #F3925E", -"q. c #F29968", -"r. c #F29F71", -"s. c #E79469", -"t. c #C26640", -"u. c #CF6A43", -"v. c #FD9366", -"w. c #FF9B68", -"x. c #F99B63", -"y. c #F19F6E", -"z. c #EEAB80", -"A. c #F8C59B", -"B. c #FBD3AB", -"C. c #FCD2AA", -"D. c #FCD9B1", -"E. c #F8D1AA", -"F. c #F9C596", -"G. c #FFB371", -"H. c #FEAC6B", -"I. c #D69B78", -"J. c #EAD5D1", -"K. c #ECF6FA", -"L. c #F1FAFB", -"M. c #FFFBFF", -"N. c #FDF4FB", -"O. c #FDFAFB", -"P. c #D3CACE", -"Q. c #D8C7CE", -"R. c #F6FAF8", -"S. c #FEFCFF", -"T. c #C4B4C0", -"U. c #D3C8D3", -"V. c #FAFBFF", -"W. c #FBFBFF", -"X. c #FBFDFF", -"Y. c #F7FEFF", -"Z. c #F8DEDA", -"`. c #B76C57", -" + c #D76E4E", -".+ c #F89463", -"++ c #F9A36A", -"@+ c #FFB783", -"#+ c #F5A27A", -"$+ c #D0744E", -"%+ c #EB9060", -"&+ c #E68655", -"*+ c #EA8855", -"=+ c #F1935B", -"-+ c #F0975D", -";+ c #D27B43", -">+ c #E18450", -",+ c #E98B5A", -"'+ c #DD7C50", -")+ c #D07242", -"!+ c #F9A06A", -"~+ c #FFA771", -"{+ c #F6A26B", -"]+ c #EE9D67", -"^+ c #EEA26D", -"/+ c #F2AA77", -"(+ c #ECA776", -"_+ c #EDAC7B", -":+ c #EEB17D", -"<+ c #F1A55D", -"[+ c #FFA45C", -"}+ c #DC855E", -"|+ c #D9A3A2", -"1+ c #F5F0FC", -"2+ c #E9F7FA", -"3+ c #F6FDFE", -"4+ c #FDFBFE", -"5+ c #F8F9F9", -"6+ c #D1CFD0", -"7+ c #CCB9C0", -"8+ c #F9FAF9", -"9+ c #FBFAFC", -"0+ c #F7F0F5", -"a+ c #D7C6D1", -"b+ c #E7E0EB", -"c+ c #EAF4FB", -"d+ c #F1F9FD", -"e+ c #F9FEFF", -"f+ c #F2FCFB", -"g+ c #F6F5F5", -"h+ c #CA9E8E", -"i+ c #F4A27A", -"j+ c #FAA77A", -"k+ c #F6B280", -"l+ c #F5C896", -"m+ c #FED8AD", -"n+ c #FFCFAB", -"o+ c #FFCCA8", -"p+ c #F8C39B", -"q+ c #F5BC9C", -"r+ c #F2B48F", -"s+ c #ECA878", -"t+ c #F3A86C", -"u+ c #FCAA68", -"v+ c #FAA664", -"w+ c #F9A76A", -"x+ c #EC9B65", -"y+ c #D38048", -"z+ c #E69056", -"A+ c #E0874E", -"B+ c #FAA26B", -"C+ c #FAA470", -"D+ c #F5A06F", -"E+ c #F59E6A", -"F+ c #FA9C62", -"G+ c #F99A5D", -"H+ c #F49E6C", -"I+ c #F89E63", -"J+ c #FF9D5E", -"K+ c #ED8F64", -"L+ c #B67466", -"M+ c #F5EBF0", -"N+ c #E4F6F9", -"O+ c #EAFCFA", -"P+ c #FDFFFF", -"Q+ c #F5F8F8", -"R+ c #E6E6E7", -"S+ c #BEAAB2", -"T+ c #E9E2E6", -"U+ c #FCF9FB", -"V+ c #DFCFD2", -"W+ c #C4AEB7", -"X+ c #FAF0F9", -"Y+ c #EAF0F6", -"Z+ c #F3F8FC", -"`+ c #FBFEFF", -" @ c #F8F9F8", -".@ c #EADFDD", -"+@ c #B47A60", -"@@ c #E99560", -"#@ c #F3BB8E", -"$@ c #FDD8B6", -"%@ c #FFDDC1", -"&@ c #FDCFB2", -"*@ c #FECEAD", -"=@ c #FBD0A7", -"-@ c #F7D3A7", -";@ c #FAD1AA", -">@ c #F9CAA1", -",@ c #F8C392", -"'@ c #FAB179", -")@ c #F9A468", -"!@ c #F9A166", -"~@ c #F69F67", -"{@ c #F9A470", -"]@ c #FDA56E", -"^@ c #F69A5A", -"/@ c #D37536", -"(@ c #D1753D", -"_@ c #EF9868", -":@ c #F8A67A", -"<@ c #F39F71", -"[@ c #FB9E68", -"}@ c #FF9D60", -"|@ c #FA9C65", -"1@ c #FAA06B", -"2@ c #FA9C63", -"3@ c #FDA26C", -"4@ c #D5926E", -"5@ c #F2DFDA", -"6@ c #F0F3FD", -"7@ c #EDF3F8", -"8@ c #FEFCFC", -"9@ c #F9FAFA", -"0@ c #F3F4F6", -"a@ c #A2929B", -"b@ c #C0B1BA", -"c@ c #C4B0B0", -"d@ c #AC9398", -"e@ c #FEF1F8", -"f@ c #EEF2F7", -"g@ c #F2F3F8", -"h@ c #FEF9FB", -"i@ c #FBF2F0", -"j@ c #EFD9D8", -"k@ c #E09D81", -"l@ c #F0A268", -"m@ c #F9CCA1", -"n@ c #FDD3B7", -"o@ c #F2B094", -"p@ c #F3A377", -"q@ c #F5A66E", -"r@ c #F4A873", -"s@ c #F3A476", -"t@ c #F4A66D", -"u@ c #F6A367", -"v@ c #F9A269", -"w@ c #FBA169", -"x@ c #FD9F69", -"y@ c #FC9F69", -"z@ c #FC9F68", -"A@ c #F99F65", -"B@ c #F4A471", -"C@ c #F9B385", -"D@ c #F6A36E", -"E@ c #F19359", -"F@ c #D1743D", -"G@ c #E3905E", -"H@ c #F5A370", -"I@ c #F59F69", -"J@ c #FAA062", -"K@ c #FBA05E", -"L@ c #F8A26B", -"M@ c #F9A46F", -"N@ c #FAA160", -"O@ c #EA9C62", -"P@ c #C3998A", -"Q@ c #F7EBFA", -"R@ c #EEEAF8", -"S@ c #F6F4F6", -"T@ c #FCFEFF", -"U@ c #F4F4F7", -"V@ c #E4DCE3", -"W@ c #D4C1CD", -"X@ c #F2F5FA", -"Y@ c #AEA19F", -"Z@ c #C2B0B5", -"`@ c #F9F8FC", -" # c #E5F2F8", -".# c #EAF5FB", -"+# c #F0F5F5", -"@# c #F9F7F7", -"## c #D3B3A9", -"$# c #DF916B", -"%# c #FAA76E", -"&# c #F3B787", -"*# c #F0AE84", -"=# c #EE9D6B", -"-# c #F6A15D", -";# c #F7A559", -"># c #F9A160", -",# c #FE9B68", -"'# c #FD9D67", -")# c #FC9F67", -"!# c #FA9F69", -"~# c #F9A06C", -"{# c #F69F6A", -"]# c #F5A067", -"^# c #F9A464", -"/# c #F5A35C", -"(# c #E9A779", -"_# c #F8D5C1", -":# c #FFCEAA", -"<# c #FAB079", -"[# c #E1884B", -"}# c #CD713A", -"|# c #F39961", -"1# c #FAA56C", -"2# c #F8A668", -"3# c #FFA864", -"4# c #EF9965", -"5# c #E59462", -"6# c #FBA360", -"7# c #F49958", -"8# c #BE8469", -"9# c #E7DAE0", -"0# c #EFF2FB", -"a# c #EBF0F3", -"b# c #FBFEFE", -"c# c #F6F6FA", -"d# c #FAF3FA", -"e# c #B7A0AF", -"f# c #C4C0C8", -"g# c #D4CECD", -"h# c #DED5DD", -"i# c #EEF5FC", -"j# c #E4F0FD", -"k# c #E6F2FC", -"l# c #EBF5FB", -"m# c #EAE0E9", -"n# c #B67A69", -"o# c #ED8F5B", -"p# c #FCA368", -"q# c #F59E66", -"r# c #F9A067", -"s# c #F9A165", -"t# c #F99F66", -"u# c #FAA069", -"v# c #FAA169", -"w# c #FAA166", -"x# c #F8A264", -"y# c #F7A262", -"z# c #F9A162", -"A# c #F59E5E", -"B# c #FCA464", -"C# c #F0A172", -"D# c #F8C7AA", -"E# c #FFDFBE", -"F# c #F7D7AF", -"G# c #F7C497", -"H# c #F19C6B", -"I# c #DC7947", -"J# c #E48552", -"K# c #DD8553", -"L# c #BF6033", -"M# c #E28B60", -"N# c #E99B6D", -"O# c #F2A367", -"P# c #FA9F60", -"Q# c #E89874", -"R# c #E2CBBF", -"S# c #E9F6F7", -"T# c #EAF1FA", -"U# c #F6F6FB", -"V# c #FAF9FC", -"W# c #F9F1FA", -"X# c #BBABB5", -"Y# c #BDAEB7", -"Z# c #DDCBCC", -"`# c #FBF1F9", -" $ c #EFEAF7", -".$ c #E9EFFC", -"+$ c #EAF0FC", -"@$ c #F1F6FE", -"#$ c #E2CDCB", -"$$ c #D28869", -"%$ c #FFA26B", -"&$ c #F99F64", -"*$ c #FAA065", -"=$ c #FAA167", -"-$ c #FAA168", -";$ c #F9A066", -">$ c #F7A168", -",$ c #F7A167", -"'$ c #F7A165", -")$ c #F9A163", -"!$ c #FB9F63", -"~$ c #FA9E65", -"{$ c #F89D64", -"]$ c #FEA667", -"^$ c #F4B072", -"/$ c #FBD2AB", -"($ c #FBDFCB", -"_$ c #F9DECA", -":$ c #FBCBAA", -"<$ c #EFA579", -"[$ c #D3764B", -"}$ c #AE4621", -"|$ c #EA865A", -"1$ c #F8A674", -"2$ c #F8A16F", -"3$ c #FAA66A", -"4$ c #E38A65", -"5$ c #D5AFA0", -"6$ c #F1FDFF", -"7$ c #E9EFFF", -"8$ c #EEEDFC", -"9$ c #F5F4FD", -"0$ c #F0EDF6", -"a$ c #F5E9EF", -"b$ c #C6AFB4", -"c$ c #A28385", -"d$ c #FFF7FE", -"e$ c #F1E8F9", -"f$ c #EBEFF9", -"g$ c #EBEFFA", -"h$ c #F0EFF8", -"i$ c #D5B09E", -"j$ c #ED9B6E", -"k$ c #FDA168", -"l$ c #F89F66", -"m$ c #F89F65", -"n$ c #F6A066", -"o$ c #F5A166", -"p$ c #F6A065", -"q$ c #F8A065", -"r$ c #F9A167", -"s$ c #FCA06A", -"t$ c #F99B68", -"u$ c #DA7F51", -"v$ c #E88B52", -"w$ c #F9A15D", -"x$ c #F1AF7D", -"y$ c #F8D0B1", -"z$ c #FBDCC7", -"A$ c #FDDEC9", -"B$ c #FED4B9", -"C$ c #FBBC9A", -"D$ c #E58C65", -"E$ c #DB794C", -"F$ c #F69F61", -"G$ c #FF9F61", -"H$ c #FD9D60", -"I$ c #FAA163", -"J$ c #F79C6E", -"K$ c #DCA289", -"L$ c #EAE3E3", -"M$ c #ECF2FF", -"N$ c #E7F0FB", -"O$ c #E7F3FA", -"P$ c #E7EFF2", -"Q$ c #FEF7F9", -"R$ c #B49DA0", -"S$ c #C0A5A8", -"T$ c #F7F6FB", -"U$ c #E9EAFB", -"V$ c #E9F0F8", -"W$ c #E9F0FA", -"X$ c #F5F1FA", -"Y$ c #DBAD8E", -"Z$ c #EF975E", -"`$ c #FBA16A", -" % c #F7A065", -".% c #F6A165", -"+% c #F6A067", -"@% c #F6A570", -"#% c #F4A673", -"$% c #EC9A6C", -"%% c #D1794A", -"&% c #E68752", -"*% c #FDA26F", -"=% c #F2A374", -"-% c #F9C29B", -";% c #FFE0C1", -">% c #FDDDBC", -",% c #F4C29D", -"'% c #E09266", -")% c #D67F46", -"!% c #FB9E5C", -"~% c #FF9D63", -"{% c #FBA972", -"]% c #CE805C", -"^% c #C8A39D", -"/% c #F2F5FD", -"(% c #EAF1F4", -"_% c #E6F2F3", -":% c #E6F5F4", -"<% c #E7F1F1", -"[% c #EAEDED", -"}% c #E6E0E3", -"|% c #E7F3F7", -"1% c #DEF1FD", -"2% c #E7F2FB", -"3% c #EBF3FB", -"4% c #E7D7DC", -"5% c #D5916A", -"6% c #FCA265", -"7% c #F89E68", -"8% c #F8A066", -"9% c #F29F67", -"0% c #EFA56E", -"a% c #FBC490", -"b% c #F6BC8A", -"c% c #E9A26E", -"d% c #D8834F", -"e% c #E58456", -"f% c #FF9B6E", -"g% c #FAA16D", -"h% c #EDB075", -"i% c #F3C790", -"j% c #FCD7AD", -"k% c #FED4B6", -"l% c #F6BB94", -"m% c #CE8350", -"n% c #D6854A", -"o% c #FBA16F", -"p% c #F39F6D", -"q% c #F1A86D", -"r% c #E89568", -"s% c #D79F8D", -"t% c #F4EDEE", -"u% c #F0EEF8", -"v% c #ECEEF6", -"w% c #ECEFF9", -"x% c #ECEDF7", -"y% c #F1F0FC", -"z% c #F0F4FA", -"A% c #E6F2F5", -"B% c #DCF5FD", -"C% c #E3EBF7", -"D% c #F9FBFF", -"E% c #C19A96", -"F% c #D57E55", -"G% c #FDA366", -"H% c #F99F67", -"I% c #F99F63", -"J% c #FA9F63", -"K% c #F99E64", -"L% c #F8A86F", -"M% c #F1A66F", -"N% c #F8B985", -"O% c #FDD4A2", -"P% c #F2BD89", -"Q% c #F5A971", -"R% c #E28955", -"S% c #D97847", -"T% c #F69962", -"U% c #F4A66A", -"V% c #E9A46A", -"W% c #F2AA79", -"X% c #F9AE84", -"Y% c #F6AB7C", -"Z% c #EA9B63", -"`% c #E49159", -" & c #FFA572", -".& c #FBA36B", -"+& c #F8A363", -"@& c #FFA66F", -"#& c #CE7F5A", -"$& c #E9CAC3", -"%& c #F2F3FF", -"&& c #EBEDFD", -"*& c #F1EFFF", -"=& c #F8F1FF", -"-& c #FAEFFE", -";& c #FDF8FF", -">& c #FCF4F9", -",& c #F4F9FA", -"'& c #F9F7FF", -")& c #FDE9EB", -"!& c #D99781", -"~& c #F59668", -"{& c #F8A165", -"]& c #F8A164", -"^& c #F7A063", -"/& c #F9A164", -"(& c #FBA069", -"_& c #D98350", -":& c #DA8954", -"<& c #E79A68", -"[& c #FAB887", -"}& c #F6B181", -"|& c #F5A46D", -"1& c #F4A15F", -"2& c #E6914E", -"3& c #D37D41", -"4& c #EA9569", -"5& c #F8A078", -"6& c #FC9E6C", -"7& c #FE9D5C", -"8& c #FF9F5B", -"9& c #FFA46B", -"0& c #E58B5F", -"a& c #F09769", -"b& c #F39562", -"c& c #F09762", -"d& c #EF9A6A", -"e& c #D67F58", -"f& c #BB8678", -"g& c #F6F6FF", -"h& c #F7F4FF", -"i& c #EADFE9", -"j& c #D8C4CE", -"k& c #DABEC8", -"l& c #E3C8DB", -"m& c #E9CAD1", -"n& c #ECD7D4", -"o& c #EEDFE4", -"p& c #B98787", -"q& c #D9805B", -"r& c #F9A266", -"s& c #F6A360", -"t& c #F79E64", -"u& c #F6A466", -"v& c #F6A465", -"w& c #F9A065", -"x& c #FD9E67", -"y& c #DC7E4D", -"z& c #C7693C", -"A& c #ED9167", -"B& c #F4976B", -"C& c #FBA160", -"D& c #FFAC67", -"E& c #F49B60", -"F& c #D6784A", -"G& c #E5895F", -"H& c #F09662", -"I& c #FFA866", -"J& c #FFAD6E", -"K& c #E07F5D", -"L& c #7B2B1B", -"M& c #853D24", -"N& c #963E27", -"O& c #8D472B", -"P& c #824730", -"Q& c #843A2A", -"R& c #712A23", -"S& c #BA9092", -"T& c #DABABA", -"U& c #8B6E6B", -"V& c #4D3232", -"W& c #5D2D3D", -"X& c #68353A", -"Y& c #734744", -"Z& c #6A4A4C", -"`& c #663235", -" * c #934833", -".* c #DF8766", -"+* c #F99766", -"@* c #FB9E61", -"#* c #FFA66E", -"$* c #FCA16D", -"%* c #F99E69", -"&* c #F7A169", -"** c #F3A266", -"=* c #F4A365", -"-* c #FB9F68", -";* c #F6A16A", -">* c #F6A16B", -",* c #FCA06C", -"'* c #FC9D69", -")* c #FF9D6B", -"!* c #FF9E6C", -"~* c #F69563", -"{* c #D67949", -"]* c #D47348", -"^* c #F79567", -"/* c #FA9F68", -"(* c #F9A265", -"_* c #FFA166", -":* c #FC9B65", -"<* c #E98D5B", -"[* c #C4683A", -"}* c #BE6339", -"|* c #B06D4E", -"1* c #732F25", -"2* c #64201E", -"3* c #8B463B", -"4* c #B6573A", -"5* c #D06B39", -"6* c #D37A42", -"7* c #F4986B", -"8* c #FC9C73", -"9* c #F99F6C", -"0* c #F4A766", -"a* c #F1A561", -"b* c #F49E63", -"c* c #FB9E6B", -"d* c #F7A069", -"e* c #F9A16A", -"f* c #FCA16C", -"g* c #FE9F6C", -"h* c #FFA06C", -"i* c #FBA468", -"j* c #F49D5F", -"k* c #ED925B", -"l* c #C86A3A", -"m* c #DF8653", -"n* c #FBA26F", -"o* c #F9A369", -"p* c #FFA673", -"q* c #F6936D", -"r* c #7C1705", -"s* c #7C3625", -"t* c #C76E51", -"u* c #DE7B53", -"v* c #CA693D", -"w* c #BF633B", -"x* c #E88C57", -"y* c #E98E54", -"z* c #F9A267", -"A* c #FEA86F", -"B* c #F4A167", -"C* c #F6A362", -"D* c #F19C5B", -"E* c #DD8848", -"F* c #E89255", -"G* c #E68F53", -"H* c #F49D63", -"I* c #FEA76D", -"J* c #FCA36A", -"K* c #FAA466", -"L* c #F29B5B", -"M* c #EC8E5C", -"N* c #DB8154", -"O* c #D6874F", -"P* c #E79659", -"Q* c #FFA778", -"R* c #D07B64", -"S* c #6E1913", -"T* c #6C1F18", -"U* c #963729", -"V* c #EC9366", -"W* c #FFB374", -"X* c #E98F56", -"Y* c #B24C23", -"Z* c #ED8661", -"`* c #E78B58", -" = c #FAA561", -".= c #F8A262", -"+= c #F6A164", -"@= c #F7A466", -"#= c #E49459", -"$= c #C16E36", -"%= c #E08C58", -"&= c #E1895C", -"*= c #EF9265", -"== c #FFA372", -"-= c #FEA36A", -";= c #F5A268", -">= c #F6AA6A", -",= c #DC8545", -"'= c #D47440", -")= c #C87153", -"!= c #69241A", -"~= c #AB5E46", -"{= c #E88666", -"]= c #E37B53", -"^= c #D26E43", -"/= c #F4996C", -"(= c #CC6C39", -"_= c #E5834A", -":= c #F39462", -"<= c #FA9F6F", -"[= c #F6A16D", -"}= c #F49F6B", -"|= c #F69E6D", -"1= c #DD7F55", -"2= c #C7653C", -"3= c #E7825E", -"4= c #E4895D", -"5= c #F1A364", -"6= c #FFAC66", -"7= c #FEA067", -"8= c #CD7151", -"9= c #6E2215", -"0= c #7F2427", -"a= c #902F20", -"b= c #E5895A", -"c= c #FFB175", -"d= c #F2915D", -"e= c #B7522B", -"f= c #C05D34", -"g= c #D67649", -"h= c #F69E68", -"i= c #FDA46B", -"j= c #FCA069", -"k= c #FFA46E", -"l= c #F49460", -"m= c #EB8E5D", -"n= c #D06F41", -"o= c #C9683C", -"p= c #D67D55", -"q= c #A55135", -"r= c #682616", -"s= c #8F4C2E", -"t= c #DE8C68", -"u= c #CA6E51", -"v= c #C4654C", -"w= c #FFA579", -"x= c #F09360", -"y= c #CC7345", -"z= c #DA844C", -"A= c #EE9556", -"B= c #F59D5E", -"C= c #FFB174", -"D= c #FFB075", -"E= c #FFB073", -"F= c #FFA472", -"G= c #B85D49", -"H= c #6C1515", -"I= c #8B5446", -"J= c #73251B", -"K= c #95402C", -"L= c #E48F68", -"M= c #FFAA79", -"N= c #F59D70", -"O= c #EB9061", -"P= c #E48A59", -"Q= c #C57046", -"R= c #B26340", -"S= c #B16947", -"T= c #B36943", -"U= c #A65D40", -"V= c #7B3629", -"W= c #6A230D", -"X= c #BA6848", -"Y= c #D57C5E", -"Z= c #D1745E", -"`= c #CE7260", -" - c #923C2D", -".- c #84382F", -"+- c #813F39", -"@- c #7B423B", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" . + @ # $ % & * ", -" = - ; > , ' ) ! ~ { ] ^ / ( _ : < ", -"[ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l ", -"m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W ", -"X Y Z ` ...+.@.#.$. %.&.*.=.-.;.>.,.'.).!.~.{.].^./.9 (._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.", -"R a.b.c.d.e.f.R W g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.", -"R T.U.V.W.X.Y.V Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+", -"0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+", -"V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@R ", -"c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@", -"Y@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_#:#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#", -"g#h#i#j#k#l#m#n#o#p#~@q#r#s#s#s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#", -"Z#`# $.$+$@$#$$$%$&$&$*$=$-$r#r#;$>$,$'$)$)$!$~${$]$^$/$($_$:$<$[$}$|$1$2$~@3$4$5$6$7$8$9$0$a$b$", -"c$d$e$f$g$h$i$j$k$A@;$=$;$;$l$m$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$", -"S$T$U$V$W$X$Y$Z$`$;$=$;$=$=$;$;$;$ % %.% %+%@%#%$%%%&%*%=%-%D ;%>%,%'%)%!%~%t#{%]%^%/%(%_%:%<%[%", -"}%|%1%2%3%4%5%6%7%r#=$m$;$;$=$;$8%&$&$q$+%9%0%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%", -"z%A%B%C%D%E%F%G%H%=$=$;$;$;$=$;$m$I%J%K%v@L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&=&-&", -";&>&,&'&)&!&~&{&]&;$;$;$;$;$;$;$;$^&/&K%(&_&:&<&[&}&|&1&2&3&4&5&6&7&8&9&0&a&b&c&d&e&f&g&h&i&j&k&", -"l&m&n&o&p&q&=.r&s&t&t&r$;$;$m$;$r$u&v&w&x&t$y&z&A&B&x@C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V& ", -"W&X&Y&Z&`& *.*+*@*#*$*%*&***=*A@-*;*>*,*'*)*!*~*{*]*^*/*(*_*:*<*[*}*|*1* 2* ", -" 3*4*5*6*7*8*9*0*a*b*c*d*e*f*g*h*z@i*j*k*l*m*n*8%o*p*q*r* ", -" s*t*u*v*w*x*y*z*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S* ", -" T*U*V*W*X*Y*Z*`* =.=+=@=#=$=%=&=*===-=;=>=,='=)=!= ", -" ~={=]=^=/=(=_=:=<=n*[=}=|=1=2=3=4=5=6=7=8=9= ", -" 0=a=b=c=d=e=f=g=o%h=i=j=k=l=m=n=o=p=q=r= ", -" s=t=u=v=w=x=y=z=A=B=C=D=E=F=G=H= ", -" I=J=K=L=M=N=O=P=Q=R=S=T=U=V= ", -" W=X=Y=Z=`= -.-+-@- ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" "}; +"48 48 157 2 ", +" c #010101", +". c #0B0B0B", +"X c #0F1010", +"o c #131414", +"O c #1B1C1C", +"+ c #242525", +"@ c #2B2B2C", +"# c #2F3030", +"$ c #333334", +"% c #3B3C3D", +"& c #00005B", +"* c #000163", +"= c #0D0D62", +"- c #00026C", +"; c #131365", +": c #1B1B69", +"> c #010373", +", c #00047C", +"< c #292A71", +"1 c #232376", +"2 c #3C3C7D", +"3 c #444445", +"4 c #474849", +"5 c #4A4B4C", +"6 c #535455", +"7 c #575859", +"8 c #5B5C5D", +"9 c #5E5F60", +"0 c #5F6061", +"q c #626364", +"w c #666768", +"e c #6B6C6D", +"r c #6E6F70", +"t c #6F7071", +"y c #727475", +"u c #767779", +"i c #777879", +"p c #7B7C7D", +"a c #CC9272", +"s c #CF9778", +"d c #CF997B", +"f c #D09A7D", +"g c #000483", +"h c #000589", +"j c #000693", +"k c #00079A", +"l c #00089E", +"z c #030BA4", +"x c #0009AA", +"c c #000AB4", +"v c #000BBA", +"b c #3539A3", +"n c #575787", +"m c #52528B", +"M c #686991", +"N c #6B6C9C", +"B c #000BC3", +"V c #000DCA", +"C c #000ED3", +"Z c #000EDB", +"A c #000FE0", +"S c #0010E5", +"D c #0011ED", +"F c #0E1EEC", +"G c #0011F2", +"H c #0013FE", +"J c #4B54DA", +"K c #7F8082", +"L c #828285", +"P c #858688", +"I c #87898A", +"U c #8A8C8D", +"Y c #8D8F90", +"T c #8F9192", +"R c #939495", +"E c #969799", +"W c #97999A", +"Q c #9B9C9E", +"! c #A59F9D", +"~ c #BAA498", +"^ c #8687A2", +"/ c #9E9FA2", +"( c #9D9EAA", +") c #8788BB", +"_ c #9A9BB4", +"` c #9EA0A1", +"' c #A2A3A4", +"] c #A5A6A9", +"[ c #A6A8AA", +"{ c #A9ABAD", +"} c #BBABA3", +"| c #BAB2AF", +" . c #ACAEB1", +".. c #B1AFB5", +"X. c #AFB1B3", +"o. c #B2B4B6", +"O. c #BEB6B2", +"+. c #B4B6B8", +"@. c #B7B8BA", +"#. c #BABBBC", +"$. c #D29E81", +"%. c #D3A185", +"&. c #D5A58A", +"*. c #D7A98E", +"=. c #C9A896", +"-. c #CAAC9B", +";. c #D6AB92", +":. c #D9AD94", +">. c #DAB097", +",. c #DCB39C", +"<. c #D7B7A3", +"1. c #DDB7A0", +"2. c #DEBAA3", +"3. c #DCBFAD", +"4. c #CEBEB4", +"5. c #E0BDA7", +"6. c #E1BEA9", +"7. c #D9C6BA", +"8. c #DDC2B1", +"9. c #E2C1AD", +"0. c #E4C6B2", +"q. c #E5C9B6", +"w. c #E7CCBA", +"e. c #E8CFBD", +"r. c #E9D0BF", +"t. c #B4B4C6", +"y. c #A3A6DF", +"u. c #B6BBFC", +"i. c #BFC1C3", +"p. c #C2C2C4", +"a. c #C8C9CB", +"s. c #D7CAC1", +"d. c #DBCEC5", +"f. c #CBCCD9", +"g. c #D2D2D3", +"h. c #DFD6D0", +"j. c #D7D8D9", +"k. c #DBDCDD", +"l. c #EAD4C3", +"z. c #E0D5CE", +"x. c #ECD7C8", +"c. c #EDDBCC", +"v. c #EFDED0", +"b. c #E4DFDB", +"n. c #E9E1DA", +"m. c #F0E1D4", +"M. c #F2E3D9", +"N. c #EBE8E5", +"B. c #E2E2E7", +"V. c #F0EFED", +"C. c #F2EBE5", +"Z. c #F2F0EF", +"A. c #F9F5F1", +"S. c #FBFAF7", +"D. c #FDFCFC", +"F. c #F3F4FB", +"G. c None", +/* pixels */ +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"H G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"H H H G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"D G H H H G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"V Z S G H H H G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.p.p.", +"c v V C A G H H H G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.v.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.i.i.#.+.", +"k z x v B C A D H H G.G.G.G.G.G.G.G.G.G.G.G.G.x.c.v.v.c.v.v.G.G.G.G.G.G.G.G.G.G.G.i.#.+.o.X.{ ' ", +", h j l x c B V Z F u.D.G.G.G.G.G.G.G.G.e.r.x.x.c.c.c.c.v.v.v.v.v.G.G.G.G.G.G.a.+.X.X.' ! ! W W ", +"- > h h j l z c B J F.A.M.G.G.G.G.v.v.r.0.q.w.q.q.x.x.x.x.c.c.v.v.v.v.v.G.G.D.g.{ ` ` W W T U I ", +"* * - > , h j l z y.S.M.c.v.v.v.v.v.c.0.9.9.9.9.3.0.e.e.r.x.x.c.c.v.c.v.m.m.V.j.W T Y I P P M p ", +"& & * * - - > h b B.C.x.x.x.x.c.c.c.x.w.9.2.5.5.2.9.q.q.q.w.r.r.x.x.x.x.c.v.N.k.R L K p i y t r ", +"& & & & & * - > ) Z.c.r.r.r.x.x.c.w.2.1.>.,.,.9.w.c.c.x.q.9.q.q.e.e.e.x.x.x.n.k.R u t r w w q 9 ", +"& & & & & & & 1 f.n.r.q.r.r.r.x.r.,.%.*.&.*.,.x.m.c.m.v.c.q.9.9.0.0.q.w.w.x.z.g./ w w 0 8 8 7 6 ", +"& & & & & & & N B.w.9.q.9.q.q.r.e.,.*.%.*.,.e.c.c.c.c.v.v.c.x.9.6.6.9.0.0.w.s.g.{ 9 7 6 6 5 4 4 ", +"& & & & & & ; t.z.9.9.9.9.9.q.q.q.q.0.0.q.r.x.r.x.x.x.x.c.v.v.x.0.5.2.6.6.6.7.a.o.8 5 4 3 3 % % ", +"& & & & & & m g.8.2.3.2.5.9.9.9.9.q.q.q.w.w.e.r.r.r.x.x.x.x.x.v.c.w.2.,.2.2.3.p.#.0 % % % $ $ $ ", +"& & & & & = _ s.,.,.,.5.5.5.5.5.9.9.9.9.0.q.q.w.w.e.r.r.r.x.x.x.x.c.l.,.,.,.1.#.@.r $ $ @ @ + + ", +"& & & & & 2 p.2.>.,.,.,.1.,.5.5.5.6.9.9.9.9.0.0.q.q.q.w.w.e.r.r.e.x.x.x.1.;.:.| o.K @ + + + O O ", +"& & & & & ^ 4.;.*.>.>.>.,.>.,.1.1.1.5.5.5.9.9.9.9.9.9.q.w.w.w.r.e.l.l.x.w.,.&.} { R @ O O o o o ", +"& & & & < o.=.*.*.*.*.*.:.>.>.>.,.,.,.1.1.1.1.9.9.9.9.9.9.9.9.q.w.w.w.w.l.w.:.~ ] Q $ o o o X . ", +"& & & & M 4.$.%.%.%.%.*.*.*.*.:.:.:.>.,.,.,.1.1.,.9.9.9.9.9.9.9.0.6.0.q.w.e.0.=.` / 4 . . . . ", +"& & & : ( o.G.f f %.%.%.%.&.*.*.*.:.:.:.:.,.,.,.,.,.,.2.,.9.9.9.6.2.6.0.0.0.e.3.! Q 9 . ", +"& & & n .G.G.G.G.f f %.f *.f *.*.:.*.*.*.:.:.:.>.>.,.,.,.,.9.2.5.5.1.5.9.0.0.0.~ R i . ", +"& & ; ^ G.G.G.G.G.G.*.f f f f f f f f *.&.*.*.*.:.:.:.>.,.,.,.,.1.1.5.,.1.6.6.9.-.R P o ", +"& & = G.G.G.G.G.G.G.1.*.f s s s f f :.*.&.&.&.*.&.*.:.:.:.>.,.>.1.>.1.1.,.,.5.6.G.G.G. ", +"& & G.G.G.G.G.G.G.G.5.:.f s s s *.5.9.5.*.f f f &.&.&.&.*.&.:.:.=.,.,.,.,.:.,.3.G.G.G.G. ", +"& & G.G.G.G.G.G.G.G.9.,.f a G.f *.e.0.6.:.$.>.5.:.%.%.%.*.*.*.*.%.=.:.:.:.:.G.G.G.G.G.G. ", +"& G.G.G.G.G.G.G.G.G.G.,.f a G.f *.6.5.,.&.:.e.e.9.*.%.f $.%.$.%.*.$.*.*.:.:.G.G.G.G.G.G.G. ", +"& G.G.G.G.G.G.G.G.G.G.G.G.G.G.a f %.%.%.%.:.r.e.5.6.q.,.$.s $.$.$.%.$.%.*.G.G.G.G.G.G.G.G.G. ", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.a a a a s a f ,.:.*.9.e.9.;.a s d f $.$.G.G.G.G.G.G.G.G.G.G.G. ", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.a a a a a a a a $.:.:.:.*.a a a d f G.G.G.G.G.G.G.G.G.G.G.G.G. ", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.a a a a a a a f %.f a a a G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.a a a a a a a a a a a G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.a a a G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.", +"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G." +}; diff --git a/data/mac/flarq.icns b/data/mac/flarq.icns index 996d622fac73863320d223057f63e855b3734a7f..968dba89bc77899941b27c0be3aeaeeadf92553e 100644 GIT binary patch literal 84251 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 literal 40835 zcmcG$b#zqc+b+BzP}=^Wf|gQBg;Il-Vr_9R7Bom8?jAzi_e>`4?wN_Z5)z0IAxhlc z-IK{!bk4QY?|t8O*7wI*=Z~`}B@8qBer}iRenwSZOP3&+R;qeOj}U}3ekKUv|J5%? zf_O$FJ`=tFNJh=bk(Hbpr_@yX*y|2%zJ z&fGbuBAXzkhqfxR>TIOpWK7rNkRli4x8p@wSu<#HU;zLOT zx}#4_R(ajOpOpXila9n^7wAPn?u_D%6`1s>k_5n<$HSzgJ+jswV_MR@oH83P5HMg>@Z^(mK9}pPm zK#(DXk2CR=$eD{*uH06p`S^Nz`A22f_6&BErH6aj>dDo|@GC%U?ofWv`OMy=c!Rt%;4-O&xr~g?7Yu_HV;&U&x7z zOQ?|k$(b2%a!Oi8ISccHjm59RoeY)4L`8qFB1E#|-UzLTeUDrmmF``>a8*?DxlKq? zR%umh-`KohVbRye)k;tC@i`A-qqVAuxtgsDv0WiJI^55}SW8Qn=9g01(9+dA%w8si zo0r+cjc+5IOf*!rb<-U2K388aYdu97MRjBQz~r};9fLExC7STVn3ynchMtnxS@-{W z=vLpD#Dr+3my?TESY}1{ID27fg(3WSb-F!2#>d{q-ps|Bp%XiPRdi0y$<4}0OHF%SP*Pr2 zQrXl$x5yA~tEsKXPYiamvv+cLwY9N#c5|`0?@8>WJGnaB+gdsL#pf26S5?sOXn=)%nlQ@!=2xyfO!)(i_H8nOSF94+W|MQu$*d3E!^)ZA2GQ*C|M1aEnD z1;2#-gMF=~uM^0~PopB3Axsu4B*0ykAnrP4I1(FAc(cO7SY*h@k;&N=jUD~NQ}c^< z!i_6S3xb6uE8&+bbHgpgFT(@5}oq6>fKbeCmkmvzl9 z3x%u8tEmuspf*$xzz)l<<;e7;p+TAV`X*wxPUI)ySm639U2+#uY2jCb@$9kNyq4% zy0U~o55Ks#EfWGO;is$1OUuhk0`~YoclW>~cZC%GXOYXEU84zJZG_t(vWelo_J-=3 zrtZ<{ndvDw4_&x}+h0>ySlu%%SYBQcuFiIpWWTK%5HN&$R_5Wa-2OZtt@}408wbBC zX{gRik5A05=w+`maH6F}K6|3SwdOtSd1hf%xVpsWaoBTn^IZPIB7KPfL)&nK>G8qt z&hEkS>8Xjai8=lf9)YY|Tp(1gD% zx4-nTvI|HnYwjHy?Cb08?&%vEpJB6SrY0w6*z@x}cyAnj~jL<~S5@`~3r69GZn_mLY+;8N8j%o|~B>Cq<@axFGkOGuTo`DSUQ%dS;$F(c&EFzpwA5=&uO5 z!%Y?M>$=D1p)?3qAXr*m;ZOB8*EMtuP0d4^ixd;{6T`z}6H}ApW8)LkGc!|Tkjl{5 z)Xc;{dtG%y*C<;6VK4CKXK?^>j+mv*T%Dd_3t;&Ck(R3JmVwFHsfqDv?$YY&B73-{ zvJ7U;M|@i0j&(I7z(KfN(5C2frw2RRx`t->utvOrF8pwTJvBK!GdnX)oB9gGr>CF; zu7J-T?P{p0Zy$g_*xZE$0e7CpzB13@%+JF~**tJ37;AZ7R@XZ@H$65y&R$$uS>lYg zRTh=h_RfMU?(|T1M_2y{Ja(4Dr|gP1-QQGQ-!lUv5rIHgtb`(vDwpK!nrDOj%q$!F z5x}w*c{4*@?H%3yBwL40|-qq4N7dy+jfIy5?mc(Wpy z?ybqsDySWpUlvXc_q2EPjZVU#rXl);#YNskM@7;5_9-gB!FHFCt=2Cu3P}EkYhDG8 zm&g@47&V_WGch(gI^5UM(%L;T$A{plD6_bXK+5Ow7bruX@2{_{>zSONn;01b?N#A2 zXRtOqC9SY+dPO+c*;v=yI{|YBZNU=a27jWhyr86MgbUUd=u7LDS73$fmKW)Q&3rD0 zvlcB^krhb6*E}AdHxKV?sB7vPndMQO^Z0P%ReTaoM+(pK$2uCDdhqz^iAnaF`3T19 zvlHU88YWhRtu>`3HQiG@9(#J4v#XqrXcWFsk zwIhqdio&eyvX1G6MefWrXK@ulOEBHnR8!YJ3@PC$6jczt%;$k^E)GCN5=0S%R?5IB z@*pK(PYm`T`E>RUPtH*hX9*bzM_ydO4=eoXfwtz3fyp^?{uoyPbuP{I*A!$I)(vr2 z-)5w|eAhO$w8Wd4o~O>XB7h~eb@YwR@elx@TbL2arE@lM*QhTnl1tW$1O&f>a!*9l z(Y|(ge*c=$K^CO&+6oo5mSEe%tu-}m!?RqNB9Ah5?nF;RWko%FJ1sFjt+-=)ae*^6 zF-zrZNN}L1XK;Lui(tuH%M)x4jk}J=qwz(+^McjlmlU^Pi8s%l=L!~=m+_gN#_HPE z!5KcexQ>eBcbEC|b8PrA9Id>hre}(SC(ZLAFF43xTU~X1dtYK)!mF~bX+C#$d~}jB zR^HS=XGiboED!FEx5KUGsF(>Uf}rifr+9fy==}K^I3^DkCBDoaYOSdPBUE;VDIn9# zO~SYqR~IMS%8M&I#@X{TQxq>?ZDFdrrnu;RZBkO&+gg+lvy;O^qf_&I-poKteN*=Y z7gFZ35k^3lOY%f0hbEWFC2~;&-pi-)KE^>{p5qfUJjBl@tNh8{=6XcK86H$1z(*&? zhKEO{`76tFy>%7U?ZeYEQxnr{9-s2uxvuwF8CiK*+4<$IgHyAUqk{uO6LXw7#GSJ0 z&Pl<_5}z|i1!)eK@o_4C;oXO3JBrg&UcRoVtZnHXnZz*%28PCG*;9RW z#qTP+XO>VkaoHffCTjt?KrAwrHd1CyvAqK-prR;y7O@kKu}leJY>@1`H8?!f-`U)N zd^0dSO1U&2nS`s?{F=E7S_^2H{=QnL&X5`%un<+ zlo#f%6KkNl@N|X#ZLipF$xZ-mU=qaMFd@5V2^fG z73P;V4b3CXuSM)d{_IE(>a&TN>B+G%lu7#$i3AgEC9l&8Tc=lri|mQfvB~M#sgd6H z_TCBZvT&_Cph1ZY!5)ysF)8n*qBQDE6q#c~!xM8n0iWb;!;4gCL_(V%>#VP)!t5eV z_%}l3l3;$kud@>w5M)QkMn^^_=a&|zJ4!O5Ue_Z}EV9Qzb_ULi9F6)0Plli%Ksv~Z zfG1?-z5j+t%ITMQNakI=BQsp;M6ff2Mw;;BW!}^v@^tSQ8)V6qW6Ofs;jY&9p5ckf z@zIf?fq~IkzF@kmA~!O#W^{2?FgHe7(d_g{Z)Z2^&9#&xumMF%zI5(a5G5sGs1;Vy z)!N!MG>w7)BH%47p>h0ZaelnNvmHr!krWD2dyweIN6|M8Pt4AZ_cWBJ zyloif3g)Lrhesx6=4QtFyL(5d479jt4{94h4G(4T2-wj!-t1U!TT^rA&YKux)9jC6&_@>U`;s&$vY2P zZ1y~29B*c%yS2Hs2MSn%AyP8rBMKmr@X^55)U*!GQ7H#8XsoNgs>VASnwuXO92y$v?e6X!M2r|kDbzkdbufzpI@q#?Ba#d2kx59N;u?F%Nk~Z}JsoW@ zIV2Uh0sa#`{}pYgz``aH2&jZNUvGf@^=$7YN989gjoK%TPtx0%v-3pr^YVA)JGEauC}Q z)2IlGG8?5w#~61RDV)pWQk4LuW$qjz09<{JgJKRs9_a&FR0#7^J+)=!O+%a&_#jo6 z{7ZHV{`@y-uDwJG4uS`?Vc-%?0rDTt-Q6=VHp}I4=B6f)EKn^V6pZy!o`w8+jB0V0 z*(1F@lsV&o(+B~SEb*KfXtJXd4JB`?tE%LE>nINoU7|_@D%#NzdPq3sAu4Z7Q>Cl` zohzysHd@Wz&Q8c`md!@zft-Sm2)Iz;*o?qN`0MiYKo^Pt)GF+?1hR@wk?Nrk%Bj@4 zGT+~bN_>h^=^_IvWvo#;Oa;<;G|vOW$U{_zM-?xqr769ROrkwUazn_WDmgSGNEM`z zKp@yA81HOo=on$6cch{N54FWOO}GKtqY~#w+|jO%-f>Dj41og-b}fMaKs^Xzf=72C zvheUXDpt==kMwo4wIf4JQ#CnS;Z5A}0rZE{GqmaLlf&(m1#e4QCj=`CbFjgv>7o9iDK04R5Vc77wLO&t>HPg`r4>?4TVs7A23i8Dj7QYw&P@z;x1%x~o#rlJ zHuBwMYgu7&MSU~I9d$Jog|Ffw6AL=$7I|aM#hEE-xm6upJoY~*W)`^Z{Ak*^Ju~kmZ@yF zxL_}!!2|g`lDi%02mLYfOm|~VO;Z<&b|ie7@CvHX$-(Zf?!LjXY2+2*%KUI+PK2wS zvllZeGA!8N*T=)b%EHPs{#{FV!z(XiRasTr`uK#Tv{zYg-@Zu+_wx_Ste>C>H?2~w z1EfZy6i4IjqjC||m>@Gzv{9Q=IlQg8xvi^j7^LXJt4LHZ?Y^F_?p`#IQ^PH#87v1~ zwdcmRE-nrXOEWVQeQh;ubJy@U<)zUUQrC{`AqX2=2UkzOpdd^z%}A%Pyp}1Lmk9K= zOs;%DMMfAS$@zq$Nf`>V0(1-O`)oxpJBCQy(n2{Byb`Y+LI*H5*wxnD*xJ@yl@lLe ztM~Ytn6!?mvA(v7qLPBNgoJ{YiH&b!HdFoTZyQNskG!Iarmm5xslK+7jH;1qLP68O z6b2z27$Hn}$LbOqU=(+2)0cnaDTp(KpMuaxPis?iNB~v(iG{ zX&Pd5V*PiUH!_G#TW(9pDQg-qtchd)T)%byiKMjjlSg;1KUA^|h|4Nz=%cElnR%+O zM}3H9Wv!Z|*hRvkn6(jZS)8M+sI?8v5n3$z+GL6|+ES1j9_VdrqH*sxXJW(Q+jnoB zwk7ud{L630PMte{?(cKQe>i?k)4@A5KC`r`XJ{C8B?sobgX$5e^aPRqTggDP%PZEx zt&5x~xM4FY;GroF)snBGANhE(H$T$J?1j|hdpli;^%u_kYD*BMPQ-2vQ#<#d#Jt+h z{-J^XLDVOBI#nldc{IV6wPcGhgsvS$5>2=n?FD;spuMr7rFV3SoL!H6MH6lu$O$l( z{EI~pe$K=mNj(eufP}o-_MWb`)|RzK6k{Q@Nobfz{wF-{-1NlwO^JmLBLInw%$vAFOtyd+6NXNbwGE)H7mk%h*=yX}PA5K1Gt)D74)peLva_}| z)793sA~w~!nJ7QFeCC83vH6CIg`;0|dSO*#TU!U&^I>OONB<-bMGZ~xIS5UR4h{6Q zw=}o+p*>u{e0|3Xg7ehaKquOuuF-k+;QJ&GQ`svFLd023SC>JM3fA~dCpJq+$||aB z>*%NxIy4I_;;^`$8N;2KTGZG#Ha$1dhhb*R;0&ro2pUOZ9x@uDf)HjnqeyrE-^dhY z`Q#81ZSUYfOJSU+x#r```)I^E#od5_bb%)+ki;ehc?Eg=haU+AM?%EW(Mn)NToIR3 zHL_v8uI*>92n9p6Ma4Cp!{|^jH>7G-Dx&r^*HqWH_4N1k_M`AXwXurVIkVG~BZHk) zSz%7ba(C9zi1o&Vcoeb0(b2{|g-(3+>-lRE+HT2ZR9hh!sxK{X=<4t98^G`qK2I)x zwlF{5+m0b~e{V-K8nQ_a$^VoZd!RO$>8r|Q+3Cxjvm(~X>qQZSBT1~+GBRNhM-JRz zMCDes4~-9ZHq^HCjSTm7bx;@#Mp@Lzf&<--O^y%Z9~;{HN5{t|X81rl1fvZ&rk>m_ zU_y>k>T$$+Gc#iwV)xU4#MgO6W##W{T8C%nrw2P4>#24PbuR{vn9CyPP_x9GeaGXRjvSrQ#aNnv|UAbJhNtqkIzoFy)P^*t!eEYot{VKjCuPGv;%7;LtArQU42zidWfT;iumUUONLJ$ zLCIPP#Ci?c7dFJ#_hgiGj9nvh8%FrT#qs8ng5s*Cj-I}LG^TSrDj9#ix&&6c>k2Yb z;v)R4be>(?4^YbcnW}0ML1^HKKFlCG@%1;y?@F0@$Gydfb+Dx@zofozVhWkQvl~$o z8n70Avbr$aU7o`9v}c$rJ^b@4d{R|i9cNK}Nvw~LkG3HW-L~+Jd-JZW@J(uZQRh50 zZtQHusCQzPiopo;5Y)o_aD5ib!C2|>85?4~x|UWZArc=SmtaF|eq<965gQv892oVs zor~Btx7OmK6&mU%d$;uU4UP=;G~~kpRIYBc0jR02rI|qx@erzxxl=ZS_*vJ*)63n# z*4{U@Vt})V)?=u@e_*h;t*-oC-rKyl1tn$0If;RG`ciw~sX@wO;*=oYK-VTT8{$V} z(!x|v&(JzJwGcz}sY#UX{XNYUxyjLCEEY2~GA1V6*WOt9DvteJTqXCvJ|?NHr7o|e z{KCeAnNrZ$KQ=Pd-`ifDpB(Jz>g43;ePuFTE-zu*HYx+*f);O{C0govxF zGr-3$zq~GE?4DHC+R@(HQd^K5U}I{iZ>X=Uqb{`#;A^*xI#MiE;hSth!1vN zk~0r}Q$?%WQjr_$MH=Y7(0ie+A$JkRAT-xDhAcG7;X`hK0XKhh-!dXK<8^jgFe!JH zJSlSN(wQH@0PVSH)!JL4*M6=f2nUk*Q0U`iP3o!|X8REvT5g5yzxnCd6>(K{nLDR{*|Qk|^c&#g4*}_aeM9t-w3c;n${RrXUw^&# z3?Ti}JHPn`Ts(YuM-hXO0}$hvyswqAyP& z`hmAEU%hHae7tGfzTeK@zH|B5x0_+J!rS}50P1~key^*i2mJmq@xX=HEwXU~A+qzg z%h&(8CMvE;_waMGP!qp#?(laz?1*)@%$97s4;rDYl9%k4P-)_8d>BPZ(yLRl@d*r%|s+y*bsWUV2WfIHPQcLpM z@gH}7`YA*$Bl$cDar(08u^;yA-uvzE=N@R$y<#&;n|h~FL#r!2y?)}rE>B|Pvs3pD zef_r!v48!|#}7p>9{c5&Lx0~-@D_*M0_Of9UwBhtD2Kv#f}tpBz2;*Rdl94xN+K*3~!A*VofCwf2mBSy)-$ z(bYpGbQETtm2X0UyALZN{Y^${dQR04(9vx< zSt%hlx{6Y=imFP_#3f`EWFKz!BzB*_cJul_*Ka(OdqK0Yb8_(xj7Z5YsYBN7qYdsD z=hgv6l3Mi>J<<`in;F{LgW5lc2QM8L255g$)DaqwQsRd4O4I!d*xr z9qsk+68xPQ*47Nt$iT?h#7I|pKS`{UNOmHQ-+nCqR9swAPSc3t;U5we|0*B*Aj4~6 zxx1^YvkQb#@b+~#zR!&h!ji_LJGXC%ULc9h$3)fb`n;JVu1*Guj>BhW_93am~ zTYxe6-0A+>{8x$bQQ^!0e{^D=9$r2!7Fx>kIzn4w!^elN$*PeWXEk+=tsK3>;?i>7 zRW^1EAcasJO?_=mEw&bbPEsOmYb?)A^r1gjmY0#0eRBTVJz4XB?9LhVM`#Xyo^Q#G zkI!zLq}o3UCtsTFZ)>QoEPa=so0FZHo|KT780l%Ma{tUu8)Ey%-=2P;Zfr@CRt~Pd zArZ-$dF9m&WaDRbH30F83iEQZa|+68u|7if?d<98>ui3X5$0-Ts;8r+A|7PQYUQ5y_YDOpn5IK;&XD71?++}GFDnCqi?W*bRt z`QaaB(nR9=*-K(7mYz&9a(`@GVsh%sR~fI;;=_DhvD6Y68W9oB3SmVgyn0(!)6~%g zV1OL>th=?U@Kuz*tDTjVoljDEKc6AoP0b-^I*MMs%xfG&(TlPKoqbALQ8&+8Xei(< z@MfB$b^iJfL45Y-15HbFO&KvUndb~|7Mk$z(6GqpnAq5e5Kn94=h}MacJ4lYFoEX4`PP+yD$3Gyz&&%E2!`s*2*VDzp-qFRw)792OU)Px77QhS( z3k_q11P6t%Lh)m0cvLJc?z5OkmY0pWg>ypX7+S35wXSrTJJR$n3!@+mDVGw2;3gOd^HT6Zmt*1rk!ar5vEjz~z)DXwm8sV~ocnV3K(ej6VR3FG0c-~c~pKP)WR z%g(~s%*xT-%hx|BG%S=!3;rM|Fd!f>m`Mx$l*J78WSAH-!b?UW=4JG$U#{@STi#{7 zDrg3~E7OCm)fE_r&j1!&hR`pvTXVuaJ^aEG(lT?3DjM3mdpetID@uxr3JdbG-@Hmo zPKb+%iVTm4ii(Me2=Q{XwXt(>u(NY?_h;fzAwdEDex&a)zktA?;E>>u5FdMU12VW^ z5S`Q#*hf>eG}lv_7Mt>}V`g!+zpc6y+bI)lKqE^S0Q|f%S)Jr%eo>N#>+uVWZ zj44SA#(8zM)fHv$^0KKD#K*?OkkPxM!bALhJlq_uElf=5&VHON$ELzDZAsi;0W~4`qdhszL`b z*voUZGSSyJv2yke36BV41qV?lpbo$a4G#_S^YjkOs2P~XvJK{JR1lqRdJ`TT`>t0Y z%uEOiODXM{2dIV#KSIJHyRS6P!^Yk>v9PYA3z%Qt>sPNb-(+Xgb2evZz0OEaO^S;Q zXEB+ykgr%_k+E@cQNbQ|q^Yq9Y3m*s3i3=Q_-3-m(0{_h;R*hJA#r&PgR|7YjfdQ| z%I+zB8JAMj#SzA_`~u>OdpVfHQuE;@U{1Yd$pJ3zLCNoGTbpa%WhTW&$Hd2z3G1l; zeHb4X7aJ255z3?olOcPVVbO`HX-Ux_Z)v1&M0bJsqawn?BO;?lw}hx$^fCcf76a?c1`J0SJVZQ8OZ-NK>E+RvxNeh5LC2MZJ9ct}rJpni&`v z^j~fSCDMY{1qahZOqo!37}gRaQ*z5|YD%*c0_{z-wGFJ?gCnA2W8-3@BUnMOI-EM# z-QLDCuC#x4ex3p_u&cH_-(QvU@^w*d7%MEXuyt|)Nfg@%fELFZv%|dHJVT;VGBVQ> zqfo&F1c6~D0*kL7s0Rj7K165gQPB*FjY!F_Y3ppRe47~LXr`}kX6Fg=F;SsG$V8sr ze!-zgfA-dHQ3YL7^PD+qz6*m#I?s%WNy|=6d6`??I|F0^&=!^gxP2wDZZ>xA!IAOs zr*IY=Czy%og$P2$t{`Z69h1pm-2&&KELKEvUQI_|cS}`XYN#8-)Wp)p%`Z6E-^0Nc z(`GM`g_`HieJb0+mmLdG+PG@JB&;$ zZQXnVnV}IZKTlWR=-k!`EO`xyCLD24fJvM4t-TO%)wNfJ%@qwGJg!4sPVC}jToY1@eF$-v!J}h87zr*wxl`xAwLC^ zLF>UV8EVI}4pl)W0n^|bN{&f>Q`XSEw#QIk@-p0uVXQ6x?D11Y16%J9XdyHrEZEQ8 zBPgYEh==jf?DQU-TCo^Rl0^%pvDSr# zk}Mf!u)nv5yC=eATzc;Ne`)qKR^%lHT5Cx@lF+j9jfjm#bc3e_c({6o=e5sb`2ovc zvvae+eP=q05`(;Bin`f+EPP-z&gEfYDI?t9+aI!{lxEE$nOIo|Q4q9ZoeG85vVwgv ze6n-$3Jgm~&wt<0**7>e*xiQN1_qw0s(K9Xu;{1=6sRm_ke9nh$g7$mYG-enHhTc> z%k3*m4zdZ(>6l;O%#4jwL*ePJveZz2-#`{c6DEr2L}RWC0a;s?6ev+ z!eY~NifUTA1^@zMXq6M=%`i2kIr*`|Vf9c6Gr-5wH!7=cXcmwsmN91mp$Ud--^4Hi zv)d_>kSttjrmHlW>E|0rF~(%tux!AoEJZskJUlem+tJF*#KIa8I4(7_@O?eN11#Wn zHWsI|T&*pwoV!B1Mocmgi9<%^8S8*3}ib&o9QWCMT&evB=F*{+hL zU|(;n@H?_>nO0!#i%>-Mh!Af_nu#%-)-NnN;Z<&NU2D$(IeekNt@2HzC&SXp-ZLNs zWI`h&m|hN!K8Y2B+$8~T4!ejv-u%QsM^pTp>V7u(oCa*m=T0=|#RT}kf0@o8Ljyn5 z86#p6k`f{VTW)!1c3WqFBk|aSRT-f^-o8OB@Io@})@)LlN|T|H@h{(GWh5}& zZ7eNF8)r{HR%Aj(Zb@}hN8jK;PgBXuU`Nu7?&O1nfEJkSWayOfQt%DBTDTIbcC%-NzF3L@f@Ns0&XsF>dyngPI~XAubG^N#xu1X~80ws#B;GH9JiqlK}3JL|2za-^VzZncJhS4G;a_ zNLq(npd<~$V@9Rql+`xWl;xyG1-Mz8n?Q5k!Qqins0^rHBq1g&$j>)`6`hcn5Eq}E z6cgg<;-6GG$N@IO{~CB0fVzG(yc8x(m1#>uB@uQA*a7g>PzIz*MYG#$#T7Hy&&SI< zAUrv@w5qZsH$6Vg-^ChSTD$lnN+V3eEhC~}G3fS!SP@8Zkuk9mfzAv&zl`QtltKcm z8jKHgwKmxaH}ksk!kz6L5#LeG(wKCX6)a^fgdrud_J;VQ$+2_t42geT@Gk#NYJ4Qi z&)tDRv$A#Z4hSZhWauy9(Q$E+K^~3{&TgJ)YkmE^U1@qR%>45PR)kA4z0D|^i%QGE z+A`MYKjaUVB?r2?c?FSS>k+_k69+V{;egs}X&wd?LJ_dEpgH(Pre?fKjgLnE9_;64 z&!98xUA+9)s)Q)GX{f8k3oRXeV^b3|OPZyrmbAE}L2&s5f2JF$E6_hIHFp4mBFj!f+3XL{LUC85tE$#Wz^3 zqq|QaD>5cAIX=`4FvWw%&t&BRHLIyAKNG!jMcg#9ytA`1$;(1V+tfRq%-r<`qn^6j zqGTVMp{cEZR3d5|1hFuL06G+jj2{|ChOdXVNTx!dpN9i!_~L~T-Ovvg!rqZ{s-cpIT zv9Yyx_GU(e`&wy8h$|SmhQ`ImMZv8=7(NLrS`WIk@EdT}5Ts>)PY2RSU*E`_2CobN zm_fZg*u&n6Mv^p!oriyrkDYVQgq*O0!2*1ph>N6Uy{+(3iS>`SSIv=a24oCDw^-bS8dT z|KTTFKi}~Qv2p9+tD<60B$c0=SlPS6wS0X1V1%*pXaP}=Q)Mg3It0m5^(!lk^7*hJ zNYw%zk);C)Ayz25^thz>01Jr=zwZ0y+u#4#7(@`b(|6ZK3Vl2cjjX>P3N)0Wm}106N3sGu(P|l*GMqdx+G2)BCcesupg;ZVi!k6a z&cyW}{y2W>A2GS-#unzr#*|KxkI_USi$qW%DU=!L>*?X?h2da8a99*t$Ji*Aud_9V zl(r5|E^gjIVTqZUVU|yhZ>JvULR|aim!s!yJd#t>(bdy8FeYuBTwL6}1H<6Llw!kJ z0p1>NuC6Z5&Tig;Yo?1XBFNj-(E)eXu!4eXg-NjB|={|8xEN zjlX|A@FRf!S4#J;ociUvuiS`#w*GkH?3LTNs;Fy9vv#nzv81L6{-`?Enn_lmFDNtf+J_W#b{lM?PGYIkFj{f@NuWNW*L`q7iqn@0Eq`Zc~S}Dnd<3cmh5h0igW0qwJxK`gl zPebO;`NR8nfy?hc`wR;H0@(h(-QU>~$3;H)Z1*3cYF2(xaUu3PvJ$fDx~A|VXLn>| zSZ5qnZNQHMy&TN6WS)rKz5UPM2lrCw)wSLG_XFMk8oIr4U(|*;eBg?-uC=?jqp`BI z!V8*{i=#CXyOReh{qWf2mlhoe!BHcUO`6e`lXxlw4kKqXg>#QhOMKEE9vryE2f#g{(-)3bZzkqzW_-UxxVka z?||$}La4ib`csub{B-T%6EV^Ae;zycRNsXe84={+WN&A0Z$mTDfAK=szz`E@ljpK` zPgD98x$y0dJvjGw0QUEP`vZXed$+HiIsDTPhp$WP(44$|y<8paY^+RQC_Q`h@X^y} zQnCti5_c~h{cZyQ?t^;{0NDTcW2)CrAKAZm*S-^%@5|}Xo!zMrV4pj49i30%kZ{50)WKVptY0u#+Qo1B*jw`i_Vi%A6 z^2@=aC;s~D#34YjX4`h`0IYuto^@a1rX8_s-JT<&ihBBby1JS&w@)AZ;lM9{96NFR z$TwDmNX>~~jzJLHf$ED%i#ie?fAH(|2ag_$-#h#LCcv&AeDbLX&VK6P31Iqo12Fwl z2af~O7o#wJWpUAqzkTzw6fpg37fv7FiX)x?rvLrcgFwU2qB;PkzxEg6EO`--K9KQU zAMHBu*G*YHIEsm}o{ISOlShxOaZ6srr!W3LLG(YN5ua@N=%dY_fBDPVyAMUr{<;U3 z!-=f`^s$BT(GL$E<5s#`bXFk%{Vktt*$Y7b;741xf(2=5acuzldjRMk-?we^hnsi( z4nSW-VgKg{H^hfPvbO`t-u~&9&$jJ8a#P}YYBoWB6$Bk^`tTz__uIGbDE+S&KKk(A z7l7qE*_*3BzIyV|e#Gme!1C`?SiaSTKmR`AKz#V|7r&l9f8wVd>nJ4u3443G6a(U^@$62Rjh*IfXUxDcxn8YF!{~@eCEE`T_<9T$c9b-*>T|X?T4age*WS^{A>21Kk+%z zgfIk*zwzn=d2O11a(<~T@$tix7oG`C%+1YALt!wcVE!}+oIZ8(6m~yu-Me?rp4hhQ z=O4b_^VJV0Zb>Oh-8p^e+b_3n*#HRt$G@nz${^I*6I(WXe&VKtrY`9ml3rTh0u0~O z%*+7~I(-VO6j&J{wr~CA?Aa4X4*zvsO55;-{QXOR{`TF@kAdM|(QzVnuHX9IpO4i6 z;$*_1Y722J!Xn2Y>#!ch9#6j$eJMXX6u_Ufe(- z0epQOC9w;Kzu5rHUH*djx4V7?jKAf=^($wN{rL6Q-yXUsu5D~;Zbmx#u%csF-nM$u z{~Y~(=eAv6T*l4&y-$=B#c!TJd->*5WkctXl+xx=4t4Y1(av1`;iaSdKETcU|9kN$kqG)5i|&`Fz)&t+<8%<@M)o zfdM`quI_%}DQ|E^J+G{FY8gQO+uTkgYo%r*D z=rc8K9eo2+($*t53N+s46&4kjm6yM-eE+^AJ1M|cUqSrN1@Lt6@KGT7KV6b1nJ+V5 zCMLdm*EBpei5p^7t>X)H;ht4tM|)#&a*(TyjkUFvxw$2cPMSXd3u#NI(vi6O>8Z14 z&z(De`Pu_X6$5j+y|WK9CO!LY{#$&#z?-bx{C6egfJ-Wh-ljzOFbtH%uKa!CZ#Fww%0D6y$hT`H=Ugf+ir{)<&+35*P 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 AbN~PV diff --git a/data/win32/flarq.ico b/data/win32/flarq.ico index a5f2c034d1f254591effbad53d82a2928d9e9044..0bc5a8363b33e30155347bb6077fa551ba392feb 100644 GIT binary patch literal 370070 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 diff --git a/m4/build.m4 b/m4/build.m4 index aaec4a63..6b27cd89 100644 --- a/m4/build.m4 +++ b/m4/build.m4 @@ -35,19 +35,25 @@ $EXTRA_LIBS $FLXMLRPC_LIBS" # CPPFLAGS FLARQ_BUILD_CPPFLAGS="-I\$(srcdir) -I\$(srcdir)/include -I\$(srcdir)/fileselector \ -I\$(srcdir)/flarq-src -I\$(srcdir)/flarq-src/include" + if test "x$ac_cv_flxmlrpc" != "xyes"; then + FLARQ_BUILD_CPPFLAGS="$FLARQ_BUILD_CPPFLAGS -I\$(srcdir)/xmlrpcpp" + fi # CXXFLAGS FLARQ_BUILD_CXXFLAGS="$FLTK_CFLAGS $X_CFLAGS $MAC_UNIVERSAL_CFLAGS $INTL_CFLAGS $PTW32_CFLAGS \ $BFD_CFLAGS -pipe -Wall -fexceptions $OPT_CFLAGS $DEBUG_CFLAGS" if test "x$target_mingw32" = "xyes"; then FLARQ_BUILD_CXXFLAGS="-mthreads $FLARQ_BUILD_CXXFLAGS" fi + if test "x$ac_cv_flxmlrpc" != "xyes"; then + FLARQ_BUILD_CXXFLAGS="$FLARQ_BUILD_CXXFLAGS -I\$(srcdir)/xmlrpcpp" + fi # LDFLAGS FLARQ_BUILD_LDFLAGS="$MAC_UNIVERSAL_LDFLAGS" if test "x$target_mingw32" = "xyes"; then FLARQ_BUILD_LDFLAGS="-mthreads $FLARQ_BUILD_LDFLAGS" fi # LDADD - FLARQ_BUILD_LDADD="$FLTK_LIBS $X_LIBS $INTL_LIBS $PTW32_LIBS $BFD_LIBS $EXTRA_LIBS" + FLARQ_BUILD_LDADD="$FLTK_LIBS $X_LIBS $INTL_LIBS $PTW32_LIBS $BFD_LIBS $EXTRA_LIBS $FLXMLRPC_LIBS" if test "x$ac_cv_debug" = "xyes"; then FLDIGI_BUILD_CXXFLAGS="$FLDIGI_BUILD_CXXFLAGS -UNDEBUG" diff --git a/src/Makefile.am b/src/Makefile.am index 3536253a..95665731 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -35,16 +35,25 @@ include/hamlib.h \ rigcontrol/hamlib.cxx \ include/rigclass.h \ rigcontrol/rigclass.cxx + XMLRPC_SRC = \ include/xmlrpc.h \ misc/xmlrpc.cxx + FLDIGI_WIN32_RES_SRC = fldigirc.rc + FLARQ_WIN32_RES_SRC = flarq-src/flarqrc.rc + COMMON_WIN32_RES_SRC = common.rc + BENCHMARK_SRC = include/benchmark.h misc/benchmark.cxx + REGEX_SRC = compat/regex.h compat/regex.c + STACK_SRC = include/stack.h misc/stack.cxx + MINGW32_SRC = include/compat.h compat/getsysinfo.c compat/mingw.c compat/mingw.h + NLS_SRC = misc/nls.cxx include/nls.h # We distribute these but do not always compile them @@ -77,7 +86,7 @@ XMLRPCPP_SRC = \ EXTRA_fldigi_SOURCES = $(HAMLIB_SRC) $(XMLRPC_SRC) $(FLDIGI_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) \ $(BENCHMARK_SRC) $(REGEX_SRC) $(STACK_SRC) $(MINGW32_SRC) $(NLS_SRC) $(XMLRPCPP_SRC) -EXTRA_flarq_SOURCES = $(FLARQ_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) +EXTRA_flarq_SOURCES = $(FLARQ_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) $(XMLRPCPP_SRC) fldigi_SOURCES = flarq_SOURCES = @@ -86,11 +95,16 @@ fldigi_SOURCES += $(XMLRPC_SRC) if !ENABLE_FLXMLRPC fldigi_SOURCES += $(XMLRPCPP_SRC) +flarq_SOURCES += $(XMLRPCPP_SRC) else fldigi_CPPFLAGS += @FLXMLRPC_CFLAGS@ fldigi_CXXFLAGS += @FLXMLRPC_CFLAGS@ fldigi_CFLAGS += @FLXMLRPC_CFLAGS@ fldigi_LDFLAGS += @FLXMLRPC_LIBS@ +flarq_CPPFLAGS += @FLXMLRPC_CFLAGS@ +flarq_CXXFLAGS += @FLXMLRPC_CFLAGS@ +flarq_CFLAGS += @FLXMLRPC_CFLAGS@ +flarq_LDFLAGS += @FLXMLRPC_LIBS@ endif if ENABLE_HAMLIB @@ -734,11 +748,13 @@ flarq_SOURCES += \ flarq-src/b64.cxx \ flarq-src/flarq.cxx \ flarq-src/flarqenv.cxx \ + flarq-src/xml_server.cxx \ flarq-src/include/arq.h \ flarq-src/include/arqdialogs.h \ flarq-src/include/b64.h \ flarq-src/include/flarq.h \ flarq-src/include/flarqenv.h \ + flarq-src/include/xml_server.h \ include/Fl_Text_Display_mod.H \ include/Fl_Text_Editor_mod.H \ include/FTextView.h \ diff --git a/src/flarq-src/arq.cxx b/src/flarq-src/arq.cxx index f84fc861..475fc999 100644 --- a/src/flarq-src/arq.cxx +++ b/src/flarq-src/arq.cxx @@ -38,9 +38,9 @@ string RXIDENT = "RX: Link Still Active"; string RXCONREQ = "RX: Connect Request"; string RXCONACK = "RX: Connect OK"; string RXDISCONN = "RX: Disconnect Request"; -string RXDISCONACK = "RX: Disconnect OK"; +string RXDISCONACK = "RX: Disconnect OK"; string RXSTATUS = "RX: Status Report"; -string RXPOLL = "RX: Send Blocks Report"; +string RXPOLL = "RX: Send Blocks Report"; string TXSTATUS = "TX: Blocks Received OK"; string TXDISCONN = "TX: Disconnect Request"; string TXDISACK = "TX: Disconnect OK"; @@ -69,12 +69,12 @@ arq::arq() printRX_DEBUG = NULL; printTX_DEBUG = NULL; rxUrCall = NULL; - + Header.erase(); MyStreamID = '0'; UrStreamID = '0'; - + UrCall.erase(); MyCall.erase(); @@ -89,7 +89,7 @@ arq::arq() TXflag = false; SessionNumber = 0; - + exponent = EXPONENT; maxheaders = MAXHEADERS; RetryTime = RETRYTIME; @@ -100,7 +100,7 @@ arq::arq() primary = false; setBufferlength(); - + // status variables // // totalRx = 0; @@ -122,7 +122,7 @@ arq::arq() UrLastHeader = MAXCOUNT - 1; // Other station's Header last sent UrEndHeader = MAXCOUNT - 1; // Other station's last received Header blkcount = -1; - + TXflag = false; // TX on LinkState = DOWN; // ARQ link is initially down Sending = 0; @@ -131,7 +131,7 @@ arq::arq() MyMissing.clear(); MissingRxBlocks = ""; - + TxBlocks.clear(); TxMissing.clear(); TxPending.clear(); @@ -139,17 +139,17 @@ arq::arq() RxPending.clear(); arqstop = false; - + retries = baseRetries = Retries; baseRetryTime = RetryTime; baseTimeout = Timeout; - + retrytime = RetryTime / ARQLOOPTIME; timeout = Timeout / ARQLOOPTIME; loopcount = 0; - + tx2txdelay = 0;//TxDelay / ARQLOOPTIME; - + // srand(time(NULL)); } @@ -196,14 +196,14 @@ void arq::reset() // new session number // unknown stream id = 0 // known id's from 1 to 63 -void arq::newsession() +void arq::newsession() { if (++SessionNumber == 64) SessionNumber = 1; MyStreamID = SessionNumber + '0'; } // get new blocknumber -void arq::newblocknumber() +void arq::newblocknumber() { Lastqueued++; Lastqueued %= MAXCOUNT; @@ -252,7 +252,7 @@ void arq::addToTxQue(string s) // c Header = Client:port Server:port // e.g.: '00cW1HKJ:1025 KH6TY:24 4' // -void arq::connectFrame() +void arq::connectFrame() { char szGlobals[24]; reset(); @@ -280,9 +280,9 @@ void arq::connectFrame() addToTxQue(Frame); - LinkState = CONNECTING; + LinkState = ARQ_CONNECTING; printSTATUS(TXCONNECT, 5.0); -} +} // Connect acknowledge (server:port, client:port) @@ -294,7 +294,7 @@ void arq::ackFrame () reset(); IdHeader(); Header += CONACK; - + Payload.erase(); Payload.append(MyCall); Payload.append(":24"); @@ -304,7 +304,7 @@ void arq::ackFrame () Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; - + Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; @@ -317,11 +317,11 @@ void arq::ackFrame () // c Header = Caller:port static:port // e.g.: '00cW1HKJ:87 KH6TY:87 4' // -void arq::ttyconnectFrame() +void arq::ttyconnectFrame() { UnkHeader(); Header += CONREQ; - + Payload.erase(); Payload.append(MyCall); Payload.append(":87"); @@ -332,24 +332,24 @@ void arq::ttyconnectFrame() Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; - + Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); -} +} // Connect acknowledge (server:port, client:port) // k Header = Server:port Client:port // e.g: '00kKH6TY:87 W1HKJ 4' // Service id # 87 is keyboard-to-keyboard // -void arq::ttyackFrame() +void arq::ttyackFrame() { IdHeader(); Header += CONACK; - + Payload.erase(); Payload.append(MyCall); Payload.append(":87"); @@ -357,7 +357,7 @@ void arq::ttyackFrame() Payload.append(UrCall); Payload += ' '; Payload += MyBlockLengthChar; - + Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; @@ -371,12 +371,12 @@ void arq::identFrame() { IdHeader(); Header += IDENT; - + Payload.erase(); Payload.append(UrCall); Payload.append(" de "); Payload.append(MyCall); - + Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; @@ -386,7 +386,7 @@ void arq::identFrame() char szIDENT[80]; snprintf(szIDENT,sizeof(szIDENT), TXIDENT.c_str(), retries); printSTATUS(szIDENT, 5.0); - + } // e.g. Ping frame @@ -396,27 +396,27 @@ void arq::pingFrame() { IdHeader(); Header += _UNPROTO; - + Payload.erase(); Payload.append(MyCall); Payload.append(":7"); Payload += ' '; - + Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; - + addToTxQue(Frame); } // talk frame // similar to UNPROTO frame -// but only sent if CONNECTED +// but only sent if ARQ_CONNECTED void arq::talkFrame(string txt) { IdHeader(); Header += _TALK; - + Payload.erase(); Payload.append(MyCall); Payload.append(":73"); @@ -442,11 +442,11 @@ void arq::ackAbortFrame() Payload += (GoodHeader + 0x20); Payload += (EndHeader + 0x20); Payload.append(MissingRxBlocks); - + Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; - + addToTxQue(Frame); printSTATUS(TXSTATUS, 5.0); } @@ -455,7 +455,7 @@ void arq::ackAbortFrame() //p frame = //e.g.: '00sXHCAB' // -void arq::statFrame() +void arq::statFrame() { IdHeader(); Header += STATUS; @@ -465,11 +465,11 @@ void arq::statFrame() Payload += (GoodHeader + 0x20); Payload += (EndHeader + 0x20); Payload.append(MissingRxBlocks); - + Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; - + addToTxQue(Frame); printSTATUS(TXSTATUS, 5.0); } @@ -498,7 +498,7 @@ void arq::disackFrame() { IdHeader(); Header += _DISACK; - + Payload.erase(); Payload.append(MyCall); Payload.append(":91"); @@ -531,7 +531,7 @@ void arq::abortFrame() // u Header = From:port data // e.g: '00uKH6TY:72 Beacon text ' // -void arq::beaconFrame(string txt) +void arq::beaconFrame(string txt) { UnkHeader(); Header += _UNPROTO; @@ -555,7 +555,7 @@ void arq::beaconFrame(string txt) // poll //p frame = //e.g.: '00pXHCAB' -void arq::pollFrame() +void arq::pollFrame() { IdHeader(); @@ -603,8 +603,8 @@ void arq::parseCONREQ() size_t p1 = 0, p2 = rcvPayload.find(':'); if (p2 == string::npos) return; -// if (LinkState == CONNECTED || LinkState == WAITFORACK) return; // disallow multiple connects - +// if (LinkState == ARQ_CONNECTED || LinkState == WAITFORACK) return; // disallow multiple connects + // requesting stations callsign UrCall = upcase(rcvPayload.substr(p1, p2 - p1)); p1 = rcvPayload.find(' ', p2+1); @@ -631,7 +631,7 @@ void arq::parseCONREQ() UrStreamID = rcvPayload[p1]; p1++; // *p1 ==> requested block size UrBlockLengthChar = rcvPayload[p1]; - + p1 += 3; // *p1 ==>" TnnnRnnnWnnn" if (p1 < rcvPayload.length()) { char num[7]; @@ -655,7 +655,7 @@ void arq::parseCONREQ() Timeout += Retries * RetryTime; } } -/* +/* char line[80]; string NewValues = "Temporary control parameters set to\n"; snprintf(line, 79, " Retries = %d\n", Retries); @@ -668,15 +668,15 @@ void arq::parseCONREQ() */ } } - + reset(); LinkState = WAITFORACK; newsession(); - if (rxUrCall) rxUrCall(UrCall); + if (rxUrCall) rxUrCall(UrCall); - TxTextQueue.clear();//erase(); + TxTextQueue.clear(); ackFrame(); immediate = true; printSTATUS(RXCONREQ, 5.0); @@ -685,10 +685,10 @@ void arq::parseCONREQ() void arq::parseCONACK() { - if (LinkState < CONNECTING ) { //!= CONNECTING) { + if (LinkState < ARQ_CONNECTING ) { //!= ARQ_CONNECTING) { return; // Connect Acknowledge only valid during a connect } - + size_t p1 = 0, p2 = rcvPayload.find(':'); // LinkState = DOWN; if (p2 == string::npos) @@ -708,7 +708,7 @@ void arq::parseCONACK() UrCall.erase(); return; } - + p1++; // *p1 ==> StreamID for requesting station UrStreamID = rcvPayload[p1]; p1++; // *p1 ==> requested block size @@ -716,9 +716,9 @@ void arq::parseCONACK() RxTextQueue.clear();//erase(); - LinkState = CONNECTED; + LinkState = ARQ_CONNECTED; timeout = Timeout / ARQLOOPTIME; - + statFrame(); immediate = true; primary = true; @@ -753,14 +753,14 @@ void arq::parseABORT() if (abortfnc) abortfnc(); ackAbortFrame(); immediate = true; - LinkState = CONNECTED; + LinkState = ARQ_CONNECTED; } void arq::parseACKABORT() { reset(); if (abortfnc) abortfnc(); - LinkState = CONNECTED; + LinkState = ARQ_CONNECTED; } void arq::parseUNPROTO() @@ -787,7 +787,7 @@ void arq::parseSTATUS() { // create the missing list // all reported missing blocks - if (LinkState >= CONNECTED) { + if (LinkState >= ARQ_CONNECTED) { UrLastHeader = rcvPayload[0] - 0x20; // Other station's Header last sent UrGoodHeader = rcvPayload[1] - 0x20; // Other station's Good Header UrEndHeader = rcvPayload[2] - 0x20; // Other station's last received Header @@ -809,10 +809,10 @@ void arq::parseSTATUS() } missing.push_back(LastHeader); } - + if (missing.empty()) - TxMissing.clear(); - + TxMissing.clear(); + if (TxMissing.empty() == false) { list keep; list::iterator p = TxMissing.begin(); @@ -846,19 +846,19 @@ void arq::parseSTATUS() switch (LinkState) { case WAITFORACK : - LinkState = CONNECTED; + LinkState = ARQ_CONNECTED; break; case DISCONNECTING : if (rxUrCall) rxUrCall(""); LinkState = DOWN; break; case WAITING : - LinkState = CONNECTED; + LinkState = ARQ_CONNECTED; break; // case ABORTING : // reset(); // if (abortfnc) abortfnc(); -// LinkState = CONNECTED; +// LinkState = ARQ_CONNECTED; // break; // case ABORT : // break; @@ -871,12 +871,12 @@ void arq::parseSTATUS() void arq::parsePOLL() { if (LinkState == DISCONNECTING || LinkState == DOWN || - LinkState == TIMEDOUT || LinkState == ABORT ) + LinkState == TIMEDOUT || LinkState == ABORT ) return; statFrame(); immediate = true; - LinkState = CONNECTED; + LinkState = ARQ_CONNECTED; printSTATUS(RXPOLL, 5.0); } @@ -884,18 +884,18 @@ void arq::parseDATA() { vector::iterator p1, p2; int n1, n2; - - if (LinkState < CONNECTED) return; // do not respond if DOWN or TIMEDOUT - - for (p1 = RxPending.begin(); p1 < RxPending.end(); p1++) + + if (LinkState < ARQ_CONNECTED) return; // do not respond if DOWN or TIMEDOUT + + for (p1 = RxPending.begin(); p1 < RxPending.end(); p1++) if (blknbr == p1->nbr()) { return; } - + char szStatus[80]; snprintf(szStatus, sizeof(szStatus),"RX: data block %d", blknbr); printSTATUS(szStatus, 5.0); - + cTxtBlk tempblk(blknbr, rcvPayload); RxPending.push_back (tempblk); @@ -920,7 +920,7 @@ void arq::parseDATA() } // add RxPending blocks that are consecutive to GoodHeader - p1 = RxPending.begin(); + p1 = RxPending.begin(); while (!RxPending.empty()) { if ((p1->nbr() != (GoodHeader +1) % MAXCOUNT)) break; @@ -988,14 +988,14 @@ int arq::parseFrame(string txt) // treat unproto TALK as a special case // no effort made to confirm the data by the CRC value if (fID == _TALK) { - if (LinkState >= CONNECTED) { + if (LinkState >= ARQ_CONNECTED) { timeout = Timeout / ARQLOOPTIME; parseTALK(); retries = Retries; } return -1; } - + string sRcvdCRC = testcrc.scrc16( txt.substr(0, len - 4)); if (sRcvdCRC != txt.substr(len - 4) ) { @@ -1007,7 +1007,7 @@ int arq::parseFrame(string txt) retries = Retries; switch (fID) { - case IDENT : + case IDENT : if (!isUrcall()) break; blknbr = fID - 0x20; @@ -1016,8 +1016,8 @@ int arq::parseFrame(string txt) printRX_DEBUG("IDENT:"); } break; - case CONREQ : - if (LinkState > TIMEDOUT) + case CONREQ : + if (LinkState > TIMEDOUT) break; // disallow multiple connects blknbr = fID - 0x20; parseCONREQ(); @@ -1104,11 +1104,11 @@ int arq::parseFrame(string txt) } } if (printRX_DEBUG) { - printRX_DEBUG(txt); printRX_DEBUG("\n"); + printRX_DEBUG(txt); printRX_DEBUG("\n"); } - if (LinkState == CONNECTED) + if (LinkState == ARQ_CONNECTED) timeout = Timeout / ARQLOOPTIME; return fID; @@ -1124,10 +1124,10 @@ void arq::rcvChar( char c ) tx2txdelay = TxDelay / ARQLOOPTIME; return; } - + if (lastRxChar == SOH && c == SOH) // consecutive characters return; - + if (lastRxChar == EOT && c == EOT) // consecutive characters return; @@ -1142,7 +1142,7 @@ void arq::rcvChar( char c ) } else RxFrameQueue += c; } - + lastRxChar = c; } @@ -1152,8 +1152,8 @@ void arq::sendText (string txt) { size_t offset = 0; cTxtBlk tempblk; - if (LinkState < CONNECTED) return; - + if (LinkState < ARQ_CONNECTED) return; + Blocks2Send = 0; while (offset < txt.length()) { newblocknumber(); @@ -1171,7 +1171,7 @@ void arq::sendblocks() int missedblks = 0, newblks = 0; int framecount = 0; cTxtBlk tempblk; - + if (TxMissing.empty() == false) { list::iterator p = TxMissing.begin(); while (p != TxMissing.end()) { @@ -1205,7 +1205,7 @@ void arq::sendblocks() if (LinkState != ABORT && LinkState != ABORTING) LinkState = WAITING; } - + void arq::connect(string callsign) { UrCall = callsign; @@ -1215,7 +1215,7 @@ void arq::connect(string callsign) if (rxUrCall) rxUrCall(UrCall); TxTextQueue.clear(); connectFrame(); - LinkState = CONNECTING; + LinkState = ARQ_CONNECTING; immediate = true; } @@ -1226,7 +1226,7 @@ void arq::disconnect() RetryTime = baseRetryTime; totalTx = 0; nbrbadTx = 0; - + LinkState = DISCONNECT; } @@ -1289,7 +1289,7 @@ void arqloop(void *who) { arq *me = (arq *)who; char c; - + // check for received chars including 0x06 for Sending = 0 if (me->getc1(c) == true) { me->rcvChar(c); @@ -1310,7 +1310,7 @@ void arqloop(void *who) me->immediate = false; } else { switch (me->LinkState) { - case CONNECTING : + case ARQ_CONNECTING : break; case DISCONNECT : me->LinkState = DISCONNECTING; @@ -1320,7 +1320,7 @@ void arqloop(void *who) me->TxPlainTextQueue.clear(); me->disconnectFrame(); me->immediate = true; - break; + break; case DISCONNECTING : if (me->retrytime-- == 0) { me->retrytime = me->rtry(); @@ -1383,8 +1383,8 @@ void arqloop(void *who) } } break; - - case CONNECTED : + + case ARQ_CONNECTED : default: if (me->TxTextQueue.empty() == false) { me->transmitdata(); @@ -1399,7 +1399,7 @@ void arqloop(void *who) } me->timeout--; if (me->timeout == 0 // 10000 / ARQLOOPTIME // 10 seconds remaining - && me->LinkState == CONNECTED // link is connected + && me->LinkState == ARQ_CONNECTED // link is connected && me->primary == true ) { // this is the connecting station if (--me->retries) { // repeat Retries and then allow timeout me->TxTextQueue.clear(); @@ -1409,14 +1409,14 @@ void arqloop(void *who) } } if (me->timeout == 0) { - if (me->LinkState == CONNECTED) + if (me->LinkState == ARQ_CONNECTED) me->LinkState = TIMEDOUT; else me->LinkState = DOWN; me->Retries = me->baseRetries; me->Timeout = me->baseTimeout; me->RetryTime = me->baseRetryTime; - + me->retries = me->Retries; me->retrytime = me->rtry(); me->TxMissing.clear(); @@ -1446,8 +1446,29 @@ void arqloop(void *who) } } - if (me->arqstop) + if (me->arqstop) { + me->LinkState = STOPPED; + me->arqstop = false; + + me->LinkState = DOWN; + me->Retries = me->baseRetries; + me->Timeout = me->baseTimeout; + me->RetryTime = me->baseRetryTime; + me->retries = me->Retries; + me->retrytime = me->rtry(); + + me->TxMissing.clear(); + me->TxBlocks.clear(); + me->TxTextQueue.clear(); + me->TxPlainTextQueue.clear(); + me->timeout = me->Timeout / ARQLOOPTIME; + + if (me->rxUrCall) me->rxUrCall(""); + + me->printSTATUS(STIMEDOUT, 10.0); + Fl::repeat_timeout( 1.0, arqloop, me); return; + } Fl::repeat_timeout( ARQLOOPTIME/1000.0, arqloop, me); } @@ -1458,4 +1479,8 @@ void arq::start_arq() Fl::add_timeout(1.0, arqloop, this); } +void arq::restart_arq() { + arqstop = true; +} + //--------------------------------------------------------------------- diff --git a/src/flarq-src/flarq.cxx b/src/flarq-src/flarq.cxx index e0567b08..72d862f9 100644 --- a/src/flarq-src/flarq.cxx +++ b/src/flarq-src/flarq.cxx @@ -77,9 +77,13 @@ #include "b64.h" #include "gettext.h" +#include "xml_server.h" + #define FLDIGI_port "7322" #define MPSK_port "3122" +#define FLARQ_XML_PORT 7422 + #define MPSK_TX "TX" #define MPSK_RX "RX" #define MPSK_TX2RX "RX_AFTER_TX" @@ -946,6 +950,7 @@ void arqCLOSE() { tcpip->close(); saveConfig(); + exit_server(); exit(0); } @@ -974,7 +979,14 @@ void restart() void arqCONNECT() { - if (digi_arq->state() < CONNECTED) { + int state = Fl::event_state(); + if ((state & FL_CTRL) == FL_CTRL) { + digi_arq->restart_arq(); + txtURCALL->value(""); + restart(); + return; + } + if (digi_arq->state() < ARQ_CONNECTED) { if (strlen(txtURCALL->value()) > 0) digi_arq->connect(txtURCALL->value()); } else { @@ -1140,7 +1152,6 @@ void payloadText(string s) } if (incomingText.find(arqemail) != string::npos) haveemail = true; - incomingText = ""; startpos = string::npos; endpos = string::npos; fnamepos = string::npos; @@ -1151,6 +1162,9 @@ void payloadText(string s) rxARQfile = false; rxARQhavesize = false; rxTextReady = true; + if (incomingText.find("FLMSG_XFR") != std::string::npos) + xml_rx_text_ready = true; + incomingText = ""; txtStatus->value(""); prgStatus->value(0.0); prgStatus->label(""); @@ -1220,7 +1234,7 @@ void moveEmailFile() void sendEmailFile() { - if (arqstate < CONNECTED) { + if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } @@ -1284,7 +1298,7 @@ void sendEmailFile() void sendAsciiFile() { - if (arqstate < CONNECTED) { + if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } @@ -1336,7 +1350,7 @@ void sendAsciiFile() void sendImageFile() { - if (arqstate < CONNECTED) { + if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } @@ -1385,7 +1399,7 @@ void sendImageFile() void sendBinaryFile() { - if (arqstate < CONNECTED) { + if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } @@ -1432,6 +1446,43 @@ void sendBinaryFile() sendingfile = false; } +void send_xml_text(std::string fname, std::string txt) +{ + if (arqstate < ARQ_CONNECTED) { + fl_alert2("Not connected"); + return; + } + + size_t txtsize; + char sizemsg[40]; + + if (!txt.empty()) { + TX.erase(); + TX.append(arqfile); + TX.append(fname); + TX.append("\n"); + TX.append(arqascii); + txtsize = txt.length(); + arqPayloadSize = txtsize; + blocksSent = 0; + snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", + static_cast(txtsize)); + TX.append(sizemsg); + TX.append(arqstart); + TX.append(txt); + TX.append(arqend); + traffic = true; + sendingfile = true; + statusmsg = "Sending XML payload: "; + statusmsg.append(fname); + txtStatus->value(statusmsg.c_str()); + cbClearText(); + return; + } + traffic = false; + sendingfile = false; +} + char statemsg[80]; void dispState() @@ -1450,7 +1501,7 @@ void dispState() // mnuSend->deactivate(); mnu->redraw(); } - else if (arqstate == CONNECTED || arqstate == WAITING) { + else if (arqstate == ARQ_CONNECTED || arqstate == WAITING) { if (btnCONNECT->active()) btnCONNECT->label("Disconnect"); if (!autobeacon) @@ -1467,7 +1518,7 @@ void dispState() if (currstate <= 0x7F) // receiving switch (currstate) { - case CONNECTING : + case ARQ_CONNECTING : snprintf(statemsg, sizeof(statemsg), "CONNECTING: %d", digi_arq->getTimeLeft()); txtState->value(statemsg); txtState->redraw(); @@ -1486,7 +1537,7 @@ void dispState() autobeacon = false; break; case WAITING : - case CONNECTED : + case ARQ_CONNECTED : char szState[80]; snprintf(szState, sizeof(szState),"CONNECTED - Quality = %4.2f", digi_arq->quality()); @@ -1573,7 +1624,7 @@ void mainloop(void *) if (rxTextReady) { if (haveemail) saveEmailFile(); - else + else if (!xml_rx_text_ready) saveRxFile(); } Fl::repeat_timeout(0.1, mainloop); @@ -1893,6 +1944,8 @@ int main (int argc, char *argv[] ) arqwin->icon((char *)flarq_icon_pixmap); #endif + start_xml_server(FLARQ_XML_PORT); + arqwin->show(argc, argv); return Fl::run(); } diff --git a/src/flarq-src/include/arq.h b/src/flarq-src/include/arq.h index ea4f3817..a42d707f 100644 --- a/src/flarq-src/include/arq.h +++ b/src/flarq-src/include/arq.h @@ -27,13 +27,13 @@ // generic Frame format: // dcl[info])12EF // | ||| | | | -// | ||| | | +--ASCII or (0x04) character +// | ||| | | +--ASCII or (0x04) character // | ||| | +-------checksum (4xAlphaNum) // | ||| +-------------Payload (1 ... 2^N chars, N 4, 5, 6, 7 8) -// | ||+---------------Block type +// | ||+---------------Block type // | |+----------------Stream id // | +-----------------Protocol version number -// +---------------------ASCII (0x01) character +// +---------------------ASCII (0x01) character // BLOCKSIZE = 2^n // @@ -88,19 +88,33 @@ using namespace std; #define ARQLOOPTIME 100 // # msec for loop timing //===================================================================== //link states -#define DOWN 0 -#define TIMEDOUT 1 -#define ABORT 3 -#define CONNECTING 4 -#define CONNECTED 5 -#define WAITING 6 -#define WAITFORACK 7 -#define DISCONNECT 8 -#define DISCONNECTING 9 -#define ABORTING 10 +enum LINK_STATES { + DOWN = 0, + TIMEDOUT, + ABORT, + ARQ_CONNECTING, + ARQ_CONNECTED, + WAITING, + WAITFORACK, + DISCONNECT, + DISCONNECTING, + ABORTING, + STOPPED +}; + +//#define DOWN 0 +//#define TIMEDOUT 1 +//#define ABORT 3 +//#define ARQ_CONNECTING 4 +//#define ARQ_CONNECTED 5 +//#define WAITING 6 +//#define WAITFORACK 7 +//#define DISCONNECT 8 +//#define DISCONNECTING 9 +//#define ABORTING 10 #define SENDING 0x80; - + //===================================================================== extern char *ARQASCII[]; @@ -129,8 +143,8 @@ public: crcval = (crcval >> 1); } } - unsigned int crc16(char c) { - update(c); + unsigned int crc16(char c) { + update(c); return crcval; } unsigned int crc16(string s) { @@ -166,7 +180,7 @@ public: class arq { private: - bool arqstop; + bool arqstop; string MyCall; string UrCall; @@ -175,18 +189,18 @@ private: string Frame; string Payload; string rcvPayload; - + string logfile; char MyStreamID; char UrStreamID; - + char MyBlockLengthChar; char UrBlockLengthChar; char BlockNumberChar; char fID; int blknbr; - + // queues // string TxTextQueue; // Text out to mail engine string TxPlainTextQueue; // plain text transmit queu @@ -219,14 +233,14 @@ private: int tx2txdelay; int TxDelay; int loopcount; - + int baseRetryTime; int baseTimeout; int baseRetries; - + bool immediate; bool primary; - + Ccrc16 framecrc; // My status @@ -242,7 +256,7 @@ private: vector MyMissing; // missing Rx blocks string MissingRxBlocks; vector RxPending; // RxPending Rx blocks (not consecutive) - + list TxBlocks; // fifo of transmit buffers list TxMissing; // fifo of sent; RxPending Status report list TxPending; // fifo of transmitted buffers pending print @@ -255,20 +269,19 @@ private: int LinkState; // status of ARQ link int Sending; - + bool bABORT; - + // Link quality for sending *** used for testing only !! *** // double sendquality; - - + void reset(); void resetTx(); void resetRx(); int rtry(); - + void setBufferlength(); - + void checkblocks(); string upcase(string s); void newblocknumber(); @@ -291,12 +304,12 @@ private: void beaconFrame(string txt); void textFrame(cTxtBlk block); void talkFrame(string txt); - + void addToTxQue(string s); - + void sendblocks(); void transmitdata(); - + string frame() {return Frame;} bool isUrcall(); @@ -315,8 +328,8 @@ private: void parseTALK(); int parseFrame(string txt); - -// external functions called by arq class + +// external functions called by arq class void (*sendfnc)(const string& s); bool (*getc1)(char &); void (*rcvfnc)(); @@ -330,7 +343,7 @@ private: void (*rxUrCall)(string s); void (*qualityfnc)(string s); void (*printSTATUS)(string s, double disptime); - + public: arq(); ~arq() {}; @@ -338,33 +351,35 @@ public: friend void arqloop(void *me); void start_arq(); + void restart_arq(); + string checksum(string &s); void myCall(string s) { MyCall = upcase(s);} string myCall() { return MyCall;} - + void urCall(string s) { UrCall = s;} string urCall() { return UrCall;} - + void newsession(); - + void setSendFunc( void (*f)(const string& s)) { sendfnc = f;} void setGetCFunc( bool (*f)(char &)) { getc1 = f;} void setRcvFunc( void (*f)()) { rcvfnc = f;} - + void setPrintRX( void (*f)(string s)) { printRX = f;} void setPrintTX( void (*f)(string s)) { printTX = f;} void setPrintTALK (void (*f)(string s)) {printTALK = f;} void setPrintRX_DEBUG (void (*f)(string s)){printRX_DEBUG = f;} void setPrintTX_DEBUG (void (*f)(string s)) {printTX_DEBUG = f;} void setPrintSTATUS (void (*f)(string s, double disptime)) { printSTATUS = f;} - + void setMaxHeaders( int mh ) { maxheaders = mh; } void setExponent( int exp ) { exponent = exp; setBufferlength(); } int getExponent() { return (int) exponent;} void setWaitTime( int rtime ) { RetryTime = rtime; baseRetryTime = rtime; } int getWaitTime() { return (int) RetryTime; } - void setRetries ( int rtries ) { + void setRetries ( int rtries ) { retries = Retries = baseRetries = rtries; } int getRetries() { return (int) Retries; } void setTimeout ( int tout ) { Timeout = tout; baseTimeout = tout; } @@ -378,41 +393,41 @@ public: void setQualityValue( void (*f)(string s)) { qualityfnc = f;} void setAbortedTransfer( void (*f)()) { abortfnc = f;}; void setDisconnected( void (*f)()) { disconnectfnc = f;}; - + void rcvChar( char c ); void connect(string callsign);//, int blocksize = 6, int retries = 4); void sendblocks( string txt ); - + void sendBeacon (string txt); void sendPlainText( string txt ); string getText() { return RxTextQueue;} void sendText(string txt); - bool connected() { return (LinkState == CONNECTED); } + bool connected() { return (LinkState == ARQ_CONNECTED); } void disconnect(); void abort(); - + int state() { return (LinkState + Sending);} - + int TXblocks() { return totalTx;} int TXbad() { return nbrbadTx;} int RXblocks() { return totalRx;} int RXbad() { return nbrbadRx;} - - double quality() { + + double quality() { if (totalTx == 0) return 1.0; return ( 1.0 * (totalTx - nbrbadTx) / totalTx ); } - + float percentSent() { if (Blocks2Send == 0) return 0.0; if ((TxBlocks.empty() && TxMissing.empty())) return 1.0; return (1.0 * (Blocks2Send - TxBlocks.size() - TxMissing.size()) / Blocks2Send); } - + bool transferComplete() { if (TxMissing.empty() == false) return false; if (TxBlocks.empty() == false) return false; diff --git a/src/flarq-src/include/flarq.h b/src/flarq-src/include/flarq.h index ef817eec..7b33781b 100644 --- a/src/flarq-src/include/flarq.h +++ b/src/flarq-src/include/flarq.h @@ -47,10 +47,19 @@ extern long iwaittime; extern long itimeout; extern int bcnInterval; +// used by xmlrpc interface +extern int arqstate; +extern bool sendingfile; +extern bool rxTextReady; +extern bool rxARQfile; +extern std::string txtarqload; + extern void cb_SaveComposeMail(); extern void cb_CancelComposeMail(); extern void cb_UseTemplate(); extern void cb_OpenComposeMail(); extern void ComposeMail(); +extern void send_xml_text(std::string, std::string); + #endif diff --git a/src/flarq-src/include/xml_server.h b/src/flarq-src/include/xml_server.h new file mode 100644 index 00000000..4c349b23 --- /dev/null +++ b/src/flarq-src/include/xml_server.h @@ -0,0 +1,51 @@ +// --------------------------------------------------------------------- +// +// xml_server.h, a part of flarq +// +// Copyflarqht (C) 2016 +// Dave Freese, W1HKJ +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with the program; if not, write to the +// +// Free Software Foundation, Inc. +// 51 Franklin Street, Fifth Floor +// Boston, MA 02110-1301 USA. +// +// --------------------------------------------------------------------- + +#ifndef XML_SERVER_H +#define XML_SERVER_H + +#include +#include +#include + +#include +#ifndef WIN32 +#include +#include +#include +#endif + +#include "status.h" + +#include +#include + +extern void start_xml_server(int port = 12345); +extern void exit_server(); + +extern bool xml_rx_text_ready; + +#endif diff --git a/src/flarq-src/xml_server.cxx b/src/flarq-src/xml_server.cxx new file mode 100644 index 00000000..b85dc10c --- /dev/null +++ b/src/flarq-src/xml_server.cxx @@ -0,0 +1,216 @@ +// --------------------------------------------------------------------- +// +// xml_server.cxx, a part of flarq +// +// Copyflarqht (C) 2016 +// Dave Freese, W1HKJ +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with the program; if not, write to the +// +// Free Software Foundation, Inc. +// 51 Franklin Street, Fifth Floor +// Boston, MA 02110-1301 USA. +// +// --------------------------------------------------------------------- + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +//#include "support.h" +//#include "debug.h" + +#include "arq.h" +#include "flarq.h" + +#include "xml_server.h" + +#include "xmlrpcpp/XmlRpc.h" + +using namespace XmlRpc; + +// The server +XmlRpcServer flarq_server; + +//---------------------------------------------------------------------- +// get interface +//---------------------------------------------------------------------- +bool xml_rx_text_ready = false; + +//---------------------------------------------------------------------- +// Request for flarq version +//---------------------------------------------------------------------- +class flarq_get_version : public XmlRpcServerMethod { +public: + flarq_get_version(XmlRpcServer* s) : XmlRpcServerMethod("flarq.get_version", s) {} + + void execute(XmlRpcValue& params, XmlRpcValue& result) { + result = VERSION; + } + + std::string help() { return std::string("returns version number of flarq"); } + +} flarq_get_version(&flarq_server); + +//---------------------------------------------------------------------- +// Request for ARQ state +//---------------------------------------------------------------------- +class flarq_get_state : public XmlRpcServerMethod { +public: + flarq_get_state(XmlRpcServer* s) : XmlRpcServerMethod("flarq.get_state", s) {} + +// x00 - unconnected +// x81 - connected +// x82 - sending +// x83 - receiving +// x84 - send completed +// x85 - recv completed + + void execute(XmlRpcValue& params, XmlRpcValue& result) { + int state = 0; + if (arqstate != ARQ_CONNECTED) + state = 0; + else if (sendingfile) + state = 0x82; + else if (rxARQfile) + state = 0x83; + else if (xml_rx_text_ready) + state = 0x85; + else + state = 0x81; + result = state; + } + + std::string help() { return std::string("returns state of connection"); } + +} flarq_get_state(&flarq_server); + +//---------------------------------------------------------------------- +// Request for received text +//---------------------------------------------------------------------- + +class flarq_rcvd_text : public XmlRpcServerMethod { +public: + flarq_rcvd_text(XmlRpcServer* s) : XmlRpcServerMethod("flarq.rcvd_text", s) {} + + void execute(XmlRpcValue& params, XmlRpcValue& result) { + std::string result_string = "none"; + if (xml_rx_text_ready) result_string = txtarqload; + xml_rx_text_ready = false; + result = result_string; + txtarqload = ""; + } + + std::string help() { return std::string("returns received text"); } + +} flarq_rcvd_text(&flarq_server); + +//---------------------------------------------------------------------- +// set interface +//---------------------------------------------------------------------- + +//------------------------------------------------------------------------------ +// Send text +//------------------------------------------------------------------------------ + +class flarq_send_text : public XmlRpcServerMethod { +public: + flarq_send_text(XmlRpcServer* s) : XmlRpcServerMethod("flarq.send_text", s) {} + + void execute(XmlRpcValue& params, XmlRpcValue &result) { + std::string txt_to_send = string(params[0]); + send_xml_text("FLMSG_XFR", txt_to_send); + } + std::string help() { return std::string("send_text"); } + +} flarq_send_text(&flarq_server); + +struct MLIST { + string name; string signature; string help; +} mlist[] = { + { "flarq.rcvd_text", "s:n", "return MODE of current VFO" }, + { "flarq.get_state", "s:n", "return PTT state" }, + { "flarq.send_text", "i:i", "set MODE iaw MODE table" } +}; + +class flarq_list_methods : public XmlRpcServerMethod { +public: + flarq_list_methods(XmlRpcServer *s) : XmlRpcServerMethod("flarq.list_methods", s) {} + + void execute(XmlRpcValue& params, XmlRpcValue& result) { + + vector methods; + for (size_t n = 0; n < sizeof(mlist) / sizeof(*mlist); ++n) { + XmlRpcValue::ValueStruct item; + item["name"] = mlist[n].name; + item["signature"] = mlist[n].signature; + item["help"] = mlist[n].help; + methods.push_back(item); + } + + result = methods; + } + std::string help() { return std::string("get flarq methods"); } +} flarq_list_methods(&flarq_server); + +//------------------------------------------------------------------------------ +// support thread xmlrpc clients +//------------------------------------------------------------------------------ + +pthread_t *xml_thread = 0; + +void * xml_thread_loop(void *d) +{ + for(;;) { + flarq_server.work(-1.0); + } + return NULL; +} + +void start_xml_server(int port) +{ + XmlRpc::setVerbosity(0); + +// Create the server socket on the specified port + flarq_server.bindAndListen(port); + +// Enable introspection + flarq_server.enableIntrospection(true); + + xml_thread = new pthread_t; + if (pthread_create(xml_thread, NULL, xml_thread_loop, NULL)) { + perror("pthread_create"); + exit(EXIT_FAILURE); + } +} + +void exit_server() +{ + flarq_server.exit(); +} + + diff --git a/src/logger/rx_extract.cxx b/src/logger/rx_extract.cxx index 3df47820..a47b9bcb 100644 --- a/src/logger/rx_extract.cxx +++ b/src/logger/rx_extract.cxx @@ -62,13 +62,14 @@ Save tags and all enclosed text to date-time stamped file, ie:\n\ ~/.nbems/WRAP/recv/extract-20090127-092515.wrap"); #endif -#define bufsize 16 +#define bufsize 32 char rx_extract_buff[bufsize + 1]; string rx_buff; string rx_extract_msg; bool extract_wrap = false; bool extract_flamp = false; +bool extract_arq = false; bool bInit = false; @@ -81,6 +82,7 @@ void rx_extract_reset() rx_extract_buff[bufsize] = 0; extract_wrap = false; extract_flamp = false; + extract_arq = false; put_status(""); } @@ -286,16 +288,40 @@ void rx_extract_add(int c) memmove(rx_extract_buff, &rx_extract_buff[1], bufsize - 1); rx_extract_buff[bufsize - 1] = ch; - if ( strstr(rx_extract_buff, wrap_beg) && !extract_flamp) { + if (!extract_arq && strstr(rx_extract_buff, "ARQ:FILE::FLMSG_XFR")) { + extract_arq = true; + REQ(rx_remove_timer); + REQ(rx_add_timer); + memset(rx_extract_buff, ' ', bufsize); + rx_extract_msg = "Extracting ARQ msg"; + put_status(rx_extract_msg.c_str()); + return; + } else if (extract_arq) { + REQ(rx_remove_timer); + REQ(rx_add_timer); + if (strstr(rx_extract_buff, "ARQ::ETX")) + rx_extract_reset(); + return; + } else if (!extract_flamp && strstr(rx_extract_buff, flamp_beg)) { + extract_flamp = true; + memset(rx_extract_buff, ' ', bufsize); + rx_extract_msg = "Extracting FLAMP"; + put_status(rx_extract_msg.c_str()); + return; + } else if (extract_flamp) { + REQ(rx_remove_timer); + REQ(rx_add_timer); + if (strstr(rx_extract_buff, flamp_end) != NULL) + rx_extract_reset(); + return; + } else if (!extract_wrap && strstr(rx_extract_buff, wrap_beg)) { rx_buff.assign(wrap_beg); rx_extract_msg = "Extracting WRAP/FLMSG"; - put_status(rx_extract_msg.c_str()); - - memset(rx_extract_buff, ' ', bufsize); extract_wrap = true; REQ(rx_remove_timer); REQ(rx_add_timer); + return; } else if (extract_wrap) { rx_buff += ch; REQ(rx_remove_timer); @@ -304,16 +330,6 @@ void rx_extract_add(int c) invoke_flmsg(); rx_extract_reset(); } - } else if (strstr(rx_extract_buff, flamp_beg) && ! extract_wrap) { - extract_flamp = true; - rx_extract_msg = "Extracting FLAMP"; - put_status(rx_extract_msg.c_str()); - } else if (extract_flamp == true) { - REQ(rx_remove_timer); - REQ(rx_add_timer); - if (strstr(rx_extract_buff, flamp_end) != NULL) { - rx_extract_reset(); - } } } From 68d9b3228448740ccc16aec20a9820e4f49b458b Mon Sep 17 00:00:00 2001 From: David Freese Date: Wed, 13 Apr 2016 07:38:53 -0500 Subject: [PATCH 102/138] FSQ message files * Changed # directive behavior - save named message to new file - append unnamed (callsign) message to callsign file * Added date time stamp to each received "call" message - user configurable --- src/dialogs/confdialog.cxx | 49 +++++++++++++++++++++++++------------ src/dialogs/confdialog.fl | 42 +++++++++++++++++++------------ src/fsq/fsq.cxx | 13 +++++++--- src/include/confdialog.h | 1 + src/include/configuration.h | 3 +++ 5 files changed, 74 insertions(+), 34 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index b6acc636..1168bca6 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -2979,6 +2979,13 @@ static void cb_QTC(Fl_Input* o, void*) { progdefaults.changed = true; } +Fl_Check_Button *btn_fsq_msg_dt_stamp=(Fl_Check_Button *)0; + +static void cb_btn_fsq_msg_dt_stamp(Fl_Check_Button* o, void*) { + progdefaults.add_fsq_msg_dt=o->value(); +progdefaults.changed=true; +} + Fl_Output *txtAuditLog=(Fl_Output *)0; Fl_Light_Button *btn_enable_auditlog=(Fl_Light_Button *)0; @@ -8472,7 +8479,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* tabFeld { tabFSQ = new Fl_Group(0, 50, 600, 330, _("FSQ")); tabFSQ->hide(); - { Fl_Group* o = new Fl_Group(5, 60, 585, 66, _("Rx Parameters")); + { Fl_Group* o = new Fl_Group(5, 60, 585, 69, _("Rx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Value_Slider* o = valhits = new Fl_Value_Slider(140, 65, 125, 22, _("Min Hits")); @@ -8515,7 +8522,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Choice* sel_fsq_heard_aging o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(5, 130, 585, 102, _("Tx Parameters")); + { Fl_Group* o = new Fl_Group(5, 130, 585, 90, _("Tx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btn_fsqbaud[0] = new Fl_Round_Button(150, 139, 55, 15, _("2 baud")); @@ -8570,62 +8577,74 @@ i on a\ntouch screen device such as a tablet.")); cntr_FSQ_time_out->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.fsq_time_out); } // Fl_Counter* cntr_FSQ_time_out - { Fl_Input* o = new Fl_Input(80, 199, 456, 22, _("QTC:")); + { Fl_Input* o = new Fl_Input(80, 189, 456, 22, _("QTC:")); o->tooltip(_("Enter QTC text")); o->callback((Fl_Callback*)cb_QTC); o->value(progdefaults.fsqQTCtext.c_str()); } // Fl_Input* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(5, 235, 585, 80, _("Logging")); + { Fl_Group* o = new Fl_Group(5, 220, 585, 39, _("Message Logging")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { Fl_Output* o = txtAuditLog = new Fl_Output(82, 255, 325, 22, _("Audit log")); + { Fl_Check_Button* o = btn_fsq_msg_dt_stamp = new Fl_Check_Button(157, 232, 297, 15, _("Add date/time stamp to each message")); + btn_fsq_msg_dt_stamp->tooltip(_("Add date/time stamp to each # received message")); + btn_fsq_msg_dt_stamp->down_box(FL_DOWN_BOX); + btn_fsq_msg_dt_stamp->value(1); + btn_fsq_msg_dt_stamp->callback((Fl_Callback*)cb_btn_fsq_msg_dt_stamp); + o->value(progdefaults.add_fsq_msg_dt); + } // Fl_Check_Button* btn_fsq_msg_dt_stamp + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(5, 260, 585, 80, _("Logging")); + o->box(FL_ENGRAVED_BOX); + o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); + { Fl_Output* o = txtAuditLog = new Fl_Output(82, 280, 325, 22, _("Audit log")); o->value(progdefaults.fsq_audit_log.c_str()); } // Fl_Output* txtAuditLog - { Fl_Light_Button* o = btn_enable_auditlog = new Fl_Light_Button(421, 256, 74, 20, _("Enable")); + { Fl_Light_Button* o = btn_enable_auditlog = new Fl_Light_Button(421, 281, 74, 20, _("Enable")); btn_enable_auditlog->selection_color((Fl_Color)2); btn_enable_auditlog->callback((Fl_Callback*)cb_btn_enable_auditlog); o->value(progdefaults.fsq_enable_audit_log); } // Fl_Light_Button* btn_enable_auditlog - { btn_select_auditlog = new Fl_Button(509, 256, 70, 20, _("Select")); + { btn_select_auditlog = new Fl_Button(509, 281, 70, 20, _("Select")); btn_select_auditlog->callback((Fl_Callback*)cb_btn_select_auditlog); } // Fl_Button* btn_select_auditlog - { Fl_Output* o = txtHeardLog = new Fl_Output(82, 284, 325, 22, _("Heard log")); + { Fl_Output* o = txtHeardLog = new Fl_Output(82, 308, 325, 22, _("Heard log")); o->value(progdefaults.fsq_heard_log.c_str()); } // Fl_Output* txtHeardLog - { Fl_Light_Button* o = btn_enable_fsq_heard_log = new Fl_Light_Button(421, 285, 74, 20, _("Enable")); + { Fl_Light_Button* o = btn_enable_fsq_heard_log = new Fl_Light_Button(421, 309, 74, 20, _("Enable")); btn_enable_fsq_heard_log->selection_color((Fl_Color)2); btn_enable_fsq_heard_log->callback((Fl_Callback*)cb_btn_enable_fsq_heard_log); o->value(progdefaults.fsq_enable_heard_log); } // Fl_Light_Button* btn_enable_fsq_heard_log - { btn_select_fsq_heard_log = new Fl_Button(509, 285, 70, 20, _("Select")); + { btn_select_fsq_heard_log = new Fl_Button(509, 309, 70, 20, _("Select")); btn_select_fsq_heard_log->callback((Fl_Callback*)cb_btn_select_fsq_heard_log); } // Fl_Button* btn_select_fsq_heard_log o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(5, 318, 585, 55, _("Text Colors")); + { Fl_Group* o = new Fl_Group(5, 340, 585, 35, _("Text Colors")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { btn_fsq_xmt_color = new Fl_Button(82, 339, 65, 24, _("XMIT")); + { btn_fsq_xmt_color = new Fl_Button(145, 346, 40, 24, _("XMIT")); btn_fsq_xmt_color->tooltip(_("Transmit text")); btn_fsq_xmt_color->callback((Fl_Callback*)cb_btn_fsq_xmt_color); btn_fsq_xmt_color->align(Fl_Align(FL_ALIGN_LEFT)); btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color); } // Fl_Button* btn_fsq_xmt_color - { btn_fsq_directed_color = new Fl_Button(253, 339, 65, 24, _("DIRECTED")); + { btn_fsq_directed_color = new Fl_Button(275, 346, 40, 24, _("DIRECTED")); btn_fsq_directed_color->tooltip(_("Directed received text")); btn_fsq_directed_color->callback((Fl_Callback*)cb_btn_fsq_directed_color); btn_fsq_directed_color->align(Fl_Align(FL_ALIGN_LEFT)); btn_fsq_directed_color->color(progdefaults.fsq_directed_color); } // Fl_Button* btn_fsq_directed_color - { btn_fsq_undirected_color = new Fl_Button(425, 339, 65, 24, _("UNDIRECTED")); + { btn_fsq_undirected_color = new Fl_Button(425, 346, 40, 24, _("UNDIRECTED")); btn_fsq_undirected_color->tooltip(_("Undirected received text")); btn_fsq_undirected_color->callback((Fl_Callback*)cb_btn_fsq_undirected_color); btn_fsq_undirected_color->align(Fl_Align(FL_ALIGN_LEFT)); btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color); } // Fl_Button* btn_fsq_undirected_color - { btn_fsq_color_defaults = new Fl_Button(507, 339, 74, 24, _("Defaults")); + { btn_fsq_color_defaults = new Fl_Button(507, 346, 74, 24, _("Defaults")); btn_fsq_color_defaults->callback((Fl_Callback*)cb_btn_fsq_color_defaults); } // Fl_Button* btn_fsq_color_defaults o->end(); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 96b68bbb..78376d7b 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -3568,7 +3568,7 @@ progdefaults.changed = true;} } { Fl_Group {} { label {Rx Parameters} open - xywh {5 60 585 66} box ENGRAVED_BOX align 21 + xywh {5 60 585 69} box ENGRAVED_BOX align 21 } { Fl_Value_Slider valhits { label {Min Hits} @@ -3603,7 +3603,7 @@ progdefaults.changed = true;} open } Fl_Group {} { label {Tx Parameters} open - xywh {5 130 585 102} box ENGRAVED_BOX align 21 + xywh {5 130 585 90} box ENGRAVED_BOX align 21 } { Fl_Round_Button {btn_fsqbaud[0]} { label {2 baud} @@ -3687,24 +3687,36 @@ progdefaults.changed = true;} label {QTC:} callback {progdefaults.fsqQTCtext = o->value(); progdefaults.changed = true;} - tooltip {Enter QTC text} xywh {80 199 456 22} + tooltip {Enter QTC text} xywh {80 189 456 22} code0 {o->value(progdefaults.fsqQTCtext.c_str());} } } + Fl_Group {} { + label {Message Logging} open + xywh {5 220 585 39} box ENGRAVED_BOX align 21 + } { + Fl_Check_Button btn_fsq_msg_dt_stamp { + label {Add date/time stamp to each message} + callback {progdefaults.add_fsq_msg_dt=o->value(); +progdefaults.changed=true;} + tooltip {Add date/time stamp to each \# received message} xywh {157 232 297 15} down_box DOWN_BOX value 1 + code0 {o->value(progdefaults.add_fsq_msg_dt);} + } + } Fl_Group {} { label Logging open - xywh {5 235 585 80} box ENGRAVED_BOX align 21 + xywh {5 260 585 80} box ENGRAVED_BOX align 21 } { Fl_Output txtAuditLog { label {Audit log} - xywh {82 255 325 22} + xywh {82 280 325 22} code0 {o->value(progdefaults.fsq_audit_log.c_str());} } Fl_Light_Button btn_enable_auditlog { label Enable callback {progdefaults.fsq_enable_audit_log = o->value(); progdefaults.changed = true;} - xywh {421 256 74 20} selection_color 2 + xywh {421 281 74 20} selection_color 2 code0 {o->value(progdefaults.fsq_enable_audit_log);} } Fl_Button btn_select_auditlog { @@ -3718,18 +3730,18 @@ if (fname) { txtAuditLog->value(progdefaults.fsq_audit_log.c_str()); progdefaults.changed = true; }} - xywh {509 256 70 20} + xywh {509 281 70 20} } Fl_Output txtHeardLog { label {Heard log} - xywh {82 284 325 22} + xywh {82 308 325 22} code0 {o->value(progdefaults.fsq_heard_log.c_str());} } Fl_Light_Button btn_enable_fsq_heard_log { label Enable callback {progdefaults.fsq_enable_heard_log = o->value(); progdefaults.changed = true;} - xywh {421 285 74 20} selection_color 2 + xywh {421 309 74 20} selection_color 2 code0 {o->value(progdefaults.fsq_enable_heard_log);} } Fl_Button btn_select_fsq_heard_log { @@ -3742,12 +3754,12 @@ if (fname) { txtHeardLog->value(progdefaults.fsq_heard_log.c_str()); progdefaults.changed = true; }} - xywh {509 285 70 20} + xywh {509 309 70 20} } } Fl_Group {} { label {Text Colors} open - xywh {5 318 585 55} box ENGRAVED_BOX align 21 + xywh {5 340 585 35} box ENGRAVED_BOX align 21 } { Fl_Button btn_fsq_xmt_color { label XMIT @@ -3759,7 +3771,7 @@ btn_fsq_xmt_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); progdefaults.changed = true;} - tooltip {Transmit text} xywh {82 339 65 24} align 4 + tooltip {Transmit text} xywh {145 346 40 24} align 4 code0 {btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color);} } Fl_Button btn_fsq_directed_color { @@ -3772,7 +3784,7 @@ btn_fsq_directed_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); progdefaults.changed = true;} - tooltip {Directed received text} xywh {253 339 65 24} align 4 + tooltip {Directed received text} xywh {275 346 40 24} align 4 code0 {btn_fsq_directed_color->color(progdefaults.fsq_directed_color);} } Fl_Button btn_fsq_undirected_color { @@ -3785,7 +3797,7 @@ btn_fsq_undirected_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); progdefaults.changed = true;} - tooltip {Undirected received text} xywh {425 339 65 24} align 4 + tooltip {Undirected received text} xywh {425 346 40 24} align 4 code0 {btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color);} } Fl_Button btn_fsq_color_defaults { @@ -3807,7 +3819,7 @@ fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); progdefaults.changed = true;} - xywh {507 339 74 24} + xywh {507 346 74 24} } } } diff --git a/src/fsq/fsq.cxx b/src/fsq/fsq.cxx index e8b81f5c..52c57968 100644 --- a/src/fsq/fsq.cxx +++ b/src/fsq/fsq.cxx @@ -675,14 +675,14 @@ void fsq::parse_pound(std::string relay) { size_t p1 = NIT, p2 = NIT; std::string fname = ""; - bool named_file = false; + bool call_file = true; p1 = rx_text.find('['); if (p1 != NIT) { p2 = rx_text.find(']', p1); if (p2 != NIT) { fname = rx_text.substr(p1 + 1, p2 - p1 - 1); fname = fl_filename_name(fname.c_str()); - named_file = true; + call_file = false; } else p2 = 0; } else p2 = 0; if (fname.empty()) { @@ -695,13 +695,18 @@ void fsq::parse_pound(std::string relay) std::ofstream rxfile; fname.insert(0, TempDir); - if (named_file) { + if (call_file) { rxfile.open(fname.c_str(), ios::app); } else { rxfile.open(fname.c_str(), ios::out); } if (!rxfile) return; - rxfile << rx_text.substr(p2+1); + if (call_file && progdefaults.add_fsq_msg_dt) { + rxfile << "Received: " << zdate() << ", " << ztime() << "\n"; + rxfile << rx_text.substr(p2+1) << "\n"; + } else + rxfile << rx_text.substr(p2+1); + rxfile.close(); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); diff --git a/src/include/confdialog.h b/src/include/confdialog.h index a05245cb..34e217eb 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -338,6 +338,7 @@ extern Fl_Choice *sel_fsq_frequency; extern Fl_Choice *sel_fsq_sounder; extern Fl_Check_Button *btn_fsq_lowercase; extern Fl_Counter *cntr_FSQ_time_out; +extern Fl_Check_Button *btn_fsq_msg_dt_stamp; extern Fl_Output *txtAuditLog; extern Fl_Light_Button *btn_enable_auditlog; extern Fl_Button *btn_select_auditlog; diff --git a/src/include/configuration.h b/src/include/configuration.h index 8bf732c4..a0d011ca 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -700,6 +700,9 @@ ELEM_(Fl_Color, fsq_undirected_color, "FSQUNDIRECTEDCOLOR", \ "Color for FSQ undirected text", \ FL_DARK_GREEN) \ + ELEM_(bool, add_fsq_msg_dt, "ADDFSQMSGDT", \ + "Add date-time stamp to each # type received message", \ + 1) \ /* IFKP */ \ ELEM_(int, ifkp_baud, "IFKPBAUD", \ "1, 2, 3", \ From 4ab48d41e46f44dcdbb255dd87b9e205e518b4b4 Mon Sep 17 00:00:00 2001 From: Robert Stiles Date: Tue, 12 Apr 2016 13:28:00 -0500 Subject: [PATCH 103/138] 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 --- src/dialogs/confdialog.cxx | 122 ++++++++++++++++--- src/dialogs/confdialog.fl | 227 ++++++++++++++++++++++-------------- src/dialogs/fl_digi.cxx | 74 +++++++++++- src/include/confdialog.h | 5 + src/include/configuration.h | 13 ++- src/include/data_io.h | 18 ++- src/include/kiss_io.h | 2 +- src/include/socket.h | 2 + src/include/status.h | 4 +- src/include/timeops.h | 5 +- src/main.cxx | 4 +- src/misc/kiss_io.cxx | 214 +++++++++++++++++++++++++++------ src/misc/socket.cxx | 50 +++++++- src/misc/status.cxx | 17 +++ src/psk/psk.cxx | 32 +++-- 15 files changed, 620 insertions(+), 169 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index 1168bca6..0843e819 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -58,7 +58,7 @@ static void cbRxFontBrowser(Fl_Widget*, void*) { ReceiveText->setFont(font); ReceiveText->setFontSize(size); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); - + fsq_rx_text->setFont(font); fsq_rx_text->setFontSize(size); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); @@ -113,12 +113,12 @@ static void cbMacroEditFontBrowser(Fl_Widget*, void*) { progdefaults.MacroEditFontnbr = font; progdefaults.MacroEditFontsize = size; - + update_macroedit_font(); MacroText->textfont(font); MacroText->textsize(size); - + font_browser->hide(); progdefaults.changed = true; @@ -141,7 +141,7 @@ static void cbMacroBtnFontBrowser(Fl_Widget*, void*) { progdefaults.MacroBtnFontcolor = font_browser->fontColor(); font_browser->hide(); - + btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); 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.G = g; progdefaults.Smeter_bg_color.B = b; - + set_smeter_colors(); 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.G = g; progdefaults.Smeter_scale_color.B = b; - + set_smeter_colors(); 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.G = g; progdefaults.Smeter_meter_color.B = b; - + set_smeter_colors(); 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.G = g; progdefaults.PWRmeter_bg_color.B = b; - + set_smeter_colors(); 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.G = g; progdefaults.PWRmeter_scale_color.B = b; - + set_smeter_colors(); 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.G = g; progdefaults.PWRmeter_meter_color.B = b; - + set_smeter_colors(); progdefaults.changed = true; @@ -3404,6 +3404,12 @@ static void cb_cnt_pilot_power(Fl_Counter2* o, void*) { 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_Tabs *tabsRTTY=(Fl_Tabs *)0; @@ -5627,6 +5633,7 @@ if(o->value()) disable_config_p2p_io_widgets(); else enable_config_p2p_io_widgets(); +kiss_io_set_button_state(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(); } +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; static void cb_txtArq_ip_address(Fl_Input2* o, void*) { @@ -5899,6 +5951,7 @@ Fl_Double_Window* ConfigureDialog() { tabOperator->tooltip(_("Operator information")); tabOperator->callback((Fl_Callback*)cb_tabOperator); tabOperator->when(FL_WHEN_CHANGED); + tabOperator->hide(); { Fl_Group* o = new Fl_Group(55, 35, 490, 170, _("Station")); o->box(FL_ENGRAVED_FRAME); 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->align(Fl_Align(FL_ALIGN_TOP_RIGHT)); { tabCW = new Fl_Group(0, 50, 600, 330, _("CW")); + tabCW->hide(); { tabsCW = new Fl_Tabs(0, 50, 600, 330); tabsCW->selection_color(FL_LIGHT1); { 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(); } // Fl_Group* tabContestia { tabPSK = new Fl_Group(0, 50, 600, 330, _("PSK")); - tabPSK->hide(); { tabsPSK = new Fl_Tabs(0, 50, 600, 330); tabsPSK->selection_color(FL_LIGHT1); { 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")); o->box(FL_ENGRAVED_FRAME); 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->down_box(FL_DOWN_BOX); btnPSKpilot->callback((Fl_Callback*)cb_btnPSKpilot); o->value(progdefaults.pskpilot); } // 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->type(1); 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->labelsize(FL_NORMAL_SIZE); } // 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(); } // Fl_Group* o grpPSK->end(); @@ -11907,7 +11966,6 @@ and restarted if needed.")); { tabIO = new Fl_Group(0, 25, 600, 355, _("IO")); tabIO->tooltip(_("Program to Program Communications")); tabIO->callback((Fl_Callback*)cb_tabIO); - tabIO->hide(); { Fl_Group* o = new Fl_Group(6, 34, 588, 102); o->box(FL_ENGRAVED_BOX); 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(); } // 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\ -S for programs that supports UDP and TNC-2 KISS protocol.\nOnly one interface \ -(ARQ/KISS) can be active at any given time.\nKISS/ARQ/XML Addr/Port changes re\ -quire program restart.")); +S for programs that supports TCP/UDP and TNC-2 KISS protocol.\nOnly one interf\ +ace (ARQ/KISS) can be active at any given time.\nKISS/ARQ/XML Addr/Port change\ +s require program restart.")); } // Fl_Box* o o->end(); } // Fl_Group* o @@ -12020,7 +12078,7 @@ quire program restart.")); o->step(1,10); progStatus.ip_lock ? o->deactivate() : o->activate(); } // 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->down_box(FL_DOWN_BOX); btnEnableBusyChannel->callback((Fl_Callback*)cb_btnEnableBusyChannel); @@ -12044,7 +12102,7 @@ quire program restart.")); o->value(progdefaults.kiss_out_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // 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->down_box(FL_DOWN_BOX); btnEnable_dual_port->callback((Fl_Callback*)cb_btnEnable_dual_port); @@ -12056,6 +12114,32 @@ quire program restart.")); btn_restart_kiss->hide(); progStatus.ip_lock ? o->deactivate() : o->activate(); } // 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(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(6, 225, 588, 35, _("ARQ")); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 78376d7b..01b1c5ef 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -1,122 +1,122 @@ # data file for the Fltk User Interface Designer (fluid) -version 1.0303 -i18n_type 1 -i18n_include "gettext.h" -i18n_function _ -header_name {.h} +version 1.0303 +i18n_type 1 +i18n_include "gettext.h" +i18n_function _ +header_name {.h} code_name {.cxx} decl {\#include } {private local -} +} decl {\#include } {private local -} +} decl {\#include } {private local -} +} decl {\#include } {private local -} +} decl {\#include } {private local -} +} decl {\#include } {private local -} +} decl {\#include "main.h"} {private local -} +} decl {\#include "fl_digi.h"} {private local -} +} decl {\#include "data_io.h"} {private local -} +} decl {\#include "Viewer.h"} {private global -} +} decl {\#include "font_browser.h"} {public global -} +} decl {\#include "soundconf.h"} {private local -} +} decl {\#include "globals.h"} {public local -} +} decl {\#include "modem.h"} {public local -} +} decl {\#include "configuration.h"} {public local -} +} decl {\#include "combo.h"} {public local -} +} decl {\#include "waterfall.h"} {private local -} +} decl {\#include "rigxml.h"} {private local -} +} decl {\#include "lookupcall.h"} {private local -} +} decl {\#include "icons.h"} {private local -} +} decl {\#include "Viewer.h"} {private local -} +} decl {\#include "pskrep.h"} {private global -} +} decl {\#include "flinput2.h"} {public local -} +} decl {\#include "flslider2.h"} {public local -} +} decl {\#include "flmisc.h"} {public local -} +} decl {\#include "logsupport.h"} {private local -} +} decl {\#include "notify.h"} {private local -} +} decl {\#include "debug.h"} {private local -} +} decl {\#include "status.h"} {private local -} +} decl {\#include "rx_extract.h"} {private local -} +} decl {\#include "kmlserver.h"} {private local -} +} decl {\#include "macroedit.h"} {private local -} +} decl {\#include "fileselect.h"} {private local -} +} decl {extern void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata);} {private local -} +} decl {\#if USE_HAMLIB \#include "hamlib.h" \#endif} {private local -} +} decl {Fl_Double_Window *dlgConfig;} {public local -} +} decl {Mode_Browser* mode_browser;} {public local -} +} 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); if (fl_color_chooser("Font color", r, g, b)) c = fl_rgb_color(r, g, b);} {} -} +} 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->setFontSize(size); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); - + fsq_rx_text->setFont(font); fsq_rx_text->setFontSize(size); 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(); progdefaults.changed = true;} {} -} +} 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(); progdefaults.changed = true;} {} -} +} 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.MacroEditFontsize = size; - + update_macroedit_font(); MacroText->textfont(font); MacroText->textsize(size); - + font_browser->hide(); progdefaults.changed = true;} {} -} +} Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {return_type void } { @@ -222,7 +222,7 @@ Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {return_type void progdefaults.changed = true; font_browser->hide();} {} -} +} 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(); font_browser->hide(); - + btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelsize(progdefaults.MacroBtnFontsize); @@ -249,7 +249,7 @@ Function {cbMacroBtnFontBrowser(Fl_Widget*, void*)} {private return_type void progdefaults.changed = true; colorize_macros();} {} -} +} Function {cbViewerFontBrowser(Fl_Widget*, void*)} {return_type void } { @@ -259,7 +259,7 @@ Function {cbViewerFontBrowser(Fl_Widget*, void*)} {return_type void progdefaults.changed = true; font_browser->hide();} {} -} +} Function {cbFreqControlFontBrowser(Fl_Widget*, void*)} {return_type void } { @@ -277,7 +277,7 @@ Function {cbFreqControlFontBrowser(Fl_Widget*, void*)} {return_type void qsoFreqDisp3->redraw(); font_browser->hide();} {} -} +} 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(); progdefaults.changed = true;} {} -} +} 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(); progdefaults.changed = true;} {} -} +} 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++) qrzbxml[i]->value(b == qrzbxml[i]);} {} -} +} 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++) qrzbweb[i]->value(b == qrzbweb[i]);} {} -} +} Function {ConfigureDialog()} {open } { @@ -366,8 +366,8 @@ static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} } { Fl_Group tabOperator { label Operator - callback {progdefaults.changed = true;} open selected - tooltip {Operator information} xywh {0 25 600 355} when 1 + callback {progdefaults.changed = true;} open + tooltip {Operator information} xywh {0 25 600 355} when 1 hide } { Fl_Group {} { label Station open @@ -1912,7 +1912,7 @@ font_browser->show();} progdefaults.Smeter_bg_color.R = r; progdefaults.Smeter_bg_color.G = g; progdefaults.Smeter_bg_color.B = b; - + set_smeter_colors(); progdefaults.changed = true;} @@ -1931,7 +1931,7 @@ font_browser->show();} progdefaults.Smeter_scale_color.R = r; progdefaults.Smeter_scale_color.G = g; progdefaults.Smeter_scale_color.B = b; - + set_smeter_colors(); progdefaults.changed = true;} @@ -1950,7 +1950,7 @@ font_browser->show();} progdefaults.Smeter_meter_color.R = r; progdefaults.Smeter_meter_color.G = g; progdefaults.Smeter_meter_color.B = b; - + set_smeter_colors(); progdefaults.changed = true;} @@ -1974,7 +1974,7 @@ font_browser->show();} progdefaults.PWRmeter_bg_color.R = r; progdefaults.PWRmeter_bg_color.G = g; progdefaults.PWRmeter_bg_color.B = b; - + set_smeter_colors(); progdefaults.changed = true;} @@ -1993,7 +1993,7 @@ font_browser->show();} progdefaults.PWRmeter_scale_color.R = r; progdefaults.PWRmeter_scale_color.G = g; progdefaults.PWRmeter_scale_color.B = b; - + set_smeter_colors(); progdefaults.changed = true;} @@ -2012,7 +2012,7 @@ font_browser->show();} progdefaults.PWRmeter_meter_color.R = r; progdefaults.PWRmeter_meter_color.G = g; progdefaults.PWRmeter_meter_color.B = b; - + set_smeter_colors(); 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 { label CW open - xywh {0 50 600 330} + xywh {0 50 600 330} hide } { Fl_Tabs tabsCW {open xywh {0 50 600 330} selection_color 50 @@ -4160,7 +4160,7 @@ progdefaults.changed = true;} } Fl_Group tabPSK { label PSK open - xywh {0 50 600 330} hide + xywh {0 50 600 330} } { Fl_Tabs tabsPSK {open xywh {0 50 600 330} selection_color 50 @@ -4241,18 +4241,24 @@ progdefaults.changed = true;} label {Pilot tone} callback {progdefaults.pskpilot = o->value(); 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);} } Fl_Counter cnt_pilot_power { label {pilot power (dB)} callback {progdefaults.pilot_power = o->value(); 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);} code1 {o->labelsize(FL_NORMAL_SIZE);} 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 { label IO - callback {btnDisable_p2p_io_widgets->value(1);} open - tooltip {Program to Program Communications} xywh {0 25 600 355} hide + callback {btnDisable_p2p_io_widgets->value(1);} open selected + tooltip {Program to Program Communications} xywh {0 25 600 355} code0 {btnDisable_p2p_io_widgets->value(1);} } { Fl_Group {} {open @@ -6996,11 +7002,12 @@ progdefaults.changed = true;} } { Fl_Check_Button btnDisable_p2p_io_widgets { label Lock user_data_type long - callback {progStatus.ip_lock = o->value(); + callback { progStatus.ip_lock = o->value(); if(o->value()) disable_config_p2p_io_widgets(); 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 code0 {o->value(progStatus.ip_lock);} } @@ -7056,7 +7063,7 @@ progdefaults.changed = true;} } Fl_Box {} { 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. KISS/ARQ/XML Addr/Port changes require program restart.} xywh {8 37 582 72} @@ -7123,7 +7130,7 @@ progdefaults.changed = true;} else progdefaults.enableBusyChannel = false; 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);} code1 {else o->value(false);} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} @@ -7146,7 +7153,7 @@ else progdefaults.kiss_dual_port_enabled = false; 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);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } @@ -7156,6 +7163,54 @@ progdefaults.changed = true;} xywh {505 193 82 25} hide 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 {} { label ARQ open @@ -7340,18 +7395,18 @@ progdefaults.changed = false;} xywh {20 388 130 22} } } -} +} Function {openConfig()} {return_type void } { code {if (!dlgConfig) createConfig(); progdefaults.loadDefaults();} {} -} +} Function {closeDialog()} {return_type void } { code {if (dlgConfig) dlgConfig->hide();} {} -} +} Function {createConfig()} {return_type void } { @@ -7359,10 +7414,10 @@ Function {createConfig()} {return_type void dlgConfig = ConfigureDialog(); dlgConfig->xclass(PACKAGE_NAME); }} {} -} +} decl {class Fl_File_Chooser ;} {public global -} +} Function {WefaxDestDirSet(Fl_File_Chooser *w, void *userdata)} {return_type void } { @@ -7372,7 +7427,7 @@ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnWefaxSaveDir->redraw(); cb_btnWefaxSaveDir( btnWefaxSaveDir, NULL ); }} {} -} +} Function {KmlDestDirSet(Fl_File_Chooser *w, void *userdata)} {open return_type void } { @@ -7382,9 +7437,9 @@ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnKmlSaveDir->redraw(); cb_btnKmlSaveDir( btnKmlSaveDir, NULL ); }} {} -} +} -Function {make_window()} {} {} +Function {make_window()} {} {} Function {make_window()} {open -} {} +} {} diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 66248a1f..8632104c 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -1418,6 +1418,8 @@ void update_scope() active_modem->refresh_scope(); } +extern bool valid_kiss_modem(std::string modem_name); + void init_modem(trx_mode mode, int freq) { ENSURE_THREAD(FLMAIN_TID); @@ -1441,10 +1443,26 @@ void init_modem(trx_mode mode, int freq) stopMacroTimer(); 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)) { + 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()); 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()); pwr_level->type(FL_HOR_NICE_SLIDER); pwr_level->range(0, 100.0); @@ -6027,7 +6045,7 @@ void create_fl_digi_main_primary() { opUsage = new Fl_Input2( opOutUsage->x() + opOutUsage->w() + pad, opOutUsage->y(), - opUsageFrame->w() - opOutUsage->w() - 50 - 3 * pad, + opUsageFrame->w() - opOutUsage->w() - 50 - 3 * pad, Hentry); opUsageEnter = new Fl_Button( @@ -6165,7 +6183,7 @@ void create_fl_digi_main_primary() { outSerNo1->type(FL_NORMAL_OUTPUT); inpSerNo1 = new Fl_Input2( - rightof(outSerNo1) + pad, y3, + rightof(outSerNo1) + pad, y3, 40, Hentry, "# R"); 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) { if (! (active_modem->get_mode() == MODE_ANALYSIS || diff --git a/src/include/confdialog.h b/src/include/confdialog.h index 34e217eb..1f16dcc4 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -392,6 +392,7 @@ extern Fl_ListBox *listbox_psk_status_timeout; extern Fl_Check_Button *btnEnablePSKbrowsing; extern Fl_Check_Button *btnPSKpilot; extern Fl_Counter2 *cnt_pilot_power; +extern Fl_Check_Button *btnPSK8Preamble; extern Fl_Group *tabRTTY; extern Fl_Tabs *tabsRTTY; extern Fl_ListBox *selShift; @@ -721,6 +722,10 @@ extern Fl_Check_Button *btnEnableBusyChannel; extern Fl_Input2 *txtKiss_ip_out_port_no; extern Fl_Check_Button *btnEnable_dual_port; 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_port_no; extern Fl_Button *btnDefault_arq_ip; diff --git a/src/include/configuration.h b/src/include/configuration.h index a0d011ca..321171db 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -1682,6 +1682,12 @@ ELEM_(bool, csma_enabled, "CSMA_ENABLED", \ "Use CSMA on heavy traffic channels (AX25)", \ 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", \ "IP Address of flrig server", \ DEFAULT_FLRIG_IP_ADDRESS) \ @@ -1891,9 +1897,12 @@ ELEM_(bool, us_units, "US_UNITS", \ "Use US units of distance for QRB", \ false) \ - ELEM_(int, MacroEditFontsize, "MACROEDITFONTSIZE", \ + ELEM_(int, MacroEditFontsize, "MACROEDITFONTSIZE", \ "RX text font size", \ - 16) + 16) \ + ELEM_(bool, psk8DCDShortFlag, "PSK8DCDSHORTFLAG", \ + "Flag: Change DCD pre-ample length", \ + false) // declare the struct diff --git a/src/include/data_io.h b/src/include/data_io.h index 6911fb7a..b1146e4f 100644 --- a/src/include/data_io.h +++ b/src/include/data_io.h @@ -27,6 +27,13 @@ #ifndef 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_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_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 // and 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 variable will have. 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 enable_config_p2p_io_widgets(void); extern void set_ip_to_default(int which_io); // KISS implementation -extern void kiss_init(void); -extern void kiss_close(void); +extern void kiss_init(bool connect_flag); +extern void kiss_close(bool override_flag); extern void kiss_reset(void); 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 void bcast_trxc_kiss_frame(void); 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 extern void arq_init(void); diff --git a/src/include/kiss_io.h b/src/include/kiss_io.h index 369308ed..2d47ef9d 100644 --- a/src/include/kiss_io.h +++ b/src/include/kiss_io.h @@ -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); 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 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(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); diff --git a/src/include/socket.h b/src/include/socket.h index ac1153ec..3ffc41b2 100644 --- a/src/include/socket.h +++ b/src/include/socket.h @@ -138,10 +138,12 @@ public: void listen(int backlog = SOMAXCONN); Socket accept(void); Socket accept1(void); + Socket * accept2(void); // Client void connect(const Address& addr); void connect(void); + bool connect1(void); // Data Transimission size_t send(const void* buf, size_t len); diff --git a/src/include/status.h b/src/include/status.h index f6308bd3..09f38729 100644 --- a/src/include/status.h +++ b/src/include/status.h @@ -164,9 +164,11 @@ struct status { int busyChannelSeconds; int kpsql_attenuation; bool csma_enabled; + bool kiss_tcp_io; + bool kiss_tcp_listen; bool ip_lock; double squelch_value; - + bool psk8DCDShortFlag; std::string browser_search; bool meters; diff --git a/src/include/timeops.h b/src/include/timeops.h index da7fb0e3..9611cac1 100644 --- a/src/include/timeops.h +++ b/src/include/timeops.h @@ -26,11 +26,10 @@ #include #ifdef __MINGW32__ # include -//#endif #else # if !HAVE_CLOCK_GETTIME -enum clockid_t { CLOCK_REALTIME, CLOCK_MONOTONIC }; -int clock_gettime(clockid_t clock_id, struct timespec* tp); + enum clockid_t { CLOCK_REALTIME, CLOCK_MONOTONIC }; + int clock_gettime(clockid_t clock_id, struct timespec* tp); # endif #endif diff --git a/src/main.cxx b/src/main.cxx index 2b8c2801..0000c323 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -348,7 +348,7 @@ void delayed_startup(void *) data_io_enabled = DISABLED_IO; arq_init(); - kiss_init(); + //kiss_init(); if (progdefaults.connect_to_maclogger) maclogger_init(); data_io_enabled = progStatus.data_io_enabled; @@ -771,7 +771,7 @@ void exit_process() { if (progdefaults.kml_enabled) KmlServer::Exit(); arq_close(); - kiss_close(); + kiss_close(false); maclogger_close(); XML_RPC_Server::stop(); diff --git a/src/misc/kiss_io.cxx b/src/misc/kiss_io.cxx index 5a02f852..774b80b4 100644 --- a/src/misc/kiss_io.cxx +++ b/src/misc/kiss_io.cxx @@ -95,10 +95,11 @@ static pthread_mutex_t external_mutex = PTHREAD_MUTEX_INITIALIZER; bool kiss_enabled = false; bool kiss_exit = false; bool kiss_rx_exit = false; +bool allow_kiss_socket_io = false; static bool smack_crc_enabled = false; 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 unsigned int transmit_buffer_flush_timeout = 0; @@ -147,6 +148,7 @@ static double kpsql_threshold = 0.0; extern int IMAGE_WIDTH; Socket *kiss_socket = 0; int data_io_enabled = DISABLED_IO; +int data_io_type = DATA_IO_UDP; //static bool host_responded = false; // Used to scale the sensitivity of KPSQL @@ -165,6 +167,7 @@ extern void abort_tx(); static std::vector availabe_kiss_modems; 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; @@ -422,28 +425,25 @@ static void set_slider2(Fl_Slider2 * sider, int value) sider->do_callback(); } - /********************************************************************************** * **********************************************************************************/ -/* -static void set_valuator(Fl_Valuator* valuator, double value) -{ - valuator->value(value); - valuator->do_callback(); -} -*/ -/********************************************************************************** - * - **********************************************************************************/ -static bool valid_kiss_modem(string _modem) +bool valid_kiss_modem(string _modem) { if(_modem.empty()) return false; int index = 0; 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 = ""; + index = 0; while(index < count) { cmp_str = uppercase_string(availabe_kiss_modems[index]); @@ -3360,25 +3360,49 @@ static void *ReadFromHostSocket(void *args) static char buffer[2048]; string str_buffer; size_t count = 0; - + Socket *tmp_socket = (Socket *)0; memset(buffer, 0, sizeof(buffer)); str_buffer.reserve(sizeof(buffer)); 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) { memset(buffer, 0, sizeof(buffer)); 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); + } } catch (...) { - if (errno) LOG_INFO("recvFrom Socket Error %d", errno); + if (errno) LOG_INFO("recv/recvFrom Socket Error %d", errno); 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 LOG_HEX(buffer, count); #endif @@ -3388,7 +3412,11 @@ static void *ReadFromHostSocket(void *args) } 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. "); return (void *)0; @@ -3415,7 +3443,12 @@ static void ReadFromHostSocket() } 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); + } } catch (...) { LOG_INFO("Kiss RX Loop Shutdown"); count = 0; @@ -3589,10 +3622,16 @@ void WriteToHostSocket(void) if(to_host.empty()) return; 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()); + } #ifdef EXTENED_DEBUG_INFO LOG_HEX(to_host.c_str(), to_host.size()); #endif + } to_host.clear(); } @@ -3721,6 +3760,55 @@ void WriteToHostBCastFramesBuffered(void) 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_autoclose(true); kiss_socket->set_nonblocking(false); + + if(progdefaults.kiss_tcp_listen) // Listen flag indcates server mode. 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()); + if(kiss_socket) { + kiss_socket->shut_down(); + kiss_socket->close(); + delete kiss_socket; + kiss_socket = 0; + kiss_enabled = 0; + } return false; } return true; } + /********************************************************************************** * **********************************************************************************/ @@ -3816,44 +3914,45 @@ void kiss_reset(void) /********************************************************************************** * **********************************************************************************/ -void kiss_init(void) +void kiss_init(bool connect_flag) { kiss_enabled = 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) + if(progStatus.data_io_enabled == KISS_IO) { if(!(active_modem->iface_io() & KISS_IO)) { set_default_kiss_modem(); } } - if(init_hist_flag) { memset(histogram, 0, sizeof(histogram)); init_hist_flag = false; } - if(!udp_init()) return; - - LOG_INFO("%s", "UDP Init - OK"); - srand(time(0)); // For CSMA persistance - 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) { LOG_ERROR("KISS kiss_thread: pthread_create failed"); return; } - #ifdef KISS_RX_THREAD if (pthread_create(&kiss_rx_socket_thread, NULL, ReadFromHostSocket, NULL) < 0) { LOG_ERROR("KISS kiss_rx_socket_thread: pthread_create failed"); @@ -3863,24 +3962,49 @@ void kiss_init(void) } #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; + 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; + allow_kiss_socket_io = false; - if(data_io_enabled == KISS_IO) + if(data_io_enabled == KISS_IO) { data_io_enabled = DISABLED_IO; + data_io_type = DATA_IO_NA; + } if(kiss_socket) { kiss_socket->shut_down(); kiss_socket->close(); + } else { + return; } #ifdef KISS_RX_THREAD @@ -3905,8 +4029,26 @@ void kiss_close(void) LOG_INFO("%s", "Kiss loop terminated. "); - + kiss_socket = 0; 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); + } } /********************************************************************************** diff --git a/src/misc/socket.cxx b/src/misc/socket.cxx index b9be9bac..dbc024ef 100644 --- a/src/misc/socket.cxx +++ b/src/misc/socket.cxx @@ -665,9 +665,11 @@ void Socket::bind(void) #else ; #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"); } +} /// /// Binds the socket to the address associated with the object @@ -801,6 +803,30 @@ Socket Socket::accept1(void) 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 @@ -813,6 +839,20 @@ void Socket::connect(void) if (::connect(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) 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. @@ -875,8 +915,14 @@ size_t Socket::send(const void* buf, size_t len) shutdown(sockfd, SHUT_WR); throw SocketException(errno, "send"); } else if (r == -1) { - if (errno != EAGAIN) + switch(errno) { + case EAGAIN: + case ENOTCONN: + case EBADF: + break; + default: throw SocketException(errno, "send"); + } r = 0; } } diff --git a/src/misc/status.cxx b/src/misc/status.cxx index 8641679e..93509619 100644 --- a/src/misc/status.cxx +++ b/src/misc/status.cxx @@ -199,8 +199,11 @@ status progStatus = { progdefaults.busyChannelSeconds, progdefaults.kpsql_attenuation, progdefaults.csma_enabled, + progdefaults.kiss_tcp_io, + progdefaults.kiss_tcp_listen, true, 0.0, + progdefaults.psk8DCDShortFlag, "CQ", // string browser_search; @@ -321,6 +324,9 @@ void status::saveLastState() busyChannelSeconds = progdefaults.busyChannelSeconds; kpsql_attenuation = progdefaults.kpsql_attenuation; csma_enabled = progdefaults.csma_enabled; + kiss_tcp_io = progdefaults.kiss_tcp_io; + kiss_tcp_listen = progdefaults.kiss_tcp_listen; + squelch_value = 0; 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("afc_enabled", afconoff); + spref.set("psk8DCDShortFlag", psk8DCDShortFlag); + spref.set("log_enabled", LOGenabled); spref.set("wf_carrier", carrier); @@ -479,6 +487,9 @@ if (!bWF_only) { spref.set("busyChannelSeconds", busyChannelSeconds); spref.set("kpsql_attenuation", kpsql_attenuation); 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("meters", meters); @@ -707,6 +718,10 @@ void status::loadLastState() spref.get("busyChannelSeconds", i, busyChannelSeconds); busyChannelSeconds = i; spref.get("kpsql_attenuation", i, kpsql_attenuation); kpsql_attenuation = 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)); spref.get("browser_search", strbuff, browser_search.c_str(), sizeof(strbuff) - 1); @@ -865,6 +880,8 @@ void status::initLastState() cntKPSQLAttenuation->value(kpsql_attenuation); progdefaults.kpsql_attenuation = kpsql_attenuation; + kiss_io_set_button_state(0); + if (bWF_only) fl_digi_main->resize(mainX, mainY, mainW, Hmenu + Hwfall + Hstatus); else { diff --git a/src/psk/psk.cxx b/src/psk/psk.cxx index 3e629a6a..fa9e4943 100644 --- a/src/psk/psk.cxx +++ b/src/psk/psk.cxx @@ -773,7 +773,7 @@ psk::psk(trx_mode pskmode) : modem() dec->setchunksize(4); dec2 = new viterbi(K13, K16_POLY1, K16_POLY2); dec2->setchunksize(4); - + } else if (_xpsk || _8psk || _16psk) { enc = new encoder(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); for (i = 0; i < 11; i++) if (abs(sfft_bins[i]) > 2.0*avg) break; if (i < 11) { -// std::cout << "bin: " << i +// std::cout << "bin: " << i // << ", freq offset: " << (i - 5)*samplerate/16384.0 -// << ", amp: " << abs(sfft_bins[i]) +// << ", amp: " << abs(sfft_bins[i]) // << ", avg: " << avg << "\n"; if (i != 5) { frequency -= 1.0*(i-5)*samplerate/sfft_size; @@ -1351,7 +1351,7 @@ void psk::rx_symbol(cmplx symbol, int car) if (!_disablefec) break; set_dcdON = 0; break; - + case 0x10410410: // xpsk DCD on (with FEC enabled) if (_pskr) break; if (_qpsk) break; @@ -1361,7 +1361,7 @@ void psk::rx_symbol(cmplx symbol, int car) if (_disablefec) break; set_dcdON = 1; break; - + case 0x00000000: // bpsk DCD off. x,8,16psk DCD on (with FEC disabled). if (_pskr) break; 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 lastphasequality = phasequality; int soft_qualityerror = static_cast(128 - (128 * phasequality)) ; - + if (soft_qualityerror > 255-25) // Prevent soft-bit wrap-around (crossing of value 128) softpuncture = true; 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 softpuncture = true; 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) { for(int i=0; i to clear bit accumulators on both Tx and Rx ends. } + int symbol; if (_16psk) symbol = 8; else if (_8psk) symbol = 4; 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 // Standard BPSK postamble // DCD off sequence (unmodulated carrier) @@ -2132,6 +2138,12 @@ int psk::tx_process() { 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 (_pskr || ((_xpsk || _8psk || _16psk) && !_disablefec) ) { if (startpreamble == true) { From 505c8b384b7198e1e7a0508480648747f6019597 Mon Sep 17 00:00:00 2001 From: Edouard Lafargue W6ELA Date: Wed, 13 Apr 2016 15:15:35 -0500 Subject: [PATCH 104/138] Portaudio Mono * Observed on OS X, fldigi cannot work on audio cards with mono output - it requests 2 channels from PortAudio no matter what and portaudio will complain if the audio output is only mono. - modified SoundPort::init_stream to make sure that if max_channels < 2 sd[1].params.channelCount is updated to max_channels --- src/soundcard/sound.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/soundcard/sound.cxx b/src/soundcard/sound.cxx index 609dcdbb..4c21e731 100644 --- a/src/soundcard/sound.cxx +++ b/src/soundcard/sound.cxx @@ -1602,6 +1602,8 @@ void SoundPort::init_stream(unsigned dir) else sd[1].params.suggestedLatency = (*sd[dir].idev)->defaultHighOutputLatency; sd[1].params.hostApiSpecificStreamInfo = NULL; + if (max_channels < 2) + sd[1].params.channelCount = max_channels; } const vector& rates = supported_rates[dir][(*sd[dir].idev)->name]; From 065ead7dea4389c4d2e34437dd3e575fdd84acf2 Mon Sep 17 00:00:00 2001 From: David Freese Date: Thu, 14 Apr 2016 07:11:22 -0500 Subject: [PATCH 105/138] Packet Prep * Modify confdialog.fl for later addition of Packet Modem tab --- src/dialogs/confdialog.cxx | 352 +++++++++++----------- src/dialogs/confdialog.fl | 595 +++++++++++++++++++------------------ src/include/confdialog.h | 2 + 3 files changed, 485 insertions(+), 464 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index 0843e819..07374b3a 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -3682,6 +3682,10 @@ static void cb_valTHOR_PATHS(Fl_Counter2* o, void*) { progdefaults.changed = true; } +Fl_Group *tabOther=(Fl_Group *)0; + +Fl_Tabs *tabsOther=(Fl_Tabs *)0; + Fl_Group *tabNavtex=(Fl_Group *)0; Fl_Check_Button *btnNvtxAdifLog=(Fl_Check_Button *)0; @@ -5947,11 +5951,10 @@ Fl_Double_Window* ConfigureDialog() { { tabsConfigure = new Fl_Tabs(0, 0, 600, 385); tabsConfigure->color(FL_LIGHT1); tabsConfigure->selection_color(FL_LIGHT1); - { tabOperator = new Fl_Group(0, 25, 600, 355, _("Operator")); + { tabOperator = new Fl_Group(0, 25, 600, 360, _("Operator")); tabOperator->tooltip(_("Operator information")); tabOperator->callback((Fl_Callback*)cb_tabOperator); tabOperator->when(FL_WHEN_CHANGED); - tabOperator->hide(); { Fl_Group* o = new Fl_Group(55, 35, 490, 170, _("Station")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -6091,7 +6094,7 @@ Fl_Double_Window* ConfigureDialog() { tabUI->hide(); { tabsUI = new Fl_Tabs(0, 25, 600, 360); tabsUI->selection_color(FL_LIGHT1); - { tabBrowser = new Fl_Group(0, 50, 600, 330, _("Browser")); + { tabBrowser = new Fl_Group(0, 50, 600, 335, _("Browser")); tabBrowser->tooltip(_("User Interface - Browser")); tabBrowser->hide(); { Fl_Group* o = new Fl_Group(30, 65, 540, 300); @@ -6233,7 +6236,7 @@ Fl_Double_Window* ConfigureDialog() { } // Fl_Group* o tabBrowser->end(); } // Fl_Group* tabBrowser - { tabContest = new Fl_Group(0, 50, 600, 330, _("Contest")); + { tabContest = new Fl_Group(0, 50, 600, 335, _("Contest")); tabContest->tooltip(_("User Interface - Contest")); tabContest->hide(); { Fl_Group* o = new Fl_Group(55, 70, 490, 80, _("Exchanges")); @@ -6387,7 +6390,7 @@ Fl_Double_Window* ConfigureDialog() { } // Fl_Group* o tabContest->end(); } // Fl_Group* tabContest - { tabUserInterface = new Fl_Group(0, 50, 600, 330, _("General")); + { tabUserInterface = new Fl_Group(0, 50, 600, 335, _("General")); tabUserInterface->tooltip(_("User Interface - General")); tabUserInterface->hide(); { Fl_Group* o = new Fl_Group(40, 77, 520, 76); @@ -6517,8 +6520,8 @@ Fl_Double_Window* ConfigureDialog() { { tabLogServer = new Fl_Group(0, 50, 600, 335, _("Log")); tabLogServer->tooltip(_("User Interface - Colors / Fonts")); tabLogServer->hide(); - { tabsLog = new Fl_Tabs(0, 55, 600, 330); - { Fl_Group* o = new Fl_Group(0, 80, 600, 300, _("QSO")); + { tabsLog = new Fl_Tabs(0, 55, 600, 335); + { Fl_Group* o = new Fl_Group(0, 75, 600, 315, _("QSO")); { Fl_Group* o = new Fl_Group(60, 112, 496, 198, _("QSO logging")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -6615,9 +6618,9 @@ Fl_Double_Window* ConfigureDialog() { } // Fl_Group* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 80, 600, 300, _("Rx Text")); + { Fl_Group* o = new Fl_Group(0, 75, 600, 315, _("Rx Text")); o->hide(); - { Fl_Group* o = new Fl_Group(62, 100, 496, 110, _("Rx Text")); + { Fl_Group* o = new Fl_Group(62, 96, 496, 113, _("Rx Text")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnRXClicks = new Fl_Check_Button(85, 155, 191, 20, _("Single-click to capture")); @@ -6659,53 +6662,53 @@ ab and newline are automatically included.")); } // Fl_Group* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 80, 600, 300, _("MacLogger")); + { Fl_Group* o = new Fl_Group(0, 75, 600, 315, _("MacLogger")); o->hide(); - { Fl_Check_Button* o = btnConnectToMaclogger = new Fl_Check_Button(10, 95, 186, 20, _("Connect to MacLogger")); + { Fl_Check_Button* o = btnConnectToMaclogger = new Fl_Check_Button(10, 91, 186, 20, _("Connect to MacLogger")); btnConnectToMaclogger->down_box(FL_DOWN_BOX); btnConnectToMaclogger->callback((Fl_Callback*)cb_btnConnectToMaclogger); o->value(progdefaults.connect_to_maclogger); } // Fl_Check_Button* btnConnectToMaclogger - { Fl_Check_Button* o = btn_capture_maclogger_radio = new Fl_Check_Button(205, 95, 186, 20, _("Capture Radio Report")); + { Fl_Check_Button* o = btn_capture_maclogger_radio = new Fl_Check_Button(205, 91, 186, 20, _("Capture Radio Report")); btn_capture_maclogger_radio->down_box(FL_DOWN_BOX); btn_capture_maclogger_radio->value(1); btn_capture_maclogger_radio->callback((Fl_Callback*)cb_btn_capture_maclogger_radio); o->value(progdefaults.capture_maclogger_radio); } // Fl_Check_Button* btn_capture_maclogger_radio - { Fl_Check_Button* o = btn_capture_maclogger_log = new Fl_Check_Button(205, 120, 186, 20, _("Capture Log Report")); + { Fl_Check_Button* o = btn_capture_maclogger_log = new Fl_Check_Button(205, 116, 186, 21, _("Capture Log Report")); btn_capture_maclogger_log->down_box(FL_DOWN_BOX); btn_capture_maclogger_log->callback((Fl_Callback*)cb_btn_capture_maclogger_log); o->value(progdefaults.capture_maclogger_log); } // Fl_Check_Button* btn_capture_maclogger_log - { Fl_Check_Button* o = btn_capture_maclogger_lookup = new Fl_Check_Button(405, 95, 186, 20, _("Capture Lookup ")); + { Fl_Check_Button* o = btn_capture_maclogger_lookup = new Fl_Check_Button(405, 91, 186, 20, _("Capture Lookup ")); btn_capture_maclogger_lookup->down_box(FL_DOWN_BOX); btn_capture_maclogger_lookup->callback((Fl_Callback*)cb_btn_capture_maclogger_lookup); o->value(progdefaults.capture_maclogger_lookup); } // Fl_Check_Button* btn_capture_maclogger_lookup - { Fl_Check_Button* o = btn_capture_maclogger_spot_tune = new Fl_Check_Button(405, 120, 186, 20, _("Capture Spot Tune")); + { Fl_Check_Button* o = btn_capture_maclogger_spot_tune = new Fl_Check_Button(405, 116, 186, 21, _("Capture Spot Tune")); btn_capture_maclogger_spot_tune->down_box(FL_DOWN_BOX); btn_capture_maclogger_spot_tune->callback((Fl_Callback*)cb_btn_capture_maclogger_spot_tune); o->value(progdefaults.capture_maclogger_spot_tune); } // Fl_Check_Button* btn_capture_maclogger_spot_tune - { Fl_Check_Button* o = btn_capture_maclogger_spot_report = new Fl_Check_Button(405, 147, 186, 20, _("Capture Spot Report")); + { Fl_Check_Button* o = btn_capture_maclogger_spot_report = new Fl_Check_Button(405, 144, 186, 21, _("Capture Spot Report")); btn_capture_maclogger_spot_report->down_box(FL_DOWN_BOX); btn_capture_maclogger_spot_report->callback((Fl_Callback*)cb_btn_capture_maclogger_spot_report); o->value(progdefaults.capture_maclogger_spot_report); } // Fl_Check_Button* btn_capture_maclogger_spot_report - { Fl_Check_Button* o = btn_enable_maclogger_log = new Fl_Check_Button(10, 175, 165, 25, _("Enable UDP log file")); + { Fl_Check_Button* o = btn_enable_maclogger_log = new Fl_Check_Button(10, 173, 165, 26, _("Enable UDP log file")); btn_enable_maclogger_log->down_box(FL_DOWN_BOX); btn_enable_maclogger_log->callback((Fl_Callback*)cb_btn_enable_maclogger_log); o->value(progdefaults.enable_maclogger_log); } // Fl_Check_Button* btn_enable_maclogger_log - { Fl_Text_Display* o = txt_UDP_data = new Fl_Text_Display(10, 220, 580, 156, _("UDP data stream")); + { Fl_Text_Display* o = txt_UDP_data = new Fl_Text_Display(10, 220, 580, 161, _("UDP data stream")); txt_UDP_data->align(Fl_Align(FL_ALIGN_TOP_LEFT)); Fl_Text_Buffer *txtbuffer = new Fl_Text_Buffer(); o->buffer(txtbuffer); } // Fl_Text_Display* txt_UDP_data - { Fl_Output* o = txt_maclogger_log_filename = new Fl_Output(178, 175, 272, 25); + { Fl_Output* o = txt_maclogger_log_filename = new Fl_Output(178, 173, 272, 26); o->value(progdefaults.maclogger_log_filename.c_str()); } // Fl_Output* txt_maclogger_log_filename - { Fl_Button* o = new Fl_Button(460, 175, 129, 25, _("Clear UDP text")); + { Fl_Button* o = new Fl_Button(460, 173, 129, 26, _("Clear UDP text")); o->callback((Fl_Callback*)cb_Clear); } // Fl_Button* o o->end(); @@ -6714,7 +6717,7 @@ ab and newline are automatically included.")); } // Fl_Tabs* tabsLog tabLogServer->end(); } // Fl_Group* tabLogServer - { tabMBars = new Fl_Group(0, 50, 600, 330, _("Macros")); + { tabMBars = new Fl_Group(0, 50, 600, 335, _("Macros")); tabMBars->tooltip(_("User Interface - Macros")); tabMBars->hide(); { Fl_Group* o = new Fl_Group(52, 263, 496, 35); @@ -6833,7 +6836,7 @@ ab and newline are automatically included.")); } // Fl_Group* o tabMBars->end(); } // Fl_Group* tabMBars - { tabWF_UI = new Fl_Group(0, 50, 600, 330, _("WF Ctrls")); + { tabWF_UI = new Fl_Group(0, 50, 600, 335, _("WF Ctrls")); tabWF_UI->tooltip(_("User Interface - Waterfall controls")); tabWF_UI->hide(); { Fl_Group* o = new Fl_Group(52, 83, 496, 253); @@ -6918,10 +6921,10 @@ ab and newline are automatically included.")); } // Fl_Group* o tabWF_UI->end(); } // Fl_Group* tabWF_UI - { tabColorsFonts = new Fl_Group(0, 50, 600, 330, _("Clrs/Fnts")); + { tabColorsFonts = new Fl_Group(0, 50, 600, 335, _("Clrs/Fnts")); tabColorsFonts->tooltip(_("User Interface - Colors / Fonts")); { tabsColors = new Fl_Tabs(0, 55, 600, 325); - { Fl_Group* o = new Fl_Group(0, 80, 600, 300, _("Rx/Tx")); + { Fl_Group* o = new Fl_Group(0, 80, 600, 305, _("Rx/Tx")); o->hide(); { Fl_ListBox* o = listbox_charset_status = new Fl_ListBox(96, 90, 165, 24, _("Rx/Tx Character set")); listbox_charset_status->tooltip(_("Select Rx/Tx Character Set")); @@ -7019,7 +7022,7 @@ ab and newline are automatically included.")); } // Fl_Check_Button* btn_show_all_codes o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 80, 600, 300, _("FreqDisp / Meters")); + { Fl_Group* o = new Fl_Group(0, 80, 600, 305, _("FreqDisp / Meters")); o->hide(); { Fl_Group* o = new Fl_Group(115, 108, 395, 87); o->box(FL_ENGRAVED_FRAME); @@ -7093,7 +7096,7 @@ ab and newline are automatically included.")); } // Fl_Group* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 80, 600, 300, _("Log")); + { Fl_Group* o = new Fl_Group(0, 80, 600, 305, _("Log")); o->hide(); { Fl_Group* o = new Fl_Group(114, 101, 372, 65, _("Logging Panel Controls")); o->box(FL_ENGRAVED_FRAME); @@ -7137,7 +7140,7 @@ ab and newline are automatically included.")); } // Fl_Group* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 80, 600, 300, _("F_keys")); + { Fl_Group* o = new Fl_Group(0, 80, 600, 305, _("F_keys")); o->hide(); { btnUseGroupColors = new Fl_Check_Button(135, 107, 165, 21, _("Use colored buttons")); btnUseGroupColors->down_box(FL_DOWN_BOX); @@ -7170,7 +7173,7 @@ ab and newline are automatically included.")); } // Fl_Button* btnMacroBtnFont o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 80, 600, 300, _("Tabs")); + { Fl_Group* o = new Fl_Group(0, 80, 600, 305, _("Tabs")); o->hide(); { btnTabColor = new Fl_Button(200, 113, 75, 21, _("Tab Color")); btnTabColor->callback((Fl_Callback*)cb_btnTabColor); @@ -7180,7 +7183,8 @@ ab and newline are automatically included.")); } // Fl_Button* btnTabDefaultColor o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 80, 600, 300, _("Buttons")); + { Fl_Group* o = new Fl_Group(0, 80, 600, 305, _("Buttons")); + o->hide(); { btnSpotColor = new Fl_Button(139, 121, 85, 21, _("Spot")); btnSpotColor->callback((Fl_Callback*)cb_btnSpotColor); } // Fl_Button* btnSpotColor @@ -7266,8 +7270,7 @@ ab and newline are automatically included.")); } // Fl_Box* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 80, 600, 300, _("SigLvl")); - o->hide(); + { Fl_Group* o = new Fl_Group(0, 80, 600, 305, _("SigLvl")); { btnLowSignal = new Fl_Button(210, 142, 70, 21, _("Low")); btnLowSignal->callback((Fl_Callback*)cb_btnLowSignal); } // Fl_Button* btnLowSignal @@ -7308,7 +7311,7 @@ ab and newline are automatically included.")); } // Fl_Tabs* tabsColors tabColorsFonts->end(); } // Fl_Group* tabColorsFonts - { tab_touch = new Fl_Group(0, 50, 600, 330, _("Touch")); + { tab_touch = new Fl_Group(0, 50, 600, 335, _("Touch")); tab_touch->hide(); { Fl_Box* o = new Fl_Box(15, 70, 570, 52, _("Note:\nThese configuration items are useful for but not unique to using fldig\ i on a\ntouch screen device such as a tablet.")); @@ -7347,12 +7350,13 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Tabs* tabsUI tabUI->end(); } // Fl_Group* tabUI - { tabWaterfall = new Fl_Group(0, 25, 600, 355, _("Waterfall")); + { tabWaterfall = new Fl_Group(0, 25, 600, 360, _("Waterfall")); tabWaterfall->hide(); - { tabsWaterfall = new Fl_Tabs(0, 25, 600, 355); + { tabsWaterfall = new Fl_Tabs(0, 25, 600, 360); tabsWaterfall->color(FL_LIGHT1); tabsWaterfall->selection_color(FL_LIGHT1); - { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Display")); + { Fl_Group* o = new Fl_Group(0, 50, 600, 335, _("Display")); + o->hide(); { Fl_Group* o = new Fl_Group(50, 63, 496, 190, _("Colors and cursors")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -7547,7 +7551,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("FFT Processing")); + { Fl_Group* o = new Fl_Group(0, 50, 600, 335, _("FFT Processing")); o->hide(); { Fl_Group* o = new Fl_Group(55, 71, 490, 135); o->box(FL_ENGRAVED_FRAME); @@ -7683,8 +7687,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Mouse")); - o->hide(); + { Fl_Group* o = new Fl_Group(0, 50, 600, 335, _("Mouse")); { Fl_Group* o = new Fl_Group(55, 73, 490, 170); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnWaterfallHistoryDefault = new Fl_Check_Button(65, 87, 340, 20, _("Left or right click always replays audio history")); @@ -7741,18 +7744,17 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Tabs* tabsWaterfall tabWaterfall->end(); } // Fl_Group* tabWaterfall - { tabModems = new Fl_Group(0, 25, 600, 355, _("Modems")); + { tabModems = new Fl_Group(0, 25, 600, 360, _("Modems")); tabModems->hide(); - { tabsModems = new Fl_Tabs(0, 25, 600, 355); + { tabsModems = new Fl_Tabs(0, 25, 600, 360); tabsModems->selection_color(FL_LIGHT1); tabsModems->align(Fl_Align(FL_ALIGN_TOP_RIGHT)); - { tabCW = new Fl_Group(0, 50, 600, 330, _("CW")); + { tabCW = new Fl_Group(0, 50, 600, 335, _("CW")); tabCW->hide(); - { tabsCW = new Fl_Tabs(0, 50, 600, 330); + { tabsCW = new Fl_Tabs(0, 50, 600, 335); 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, 310, _("General")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); - o->hide(); { Fl_Group* o = new Fl_Group(35, 85, 530, 130, _("Receive")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -7976,8 +7978,9 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Timing and QSK")); + { Fl_Group* o = new Fl_Group(0, 75, 600, 310, _("Timing and QSK")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); + o->hide(); { Fl_Group* o = new Fl_Group(5, 85, 585, 120, _("Timing")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -8164,7 +8167,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Prosigns")); + { Fl_Group* o = new Fl_Group(0, 75, 600, 310, _("Prosigns")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->hide(); { Fl_Group* o = new Fl_Group(35, 85, 530, 283); @@ -8334,7 +8337,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Tabs* tabsCW tabCW->end(); } // Fl_Group* tabCW - { tabDomEX = new Fl_Group(0, 50, 600, 330, _("Dom")); + { tabDomEX = new Fl_Group(0, 50, 600, 335, _("Dom")); tabDomEX->hide(); { Fl_Group* o = new Fl_Group(55, 60, 490, 180); o->box(FL_ENGRAVED_FRAME); @@ -8426,7 +8429,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o tabDomEX->end(); } // Fl_Group* tabDomEX - { tabFeld = new Fl_Group(0, 50, 600, 330, _("Feld")); + { tabFeld = new Fl_Group(0, 50, 600, 335, _("Feld")); tabFeld->hide(); { Fl_Group* o = new Fl_Group(55, 72, 490, 145); o->box(FL_ENGRAVED_FRAME); @@ -8531,7 +8534,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o tabFeld->end(); } // Fl_Group* tabFeld - { tabFSQ = new Fl_Group(0, 50, 600, 330, _("FSQ")); + { tabFSQ = new Fl_Group(0, 50, 600, 335, _("FSQ")); tabFSQ->hide(); { Fl_Group* o = new Fl_Group(5, 60, 585, 69, _("Rx Parameters")); o->box(FL_ENGRAVED_BOX); @@ -8705,7 +8708,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o tabFSQ->end(); } // Fl_Group* tabFSQ - { tabIFKP = new Fl_Group(0, 50, 600, 330, _("IFKP")); + { tabIFKP = new Fl_Group(0, 50, 600, 335, _("IFKP")); tabIFKP->hide(); { Fl_Group* o = new Fl_Group(5, 65, 587, 120, _("Tx Parameters")); o->box(FL_ENGRAVED_BOX); @@ -8775,7 +8778,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o tabIFKP->end(); } // Fl_Group* tabIFKP - { tabMT63 = new Fl_Group(0, 50, 600, 330, _("MT-63")); + { tabMT63 = new Fl_Group(0, 50, 600, 335, _("MT-63")); tabMT63->hide(); { Fl_Group* o = new Fl_Group(55, 73, 490, 84); o->box(FL_ENGRAVED_FRAME); @@ -8834,7 +8837,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o tabMT63->end(); } // Fl_Group* tabMT63 - { tabOlivia = new Fl_Group(0, 50, 600, 330, _("Oliv")); + { tabOlivia = new Fl_Group(0, 50, 600, 335, _("Oliv")); tabOlivia->hide(); { Fl_Group* o = new Fl_Group(55, 76, 490, 280); o->box(FL_ENGRAVED_FRAME); @@ -8939,7 +8942,7 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o tabOlivia->end(); } // Fl_Group* tabOlivia - { tabContestia = new Fl_Group(0, 50, 600, 330, _("Cont")); + { tabContestia = new Fl_Group(0, 50, 600, 335, _("Cont")); tabContestia->hide(); { Fl_Group* o = new Fl_Group(55, 80, 490, 235); o->box(FL_ENGRAVED_FRAME); @@ -9036,10 +9039,11 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Group* o tabContestia->end(); } // Fl_Group* tabContestia - { tabPSK = new Fl_Group(0, 50, 600, 330, _("PSK")); - { tabsPSK = new Fl_Tabs(0, 50, 600, 330); + { tabPSK = new Fl_Group(0, 50, 600, 335, _("PSK")); + tabPSK->hide(); + { tabsPSK = new Fl_Tabs(0, 50, 600, 335); tabsPSK->selection_color(FL_LIGHT1); - { grpPSK = new Fl_Group(0, 75, 600, 305, _("General")); + { grpPSK = new Fl_Group(0, 75, 600, 310, _("General")); grpPSK->align(Fl_Align(FL_ALIGN_TOP_LEFT)); { Fl_Group* o = new Fl_Group(55, 87, 490, 86, _("AFC behavior")); o->box(FL_ENGRAVED_FRAME); @@ -9183,12 +9187,13 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Tabs* tabsPSK tabPSK->end(); } // Fl_Group* tabPSK - { tabRTTY = new Fl_Group(0, 50, 600, 330, _("TTY")); + { tabRTTY = new Fl_Group(0, 50, 600, 335, _("TTY")); tabRTTY->hide(); - { tabsRTTY = new Fl_Tabs(0, 50, 600, 330); + { tabsRTTY = new Fl_Tabs(0, 50, 600, 335); tabsRTTY->selection_color(FL_LIGHT1); - { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Tx")); + { Fl_Group* o = new Fl_Group(0, 75, 600, 310, _("Tx")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); + o->hide(); { Fl_ListBox* o = selShift = new Fl_ListBox(65, 104, 100, 20, _("Carrier shift")); selShift->tooltip(_("Select carrier shift")); selShift->box(FL_DOWN_BOX); @@ -9342,9 +9347,8 @@ i on a\ntouch screen device such as a tablet.")); } // Fl_Check_Button* chkPseudoFSK o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Rx")); + { Fl_Group* o = new Fl_Group(0, 75, 600, 310, _("Rx")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); - o->hide(); { Fl_Group* o = new Fl_Group(32, 101, 535, 69, _("Receive")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -9443,7 +9447,7 @@ ency")); } // Fl_Group* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 75, 600, 305, _("Synop")); + { Fl_Group* o = new Fl_Group(0, 75, 600, 310, _("Synop")); o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->hide(); { Fl_Check_Button* o = btnSynopAdifDecoding = new Fl_Check_Button(190, 91, 126, 22, _("SYNOP to ADIF")); @@ -9474,7 +9478,7 @@ le Earth)")); } // Fl_Tabs* tabsRTTY tabRTTY->end(); } // Fl_Group* tabRTTY - { tabTHOR = new Fl_Group(0, 50, 600, 330, _("Thor")); + { tabTHOR = new Fl_Group(0, 50, 600, 335, _("Thor")); tabTHOR->hide(); { Fl_Group* o = new Fl_Group(55, 78, 490, 270); o->box(FL_ENGRAVED_FRAME); @@ -9579,37 +9583,39 @@ le Earth)")); } // Fl_Group* o tabTHOR->end(); } // Fl_Group* tabTHOR - { tabNavtex = new Fl_Group(0, 50, 600, 330, _("Nav")); - tabNavtex->hide(); - { Fl_Check_Button* o = btnNvtxAdifLog = new Fl_Check_Button(171, 79, 235, 30, _("Log Navtex messages to Adif file")); - btnNvtxAdifLog->down_box(FL_DOWN_BOX); - btnNvtxAdifLog->callback((Fl_Callback*)cb_btnNvtxAdifLog); - o->value(progdefaults.NVTX_AdifLog); - } // Fl_Check_Button* btnNvtxAdifLog - { Fl_Check_Button* o = btnNvtxKmlLog = new Fl_Check_Button(170, 125, 270, 30, _("Log Navtex messages to KML")); - btnNvtxKmlLog->tooltip(_("Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)")); - btnNvtxKmlLog->down_box(FL_DOWN_BOX); - btnNvtxKmlLog->callback((Fl_Callback*)cb_btnNvtxKmlLog); - o->value(progdefaults.NVTX_KmlLog); - } // Fl_Check_Button* btnNvtxKmlLog - tabNavtex->end(); - } // Fl_Group* tabNavtex - { tabWefax = new Fl_Group(0, 50, 600, 330, _("WFx")); - tabWefax->hide(); - { Fl_Group* o = new Fl_Group(2, 63, 598, 300); - { Fl_Check_Button* o = btnWefaxAdifLog = new Fl_Check_Button(94, 137, 235, 30, _("Log Wefax messages to Adif file")); + { tabOther = new Fl_Group(0, 50, 600, 335, _("Other")); + { tabsOther = new Fl_Tabs(0, 50, 600, 335); + { tabNavtex = new Fl_Group(0, 75, 600, 310, _("Nav")); + tabNavtex->hide(); + { Fl_Check_Button* o = btnNvtxAdifLog = new Fl_Check_Button(181, 109, 235, 30, _("Log Navtex messages to Adif file")); + btnNvtxAdifLog->down_box(FL_DOWN_BOX); + btnNvtxAdifLog->callback((Fl_Callback*)cb_btnNvtxAdifLog); + o->value(progdefaults.NVTX_AdifLog); + } // Fl_Check_Button* btnNvtxAdifLog + { Fl_Check_Button* o = btnNvtxKmlLog = new Fl_Check_Button(180, 155, 270, 30, _("Log Navtex messages to KML")); + btnNvtxKmlLog->tooltip(_("Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)")); + btnNvtxKmlLog->down_box(FL_DOWN_BOX); + btnNvtxKmlLog->callback((Fl_Callback*)cb_btnNvtxKmlLog); + o->value(progdefaults.NVTX_KmlLog); + } // Fl_Check_Button* btnNvtxKmlLog + tabNavtex->end(); + } // Fl_Group* tabNavtex + { tabWefax = new Fl_Group(0, 75, 600, 310, _("WFx")); + tabWefax->hide(); + { Fl_Group* o = new Fl_Group(2, 79, 598, 285); + { Fl_Check_Button* o = btnWefaxAdifLog = new Fl_Check_Button(99, 155, 235, 30, _("Log Wefax messages to Adif file")); btnWefaxAdifLog->tooltip(_("Sent and received faxes are logged to Adif file.")); btnWefaxAdifLog->down_box(FL_DOWN_BOX); btnWefaxAdifLog->callback((Fl_Callback*)cb_btnWefaxAdifLog); o->value(progdefaults.WEFAX_AdifLog); - } // Fl_Check_Button* btnWefaxAdifLog - { Fl_Check_Button* o = btnWefaxEmbeddedGui = new Fl_Check_Button(94, 74, 235, 30, _("Embedded Wefax Gui")); + } // Fl_Check_Button* btnWefaxAdifLog + { Fl_Check_Button* o = btnWefaxEmbeddedGui = new Fl_Check_Button(99, 92, 235, 30, _("Embedded Wefax Gui")); btnWefaxEmbeddedGui->tooltip(_("Display tx and rx in main fldigi window.\nChange requires restart of fldigi")); btnWefaxEmbeddedGui->down_box(FL_DOWN_BOX); btnWefaxEmbeddedGui->callback((Fl_Callback*)cb_btnWefaxEmbeddedGui); o->value(progdefaults.WEFAX_EmbeddedGui); - } // Fl_Check_Button* btnWefaxEmbeddedGui - { Fl_Value_Input2* o = btnWefaxShift = new Fl_Value_Input2(94, 177, 80, 20, _("Frequency shift (800 Hz)")); + } // Fl_Check_Button* btnWefaxEmbeddedGui + { Fl_Value_Input2* o = btnWefaxShift = new Fl_Value_Input2(99, 195, 80, 20, _("Frequency shift (800 Hz)")); btnWefaxShift->tooltip(_("Default 800 Hz. Deutsche Wetterdienst 850Hz")); btnWefaxShift->type(2); btnWefaxShift->box(FL_DOWN_BOX); @@ -9623,8 +9629,8 @@ le Earth)")); btnWefaxShift->align(Fl_Align(FL_ALIGN_RIGHT)); btnWefaxShift->when(FL_WHEN_RELEASE); o->value(progdefaults.WEFAX_Shift); - } // Fl_Value_Input2* btnWefaxShift - { Fl_Value_Input2* o = btnWefaxMaxRows = new Fl_Value_Input2(94, 217, 85, 20, _("Received fax maximum rows number (5000)")); + } // Fl_Value_Input2* btnWefaxShift + { Fl_Value_Input2* o = btnWefaxMaxRows = new Fl_Value_Input2(99, 235, 85, 20, _("Received fax maximum rows number (5000)")); btnWefaxMaxRows->tooltip(_("Maximum row number for a received fax image.")); btnWefaxMaxRows->type(2); btnWefaxMaxRows->box(FL_DOWN_BOX); @@ -9638,69 +9644,73 @@ le Earth)")); btnWefaxMaxRows->align(Fl_Align(FL_ALIGN_RIGHT)); btnWefaxMaxRows->when(FL_WHEN_RELEASE); o->value(progdefaults.WEFAX_MaxRows); - } // Fl_Value_Input2* btnWefaxMaxRows - { Fl_Input* o = btnWefaxSaveDir = new Fl_Input(94, 267, 310, 20, _("Fax images destination directory")); + } // Fl_Value_Input2* btnWefaxMaxRows + { Fl_Input* o = btnWefaxSaveDir = new Fl_Input(99, 285, 310, 20, _("Fax images destination directory")); btnWefaxSaveDir->callback((Fl_Callback*)cb_btnWefaxSaveDir); btnWefaxSaveDir->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.wefax_save_dir.c_str()); - } // Fl_Input* btnWefaxSaveDir - { btnSelectFaxDestDir = new Fl_Button(424, 267, 80, 20, _("Directory...")); + } // Fl_Input* btnWefaxSaveDir + { btnSelectFaxDestDir = new Fl_Button(429, 285, 80, 20, _("Directory...")); btnSelectFaxDestDir->callback((Fl_Callback*)cb_btnSelectFaxDestDir); - } // Fl_Button* btnSelectFaxDestDir - { Fl_Check_Button* o = btnWefaxHideTx = new Fl_Check_Button(94, 107, 235, 30, _("Hide Transmission window")); + } // Fl_Button* btnSelectFaxDestDir + { Fl_Check_Button* o = btnWefaxHideTx = new Fl_Check_Button(99, 125, 235, 30, _("Hide Transmission window")); btnWefaxHideTx->tooltip(_("Hide transmission window by default.")); btnWefaxHideTx->down_box(FL_DOWN_BOX); btnWefaxHideTx->callback((Fl_Callback*)cb_btnWefaxHideTx); o->value(progdefaults.WEFAX_HideTx); - } // Fl_Check_Button* btnWefaxHideTx - { Fl_Check_Button* o = btnWefaxSaveMonochrome = new Fl_Check_Button(94, 297, 235, 30, _("Save image as monochrome file")); + } // Fl_Check_Button* btnWefaxHideTx + { Fl_Check_Button* o = btnWefaxSaveMonochrome = new Fl_Check_Button(99, 315, 235, 30, _("Save image as monochrome file")); btnWefaxSaveMonochrome->tooltip(_("Save the fax image as a gray-level PNG file.")); btnWefaxSaveMonochrome->down_box(FL_DOWN_BOX); btnWefaxSaveMonochrome->callback((Fl_Callback*)cb_btnWefaxSaveMonochrome); o->value(progdefaults.WEFAX_SaveMonochrome); - } // Fl_Check_Button* btnWefaxSaveMonochrome - o->end(); - } // Fl_Group* o - tabWefax->end(); - } // Fl_Group* tabWefax - { tabDFTscan = new Fl_Group(0, 50, 600, 330, _("Scan")); - tabDFTscan->hide(); - { Fl_Counter* o = cnt_dft_scans = new Fl_Counter(235, 129, 132, 21, _("# scans")); - cnt_dft_scans->minimum(10); - cnt_dft_scans->maximum(1000); - cnt_dft_scans->step(10); - cnt_dft_scans->value(60); - cnt_dft_scans->callback((Fl_Callback*)cb_cnt_dft_scans); - o->value(progdefaults.cnt_dft_scans); - o->lstep(100.0); - } // Fl_Counter* cnt_dft_scans - { Fl_Counter* o = cnt_dft_range = new Fl_Counter(251, 194, 100, 21, _("dB Range")); - cnt_dft_range->type(1); - cnt_dft_range->minimum(20); - cnt_dft_range->maximum(120); - cnt_dft_range->step(10); - cnt_dft_range->value(60); - cnt_dft_range->callback((Fl_Callback*)cb_cnt_dft_range); - o->value(progdefaults.cnt_dft_range); - } // Fl_Counter* cnt_dft_range - { Fl_Check_Button* o = btn_use_relative_dB = new Fl_Check_Button(275, 265, 70, 15, _("Use relative dB")); - btn_use_relative_dB->down_box(FL_DOWN_BOX); - btn_use_relative_dB->callback((Fl_Callback*)cb_btn_use_relative_dB); - o->value(progdefaults.dft_relative); - } // Fl_Check_Button* btn_use_relative_dB - tabDFTscan->end(); - } // Fl_Group* tabDFTscan + } // Fl_Check_Button* btnWefaxSaveMonochrome + o->end(); + } // Fl_Group* o + tabWefax->end(); + } // Fl_Group* tabWefax + { tabDFTscan = new Fl_Group(0, 75, 600, 310, _("Scan")); + { Fl_Counter* o = cnt_dft_scans = new Fl_Counter(235, 154, 132, 21, _("# scans")); + cnt_dft_scans->minimum(10); + cnt_dft_scans->maximum(1000); + cnt_dft_scans->step(10); + cnt_dft_scans->value(60); + cnt_dft_scans->callback((Fl_Callback*)cb_cnt_dft_scans); + o->value(progdefaults.cnt_dft_scans); + o->lstep(100.0); + } // Fl_Counter* cnt_dft_scans + { Fl_Counter* o = cnt_dft_range = new Fl_Counter(251, 219, 100, 21, _("dB Range")); + cnt_dft_range->type(1); + cnt_dft_range->minimum(20); + cnt_dft_range->maximum(120); + cnt_dft_range->step(10); + cnt_dft_range->value(60); + cnt_dft_range->callback((Fl_Callback*)cb_cnt_dft_range); + o->value(progdefaults.cnt_dft_range); + } // Fl_Counter* cnt_dft_range + { Fl_Check_Button* o = btn_use_relative_dB = new Fl_Check_Button(275, 290, 70, 15, _("Use relative dB")); + btn_use_relative_dB->down_box(FL_DOWN_BOX); + btn_use_relative_dB->callback((Fl_Callback*)cb_btn_use_relative_dB); + o->value(progdefaults.dft_relative); + } // Fl_Check_Button* btn_use_relative_dB + tabDFTscan->end(); + } // Fl_Group* tabDFTscan + tabsOther->end(); + } // Fl_Tabs* tabsOther + tabOther->end(); + } // Fl_Group* tabOther tabsModems->end(); } // Fl_Tabs* tabsModems tabModems->end(); } // Fl_Group* tabModems - { tabRig = new Fl_Group(0, 23, 600, 357, _("Rig")); + { tabRig = new Fl_Group(0, 25, 600, 360, _("Rig")); tabRig->tooltip(_("Transceiver control")); tabRig->hide(); - { tabsRig = new Fl_Tabs(0, 23, 600, 357); + { tabsRig = new Fl_Tabs(0, 25, 600, 360); tabsRig->selection_color(FL_LIGHT1); - { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("RigCAT")); + { Fl_Group* o = new Fl_Group(0, 50, 600, 335, _("RigCAT")); o->tooltip(_("Rig Control using xml spec file")); + o->hide(); { chkUSERIGCAT = new Fl_Check_Button(245, 60, 110, 20, _("Use RigCAT")); chkUSERIGCAT->tooltip(_("RigCAT used for rig control")); chkUSERIGCAT->down_box(FL_DOWN_BOX); @@ -9905,7 +9915,7 @@ le Earth)")); } // Fl_Group* grpRigCAT o->end(); } // Fl_Group* o - { tabHamlib = new Fl_Group(0, 50, 600, 330, _("Hamlib")); + { tabHamlib = new Fl_Group(0, 50, 600, 335, _("Hamlib")); tabHamlib->hide(); { chkUSEHAMLIB = new Fl_Check_Button(250, 59, 100, 20, _("Use Hamlib")); chkUSEHAMLIB->tooltip(_("Hamlib used for rig control")); @@ -10177,7 +10187,7 @@ le Earth)")); } // Fl_Group* grpHamlib tabHamlib->end(); } // Fl_Group* tabHamlib - { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Hardware PTT")); + { Fl_Group* o = new Fl_Group(0, 50, 600, 335, _("Hardware PTT")); o->hide(); { Fl_Group* o = new Fl_Group(55, 57, 490, 38); o->box(FL_ENGRAVED_FRAME); @@ -10297,7 +10307,7 @@ le Earth)")); } // Fl_Group* grpPTTdelays o->end(); } // Fl_Group* o - { tabXMLRPC = new Fl_Group(0, 50, 600, 330, _("XML-RPC")); + { tabXMLRPC = new Fl_Group(0, 50, 600, 335, _("XML-RPC")); tabXMLRPC->hide(); { grpXMLRPC = new Fl_Group(55, 61, 490, 160); grpXMLRPC->box(FL_ENGRAVED_FRAME); @@ -10336,8 +10346,7 @@ definition")); } // Fl_Group* o tabXMLRPC->end(); } // Fl_Group* tabXMLRPC - { tabFLRIG = new Fl_Group(0, 50, 600, 330, _("flrig")); - tabFLRIG->hide(); + { tabFLRIG = new Fl_Group(0, 50, 600, 335, _("flrig")); { Fl_Output* o = new Fl_Output(75, 77, 465, 58); o->tooltip(_("\" \"")); o->type(12); @@ -10358,12 +10367,12 @@ definition")); } // Fl_Tabs* tabsRig tabRig->end(); } // Fl_Group* tabRig - { tabSoundCard = new Fl_Group(0, 25, 600, 355, _("Audio")); + { tabSoundCard = new Fl_Group(0, 25, 600, 360, _("Audio")); tabSoundCard->tooltip(_("Audio devices")); tabSoundCard->hide(); - { tabsSoundCard = new Fl_Tabs(0, 25, 600, 355); + { tabsSoundCard = new Fl_Tabs(0, 25, 600, 360); tabsSoundCard->selection_color(FL_LIGHT1); - { tabAudio = new Fl_Group(0, 50, 600, 330, _("Devices")); + { tabAudio = new Fl_Group(0, 50, 600, 335, _("Devices")); { AudioOSS = new Fl_Group(55, 65, 490, 45); AudioOSS->box(FL_ENGRAVED_FRAME); { btnAudioIO[0] = new Fl_Round_Button(65, 75, 53, 25, _("OSS")); @@ -10436,7 +10445,7 @@ definition")); } // Fl_Group* AudioNull tabAudio->end(); } // Fl_Group* tabAudio - { tabAudioOpt = new Fl_Group(0, 50, 600, 330, _("Settings")); + { tabAudioOpt = new Fl_Group(0, 50, 600, 335, _("Settings")); tabAudioOpt->hide(); { grpAudioSampleRate = new Fl_Group(55, 65, 490, 90, _("Sample rate")); grpAudioSampleRate->box(FL_ENGRAVED_FRAME); @@ -10549,7 +10558,7 @@ ll with your audio device.")); } // Fl_Group* o tabAudioOpt->end(); } // Fl_Group* tabAudioOpt - { tabAudioRightChannel = new Fl_Group(0, 50, 600, 330, _("Right channel")); + { tabAudioRightChannel = new Fl_Group(0, 50, 600, 335, _("Right channel")); tabAudioRightChannel->hide(); { Fl_Group* o = new Fl_Group(25, 61, 550, 246, _("Transmit Usage")); o->box(FL_ENGRAVED_FRAME); @@ -10606,7 +10615,7 @@ nce.\nYou may change the state from either location.\n...")); } // Fl_Group* o tabAudioRightChannel->end(); } // Fl_Group* tabAudioRightChannel - { tabWavFile = new Fl_Group(0, 50, 600, 330, _("Wav")); + { tabWavFile = new Fl_Group(0, 50, 600, 335, _("Wav")); tabWavFile->hide(); { Fl_ListBox* o = listbox_wav_samplerate = new Fl_ListBox(225, 96, 150, 24, _("Wav write sample rate")); listbox_wav_samplerate->tooltip(_("Pick baud rate from list")); @@ -10631,10 +10640,11 @@ nce.\nYou may change the state from either location.\n...")); } // Fl_Tabs* tabsSoundCard tabSoundCard->end(); } // Fl_Group* tabSoundCard - { tabID = new Fl_Group(0, 23, 600, 357, _("ID")); + { tabID = new Fl_Group(0, 25, 600, 360, _("ID")); tabID->hide(); - { tabsID = new Fl_Tabs(0, 23, 600, 357); - { tabRsID = new Fl_Group(0, 50, 600, 330, _("RsID")); + { tabsID = new Fl_Tabs(0, 25, 600, 360); + { tabRsID = new Fl_Group(0, 50, 600, 335, _("RsID")); + tabRsID->hide(); { Fl_Group* o = new Fl_Group(32, 55, 535, 210, _("Reed-Solomon ID (Rx)")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -10758,7 +10768,7 @@ gured on the\n\"Notifications\" configure dialog.")); } // Fl_Group* o tabRsID->end(); } // Fl_Group* tabRsID - { tabVideoID = new Fl_Group(0, 50, 600, 330, _("Video")); + { tabVideoID = new Fl_Group(0, 50, 600, 335, _("Video")); tabVideoID->hide(); { Fl_Group* o = new Fl_Group(32, 115, 536, 189, _("Video Preamble ID")); o->box(FL_ENGRAVED_FRAME); @@ -10834,8 +10844,7 @@ gured on the\n\"Notifications\" configure dialog.")); } // Fl_Group* o tabVideoID->end(); } // Fl_Group* tabVideoID - { tabCwID = new Fl_Group(0, 50, 600, 330, _("CW")); - tabCwID->hide(); + { tabCwID = new Fl_Group(0, 50, 600, 335, _("CW")); { sld = new Fl_Group(32, 146, 536, 127, _("CW Postamble ID")); sld->box(FL_ENGRAVED_FRAME); sld->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -10877,11 +10886,12 @@ gured on the\n\"Notifications\" configure dialog.")); } // Fl_Tabs* tabsID tabID->end(); } // Fl_Group* tabID - { tabMisc = new Fl_Group(0, 25, 600, 355, _("Misc")); + { tabMisc = new Fl_Group(0, 25, 600, 360, _("Misc")); tabMisc->hide(); - { tabsMisc = new Fl_Tabs(0, 25, 600, 355); + { tabsMisc = new Fl_Tabs(0, 25, 600, 360); tabsMisc->selection_color(FL_LIGHT1); - { tabCPUspeed = new Fl_Group(0, 50, 600, 330, _("CPU")); + { tabCPUspeed = new Fl_Group(0, 50, 600, 335, _("CPU")); + tabCPUspeed->hide(); { Fl_Group* o = new Fl_Group(55, 75, 490, 51); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -10895,7 +10905,7 @@ gured on the\n\"Notifications\" configure dialog.")); } // Fl_Group* o tabCPUspeed->end(); } // Fl_Group* tabCPUspeed - { tabNBEMS = new Fl_Group(0, 50, 600, 330, _("NBEMS")); + { tabNBEMS = new Fl_Group(0, 50, 600, 335, _("NBEMS")); tabNBEMS->hide(); { Fl_Group* o = new Fl_Group(50, 65, 500, 75, _("NBEMS data file interface")); o->box(FL_ENGRAVED_FRAME); @@ -10965,7 +10975,7 @@ gured on the\n\"Notifications\" configure dialog.")); } // Fl_Group* o tabNBEMS->end(); } // Fl_Group* tabNBEMS - { tabPskmail = new Fl_Group(0, 50, 600, 330, _("Pskmail")); + { tabPskmail = new Fl_Group(0, 50, 600, 335, _("Pskmail")); tabPskmail->align(Fl_Align(FL_ALIGN_TOP_LEFT)); tabPskmail->hide(); { Fl_Group* o = new Fl_Group(55, 58, 490, 174, _("Mail Server Attributes")); @@ -11072,7 +11082,7 @@ gured on the\n\"Notifications\" configure dialog.")); } // Fl_Group* o tabPskmail->end(); } // Fl_Group* tabPskmail - { tabSpot = new Fl_Group(0, 50, 600, 330, _("Spotting")); + { tabSpot = new Fl_Group(0, 50, 600, 335, _("Spotting")); tabSpot->hide(); { Fl_Group* o = new Fl_Group(55, 72, 490, 254, _("PSK Reporter")); o->box(FL_ENGRAVED_FRAME); @@ -11144,7 +11154,7 @@ gured on the\n\"Notifications\" configure dialog.")); } // Fl_Group* o tabSpot->end(); } // Fl_Group* tabSpot - { tabSweetSpot = new Fl_Group(0, 50, 600, 330, _("Sweet Spot")); + { tabSweetSpot = new Fl_Group(0, 50, 600, 335, _("Sweet Spot")); tabSweetSpot->hide(); { Fl_Group* o = new Fl_Group(55, 71, 490, 75); o->box(FL_ENGRAVED_FRAME); @@ -11229,7 +11239,7 @@ gured on the\n\"Notifications\" configure dialog.")); } // Fl_Group* o tabSweetSpot->end(); } // Fl_Group* tabSweetSpot - { tabText_IO = new Fl_Group(0, 50, 600, 330, _("Text i/o")); + { tabText_IO = new Fl_Group(0, 50, 600, 335, _("Text i/o")); tabText_IO->hide(); { grpTalker = new Fl_Group(55, 132, 490, 73, _("Talker Socket (MS only)")); grpTalker->box(FL_ENGRAVED_FRAME); @@ -11261,7 +11271,7 @@ gured on the\n\"Notifications\" configure dialog.")); } // Fl_Group* o tabText_IO->end(); } // Fl_Group* tabText_IO - { tabDTMF = new Fl_Group(0, 50, 600, 330, _("DTMF")); + { tabDTMF = new Fl_Group(0, 50, 600, 335, _("DTMF")); tabDTMF->hide(); { Fl_Check_Button* o = chkDTMFdecode = new Fl_Check_Button(212, 103, 175, 20, _("Decode DTMF tones")); chkDTMFdecode->tooltip(_("Decode received DTMF tones")); @@ -11271,7 +11281,7 @@ gured on the\n\"Notifications\" configure dialog.")); } // Fl_Check_Button* chkDTMFdecode tabDTMF->end(); } // Fl_Group* tabDTMF - { tabWX = new Fl_Group(0, 50, 600, 330, _("WX")); + { tabWX = new Fl_Group(0, 50, 600, 335, _("WX")); tabWX->hide(); { Fl_Group* o = new Fl_Group(55, 60, 490, 300, _("Weather query specification")); o->box(FL_ENGRAVED_FRAME); @@ -11359,8 +11369,7 @@ earch for station name")); } // Fl_Group* o tabWX->end(); } // Fl_Group* tabWX - { tabKML = new Fl_Group(0, 50, 600, 330, _("KML")); - tabKML->hide(); + { tabKML = new Fl_Group(0, 50, 600, 335, _("KML")); { Fl_Input* o = btnKmlSaveDir = new Fl_Input(26, 75, 390, 24, _("KML files directory")); btnKmlSaveDir->tooltip(_("Where generated KML documents are stored.")); btnKmlSaveDir->callback((Fl_Callback*)cb_btnKmlSaveDir); @@ -11466,11 +11475,12 @@ and restarted if needed.")); } // Fl_Tabs* tabsMisc tabMisc->end(); } // Fl_Group* tabMisc - { tabQRZ = new Fl_Group(0, 25, 600, 355, _("Web")); + { tabQRZ = new Fl_Group(0, 25, 600, 360, _("Web")); tabQRZ->tooltip(_("Callsign database")); tabQRZ->hide(); - { tabsQRZ = new Fl_Tabs(0, 25, 600, 355); - { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("Call Lookup")); + { tabsQRZ = new Fl_Tabs(0, 25, 600, 360); + { Fl_Group* o = new Fl_Group(0, 50, 600, 335, _("Call Lookup")); + o->hide(); { Fl_Group* o = new Fl_Group(34, 56, 538, 122, _("Web Browser lookup")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -11648,8 +11658,7 @@ and restarted if needed.")); } // Fl_Group* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(0, 50, 600, 330, _("eQSL")); - o->hide(); + { Fl_Group* o = new Fl_Group(0, 50, 600, 335, _("eQSL")); { Fl_Input2* o = inpEQSL_id = new Fl_Input2(225, 58, 150, 20, _("User ID")); inpEQSL_id->tooltip(_("Your login name")); inpEQSL_id->box(FL_DOWN_BOX); @@ -11754,12 +11763,12 @@ and restarted if needed.")); } // Fl_Tabs* tabsQRZ tabQRZ->end(); } // Fl_Group* tabQRZ - { tabAutoStart = new Fl_Group(0, 25, 600, 355, _("Autostart")); + { tabAutoStart = new Fl_Group(0, 25, 600, 360, _("Autostart")); tabAutoStart->tooltip(_("Operator information")); tabAutoStart->callback((Fl_Callback*)cb_tabAutoStart); tabAutoStart->when(FL_WHEN_CHANGED); tabAutoStart->hide(); - { Fl_Group* o = new Fl_Group(2, 32, 596, 330, _("Auto start programs with fldigi")); + { Fl_Group* o = new Fl_Group(2, 32, 596, 335, _("Auto start programs with fldigi")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Input2* o = txt_auto_flrig_pathname = new Fl_Input2(63, 71, 310, 24, _("flrig:")); @@ -11963,9 +11972,10 @@ and restarted if needed.")); } // Fl_Group* o tabAutoStart->end(); } // Fl_Group* tabAutoStart - { tabIO = new Fl_Group(0, 25, 600, 355, _("IO")); + { tabIO = new Fl_Group(0, 25, 600, 360, _("IO")); tabIO->tooltip(_("Program to Program Communications")); tabIO->callback((Fl_Callback*)cb_tabIO); + tabIO->hide(); { Fl_Group* o = new Fl_Group(6, 34, 588, 102); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); @@ -12322,13 +12332,13 @@ i.e. localhost")); } // Fl_Group* tabIO tabsConfigure->end(); } // Fl_Tabs* tabsConfigure - { btnSaveConfig = new Fl_Button(330, 388, 130, 22, _("Save")); + { btnSaveConfig = new Fl_Button(330, 390, 130, 22, _("Save")); btnSaveConfig->callback((Fl_Callback*)cb_btnSaveConfig); } // Fl_Button* btnSaveConfig - { btnCloseConfig = new Fl_Return_Button(462, 388, 130, 22, _("Close")); + { btnCloseConfig = new Fl_Return_Button(462, 390, 130, 22, _("Close")); btnCloseConfig->callback((Fl_Callback*)cb_btnCloseConfig); } // Fl_Return_Button* btnCloseConfig - { btnResetConfig = new Fl_Button(20, 388, 130, 22, _("Restore defaults")); + { btnResetConfig = new Fl_Button(20, 390, 130, 22, _("Restore defaults")); btnResetConfig->callback((Fl_Callback*)cb_btnResetConfig); } // Fl_Button* btnResetConfig o->set_non_modal(); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 01b1c5ef..c6b74dee 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -1,122 +1,122 @@ # data file for the Fltk User Interface Designer (fluid) -version 1.0303 -i18n_type 1 -i18n_include "gettext.h" -i18n_function _ -header_name {.h} +version 1.0303 +i18n_type 1 +i18n_include "gettext.h" +i18n_function _ +header_name {.h} code_name {.cxx} decl {\#include } {private local -} +} decl {\#include } {private local -} +} decl {\#include } {private local -} +} decl {\#include } {private local -} +} decl {\#include } {private local -} +} decl {\#include } {private local -} +} decl {\#include "main.h"} {private local -} +} decl {\#include "fl_digi.h"} {private local -} +} decl {\#include "data_io.h"} {private local -} +} decl {\#include "Viewer.h"} {private global -} +} decl {\#include "font_browser.h"} {public global -} +} decl {\#include "soundconf.h"} {private local -} +} decl {\#include "globals.h"} {public local -} +} decl {\#include "modem.h"} {public local -} +} decl {\#include "configuration.h"} {public local -} +} decl {\#include "combo.h"} {public local -} +} decl {\#include "waterfall.h"} {private local -} +} decl {\#include "rigxml.h"} {private local -} +} decl {\#include "lookupcall.h"} {private local -} +} decl {\#include "icons.h"} {private local -} +} decl {\#include "Viewer.h"} {private local -} +} decl {\#include "pskrep.h"} {private global -} +} decl {\#include "flinput2.h"} {public local -} +} decl {\#include "flslider2.h"} {public local -} +} decl {\#include "flmisc.h"} {public local -} +} decl {\#include "logsupport.h"} {private local -} +} decl {\#include "notify.h"} {private local -} +} decl {\#include "debug.h"} {private local -} +} decl {\#include "status.h"} {private local -} +} decl {\#include "rx_extract.h"} {private local -} +} decl {\#include "kmlserver.h"} {private local -} +} decl {\#include "macroedit.h"} {private local -} +} decl {\#include "fileselect.h"} {private local -} +} decl {extern void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata);} {private local -} +} decl {\#if USE_HAMLIB \#include "hamlib.h" \#endif} {private local -} +} decl {Fl_Double_Window *dlgConfig;} {public local -} +} decl {Mode_Browser* mode_browser;} {public local -} +} 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); if (fl_color_chooser("Font color", r, g, b)) c = fl_rgb_color(r, g, b);} {} -} +} Function {cbRxFontBrowser(Fl_Widget*, void*)} {open private return_type void } { @@ -156,7 +156,7 @@ Function {cbRxFontBrowser(Fl_Widget*, void*)} {open private return_type void font_browser->hide(); progdefaults.changed = true;} {} -} +} 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(); progdefaults.changed = true;} {} -} +} Function {cbMacroEditFontBrowser(Fl_Widget*, void*)} {private return_type void } { @@ -210,7 +210,7 @@ Function {cbMacroEditFontBrowser(Fl_Widget*, void*)} {private return_type void font_browser->hide(); progdefaults.changed = true;} {} -} +} Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {return_type void } { @@ -222,7 +222,7 @@ Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {return_type void progdefaults.changed = true; font_browser->hide();} {} -} +} Function {cbMacroBtnFontBrowser(Fl_Widget*, void*)} {private return_type void } { @@ -249,7 +249,7 @@ Function {cbMacroBtnFontBrowser(Fl_Widget*, void*)} {private return_type void progdefaults.changed = true; colorize_macros();} {} -} +} Function {cbViewerFontBrowser(Fl_Widget*, void*)} {return_type void } { @@ -259,7 +259,7 @@ Function {cbViewerFontBrowser(Fl_Widget*, void*)} {return_type void progdefaults.changed = true; font_browser->hide();} {} -} +} Function {cbFreqControlFontBrowser(Fl_Widget*, void*)} {return_type void } { @@ -277,7 +277,7 @@ Function {cbFreqControlFontBrowser(Fl_Widget*, void*)} {return_type void qsoFreqDisp3->redraw(); font_browser->hide();} {} -} +} 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(); progdefaults.changed = true;} {} -} +} 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(); progdefaults.changed = true;} {} -} +} 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++) qrzbxml[i]->value(b == qrzbxml[i]);} {} -} +} 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++) qrzbweb[i]->value(b == qrzbweb[i]);} {} -} +} Function {ConfigureDialog()} {open } { @@ -359,15 +359,15 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} Fl_Window {} { label {Fldigi configuration} open - xywh {988 128 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible + xywh {900 170 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible } { Fl_Tabs tabsConfigure {open xywh {0 0 600 385} color 50 selection_color 50 } { Fl_Group tabOperator { label Operator - callback {progdefaults.changed = true;} open - tooltip {Operator information} xywh {0 25 600 355} when 1 hide + callback {progdefaults.changed = true;} selected + tooltip {Operator information} xywh {0 25 600 360} when 1 } { Fl_Group {} { label Station open @@ -466,7 +466,7 @@ progdefaults.changed = true;} } } Fl_Group tabUI { - label UI open + label UI tooltip {User Interface} xywh {0 25 600 360} hide } { Fl_Tabs tabsUI {open @@ -474,7 +474,7 @@ progdefaults.changed = true;} } { Fl_Group tabBrowser { label Browser - tooltip {User Interface - Browser} xywh {0 50 600 330} hide + tooltip {User Interface - Browser} xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {30 65 540 300} box ENGRAVED_FRAME @@ -660,7 +660,7 @@ progdefaults.changed = true;} } Fl_Group tabContest { label Contest - tooltip {User Interface - Contest} xywh {0 50 600 330} hide + tooltip {User Interface - Contest} xywh {0 50 600 335} hide } { Fl_Group {} { label Exchanges open @@ -799,8 +799,8 @@ progdefaults.changed = true;} } } Fl_Group tabUserInterface { - label General open - tooltip {User Interface - General} xywh {0 50 600 330} hide + label General + tooltip {User Interface - General} xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {40 77 520 76} box ENGRAVED_FRAME @@ -935,15 +935,15 @@ progdefaults.changed = true;} } } Fl_Group tabLogServer { - label Log open + label Log tooltip {User Interface - Colors / Fonts} xywh {0 50 600 335} hide } { Fl_Tabs tabsLog {open - xywh {0 55 600 330} + xywh {0 55 600 335} } { Fl_Group {} { label QSO - xywh {0 80 600 300} + xywh {0 75 600 315} } { Fl_Group {} { label {QSO logging} open @@ -1043,12 +1043,12 @@ progdefaults.changed = true;} } } Fl_Group {} { - label {Rx Text} open - xywh {0 80 600 300} hide + label {Rx Text} + xywh {0 75 600 315} hide } { Fl_Group {} { label {Rx Text} open - xywh {62 100 496 110} box ENGRAVED_FRAME align 21 + xywh {62 96 496 113} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnRXClicks { label {Single-click to capture} @@ -1084,8 +1084,8 @@ progdefaults.changed = true;} } } Fl_Group {} { - label MacLogger open - xywh {0 80 600 300} hide + label MacLogger + xywh {0 75 600 315} hide } { Fl_Check_Button btnConnectToMaclogger { label {Connect to MacLogger} @@ -1095,7 +1095,7 @@ if (progdefaults.connect_to_maclogger == false) else maclogger_init(); progdefaults.changed = true;} - xywh {10 95 186 20} down_box DOWN_BOX + xywh {10 91 186 20} down_box DOWN_BOX code0 {o->value(progdefaults.connect_to_maclogger);} code1 {\#include "maclogger.h"} } @@ -1103,65 +1103,65 @@ progdefaults.changed = true;} label {Capture Radio Report} callback {progdefaults.capture_maclogger_radio = o->value(); progdefaults.changed = true;} - xywh {205 95 186 20} down_box DOWN_BOX value 1 + xywh {205 91 186 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.capture_maclogger_radio);} } Fl_Check_Button btn_capture_maclogger_log { label {Capture Log Report} callback {progdefaults.capture_maclogger_log = o->value(); progdefaults.changed = true;} - xywh {205 120 186 20} down_box DOWN_BOX + xywh {205 116 186 21} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_log);} } Fl_Check_Button btn_capture_maclogger_lookup { label {Capture Lookup } callback {progdefaults.capture_maclogger_lookup = o->value(); progdefaults.changed = true;} - xywh {405 95 186 20} down_box DOWN_BOX + xywh {405 91 186 20} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_lookup);} } Fl_Check_Button btn_capture_maclogger_spot_tune { label {Capture Spot Tune} callback {progdefaults.capture_maclogger_spot_tune = o->value(); progdefaults.changed = true;} - xywh {405 120 186 20} down_box DOWN_BOX + xywh {405 116 186 21} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_spot_tune);} } Fl_Check_Button btn_capture_maclogger_spot_report { label {Capture Spot Report} callback {progdefaults.capture_maclogger_spot_report = o->value(); progdefaults.changed = true;} - xywh {405 147 186 20} down_box DOWN_BOX + xywh {405 144 186 21} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_spot_report);} } Fl_Check_Button btn_enable_maclogger_log { label {Enable UDP log file} callback {progdefaults.enable_maclogger_log = o->value(); progdefaults.changed = true;} - xywh {10 175 165 25} down_box DOWN_BOX + xywh {10 173 165 26} down_box DOWN_BOX code0 {o->value(progdefaults.enable_maclogger_log);} } Fl_Text_Display txt_UDP_data { label {UDP data stream} - xywh {10 220 580 156} align 5 + xywh {10 220 580 161} align 5 code0 {Fl_Text_Buffer *txtbuffer = new Fl_Text_Buffer();} code1 {o->buffer(txtbuffer);} } Fl_Output txt_maclogger_log_filename { - xywh {178 175 272 25} + xywh {178 173 272 26} code0 {o->value(progdefaults.maclogger_log_filename.c_str());} } Fl_Button {} { label {Clear UDP text} callback {txt_UDP_data->buffer()->text("");} - xywh {460 175 129 25} + xywh {460 173 129 26} } } } } Fl_Group tabMBars { - label Macros open - tooltip {User Interface - Macros} xywh {0 50 600 330} hide + label Macros + tooltip {User Interface - Macros} xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {52 263 496 35} box ENGRAVED_FRAME @@ -1324,7 +1324,7 @@ progdefaults.changed = true;} } Fl_Group tabWF_UI { label {WF Ctrls} - tooltip {User Interface - Waterfall controls} xywh {0 50 600 330} hide + tooltip {User Interface - Waterfall controls} xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {52 83 496 253} box ENGRAVED_BOX @@ -1462,15 +1462,15 @@ WF_UI();} } } Fl_Group tabColorsFonts { - label {Clrs/Fnts} open - tooltip {User Interface - Colors / Fonts} xywh {0 50 600 330} + label {Clrs/Fnts} + tooltip {User Interface - Colors / Fonts} xywh {0 50 600 335} } { Fl_Tabs tabsColors {open xywh {0 55 600 325} } { Fl_Group {} { - label {Rx/Tx} open - xywh {0 80 600 300} hide + label {Rx/Tx} + xywh {0 80 600 305} hide } { Fl_Group listbox_charset_status { label {Rx/Tx Character set} open @@ -1774,8 +1774,8 @@ progdefaults.changed = true;} } } Fl_Group {} { - label {FreqDisp / Meters} open - xywh {0 80 600 300} hide + label {FreqDisp / Meters} + xywh {0 80 600 305} hide } { Fl_Group {} {open xywh {115 108 395 87} box ENGRAVED_FRAME @@ -2032,8 +2032,8 @@ progdefaults.changed = true;} open } } Fl_Group {} { - label Log open - xywh {0 80 600 300} hide + label Log + xywh {0 80 600 305} hide } { Fl_Group {} { label {Logging Panel Controls} open @@ -2153,8 +2153,8 @@ progdefaults.changed = true;} } } Fl_Group {} { - label F_keys open - xywh {0 80 600 300} hide + label F_keys + xywh {0 80 600 305} hide } { Fl_Check_Button btnUseGroupColors { label {Use colored buttons} @@ -2285,8 +2285,8 @@ font_browser->show();} } } Fl_Group {} { - label Tabs open - xywh {0 80 600 300} hide + label Tabs + xywh {0 80 600 305} hide } { Fl_Button btnTabColor { label {Tab Color} @@ -2304,8 +2304,8 @@ progdefaults.changed = true;} } } Fl_Group {} { - label Buttons open - xywh {0 80 600 300} + label Buttons + xywh {0 80 600 305} hide } { Fl_Button btnSpotColor { label Spot @@ -2456,8 +2456,8 @@ progdefaults.changed = true;} } } Fl_Group {} { - label SigLvl open - xywh {0 80 600 300} hide + label SigLvl + xywh {0 80 600 305} } { Fl_Button btnLowSignal { label Low @@ -2515,8 +2515,8 @@ progdefaults.changed = true;} } } Fl_Group tab_touch { - label Touch open - xywh {0 50 600 330} hide + label Touch + xywh {0 50 600 335} hide } { Fl_Box {} { label {Note: @@ -2564,14 +2564,14 @@ UI_select();} } Fl_Group tabWaterfall { label Waterfall - xywh {0 25 600 355} hide + xywh {0 25 600 360} hide } { Fl_Tabs tabsWaterfall {open - xywh {0 25 600 355} color 50 selection_color 50 + xywh {0 25 600 360} color 50 selection_color 50 } { Fl_Group {} { label Display open - xywh {0 50 600 330} + xywh {0 50 600 335} hide } { Fl_Group {} { label {Colors and cursors} open @@ -2812,7 +2812,7 @@ progdefaults.changed = true;} } Fl_Group {} { label {FFT Processing} open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 71 490 135} box ENGRAVED_FRAME @@ -2897,7 +2897,7 @@ progdefaults.changed = true;} } Fl_Group {} { label Mouse open - xywh {0 50 600 330} hide + xywh {0 50 600 335} } { Fl_Group {} {open xywh {55 73 490 170} box ENGRAVED_FRAME @@ -2949,22 +2949,22 @@ behaves inside the waterfall} xywh {65 207 150 22} box DOWN_BOX color 7 align 8 } } Fl_Group tabModems { - label Modems open - xywh {0 25 600 355} hide + label Modems + xywh {0 25 600 360} hide } { Fl_Tabs tabsModems {open - xywh {0 25 600 355} selection_color 50 align 9 + xywh {0 25 600 360} selection_color 50 align 9 } { Fl_Group tabCW { - label CW open - xywh {0 50 600 330} hide + label CW + xywh {0 50 600 335} hide } { Fl_Tabs tabsCW {open - xywh {0 50 600 330} selection_color 50 + xywh {0 50 600 335} selection_color 50 } { Fl_Group {} { label General open - xywh {0 75 600 305} align 5 hide + xywh {0 75 600 310} align 5 } { Fl_Group {} { label Receive open @@ -3113,7 +3113,7 @@ progdefaults.changed = true;} } Fl_Group {} { label {Timing and QSK} open - xywh {0 75 600 305} align 5 + xywh {0 75 600 310} align 5 hide } { Fl_Group {} { label Timing open @@ -3238,7 +3238,7 @@ progdefaults.changed = true;} } Fl_Group {} { label Prosigns open - xywh {0 75 600 305} align 5 hide + xywh {0 75 600 310} align 5 hide } { Fl_Group {} {open xywh {35 85 530 283} box ENGRAVED_FRAME @@ -3425,8 +3425,8 @@ progdefaults.changed = true;} open } } Fl_Group tabDomEX { - label Dom open - xywh {0 50 600 330} hide + label Dom + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 60 490 180} box ENGRAVED_FRAME @@ -3486,8 +3486,8 @@ progdefaults.changed = true;} } } Fl_Group tabFeld { - label Feld open - xywh {0 50 600 330} hide + label Feld + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 72 490 145} box ENGRAVED_FRAME @@ -3563,8 +3563,8 @@ progdefaults.changed = true;} } } Fl_Group tabFSQ { - label FSQ open - xywh {0 50 600 330} hide + label FSQ + xywh {0 50 600 335} hide } { Fl_Group {} { label {Rx Parameters} open @@ -3824,8 +3824,8 @@ progdefaults.changed = true;} } } Fl_Group tabIFKP { - label IFKP open - xywh {0 50 600 330} hide + label IFKP + xywh {0 50 600 335} hide } { Fl_Group {} { label {Tx Parameters} open @@ -3946,8 +3946,8 @@ if (fname) { } } Fl_Group tabMT63 { - label {MT-63} open - xywh {0 50 600 330} hide + label {MT-63} + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 73 490 84} box ENGRAVED_FRAME align 21 @@ -4011,8 +4011,8 @@ progdefaults.changed = true;} } } Fl_Group tabOlivia { - label Oliv open - xywh {0 50 600 330} hide + label Oliv + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 76 490 280} box ENGRAVED_FRAME @@ -4090,8 +4090,8 @@ progdefaults.changed = true;} } } Fl_Group tabContestia { - label Cont open - xywh {0 50 600 330} hide + label Cont + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 80 490 235} box ENGRAVED_FRAME @@ -4159,15 +4159,15 @@ progdefaults.changed = true;} } } Fl_Group tabPSK { - label PSK open - xywh {0 50 600 330} + label PSK + xywh {0 50 600 335} hide } { Fl_Tabs tabsPSK {open - xywh {0 50 600 330} selection_color 50 + xywh {0 50 600 335} selection_color 50 } { Fl_Group grpPSK { label General open - xywh {0 75 600 305} align 5 + xywh {0 75 600 310} align 5 } { Fl_Group {} { label {AFC behavior} open @@ -4264,15 +4264,15 @@ progdefaults.changed = true;} } } Fl_Group tabRTTY { - label TTY open - xywh {0 50 600 330} hide + label TTY + xywh {0 50 600 335} hide } { Fl_Tabs tabsRTTY {open - xywh {0 50 600 330} selection_color 50 + xywh {0 50 600 335} selection_color 50 } { Fl_Group {} { label Tx open - xywh {0 75 600 305} align 5 + xywh {0 75 600 310} align 5 hide } { Fl_Group selShift { label {Carrier shift} @@ -4395,7 +4395,7 @@ if (o->value()) { } Fl_Group {} { label Rx open - xywh {0 75 600 305} align 5 hide + xywh {0 75 600 310} align 5 } { Fl_Group {} { label Receive open @@ -4515,7 +4515,7 @@ progdefaults.changed = true; } Fl_Group {} { label Synop open - xywh {0 75 600 305} align 5 hide + xywh {0 75 600 310} align 5 hide } { Fl_Check_Button btnSynopAdifDecoding { label {SYNOP to ADIF} @@ -4543,7 +4543,7 @@ progdefaults.changed = true;} } Fl_Group tabTHOR { label Thor - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 78 490 270} box ENGRAVED_FRAME @@ -4619,138 +4619,147 @@ progdefaults.changed = true;} } } } - Fl_Group tabNavtex { - label Nav - xywh {0 50 600 330} hide + Fl_Group tabOther { + label Other open + xywh {0 50 600 335} } { - Fl_Check_Button btnNvtxAdifLog { - label {Log Navtex messages to Adif file} - callback {progdefaults.NVTX_AdifLog=o->value(); -progdefaults.changed = true;} - xywh {171 79 235 30} down_box DOWN_BOX - code0 {o->value(progdefaults.NVTX_AdifLog);} - } - Fl_Check_Button btnNvtxKmlLog { - label {Log Navtex messages to KML} - callback {progdefaults.NVTX_KmlLog=o->value(); -progdefaults.changed = true;} - tooltip {Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)} xywh {170 125 270 30} down_box DOWN_BOX - code0 {o->value(progdefaults.NVTX_KmlLog);} - } - } - Fl_Group tabWefax { - label WFx open - xywh {0 50 600 330} hide - } { - Fl_Group {} {open - xywh {2 63 598 300} + Fl_Tabs tabsOther {open + xywh {0 50 600 335} } { - Fl_Check_Button btnWefaxAdifLog { - label {Log Wefax messages to Adif file} - callback {progdefaults.WEFAX_AdifLog=o->value(); + Fl_Group tabNavtex { + label Nav + xywh {0 75 600 310} hide + } { + Fl_Check_Button btnNvtxAdifLog { + label {Log Navtex messages to Adif file} + callback {progdefaults.NVTX_AdifLog=o->value(); progdefaults.changed = true;} - tooltip {Sent and received faxes are logged to Adif file.} xywh {94 137 235 30} down_box DOWN_BOX - code0 {o->value(progdefaults.WEFAX_AdifLog);} - } - Fl_Check_Button btnWefaxEmbeddedGui { - label {Embedded Wefax Gui} - callback {progdefaults.WEFAX_EmbeddedGui=o->value(); + xywh {181 109 235 30} down_box DOWN_BOX + code0 {o->value(progdefaults.NVTX_AdifLog);} + } + Fl_Check_Button btnNvtxKmlLog { + label {Log Navtex messages to KML} + callback {progdefaults.NVTX_KmlLog=o->value(); progdefaults.changed = true;} - tooltip {Display tx and rx in main fldigi window. -Change requires restart of fldigi} xywh {94 74 235 30} down_box DOWN_BOX - code0 {o->value(progdefaults.WEFAX_EmbeddedGui);} + tooltip {Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)} xywh {180 155 270 30} down_box DOWN_BOX + code0 {o->value(progdefaults.NVTX_KmlLog);} + } } - Fl_Input btnWefaxShift { - label {Frequency shift (800 Hz)} - callback {if( o->value() > 900 ) { o->value(900); return; } + Fl_Group tabWefax { + label WFx + xywh {0 75 600 310} hide + } { + Fl_Group {} {open + xywh {2 79 598 285} + } { + Fl_Check_Button btnWefaxAdifLog { + label {Log Wefax messages to Adif file} + callback {progdefaults.WEFAX_AdifLog=o->value(); +progdefaults.changed = true;} + tooltip {Sent and received faxes are logged to Adif file.} xywh {99 155 235 30} down_box DOWN_BOX + code0 {o->value(progdefaults.WEFAX_AdifLog);} + } + Fl_Check_Button btnWefaxEmbeddedGui { + label {Embedded Wefax Gui} + callback {progdefaults.WEFAX_EmbeddedGui=o->value(); +progdefaults.changed = true;} + tooltip {Display tx and rx in main fldigi window. +Change requires restart of fldigi} xywh {99 92 235 30} down_box DOWN_BOX + code0 {o->value(progdefaults.WEFAX_EmbeddedGui);} + } + Fl_Input btnWefaxShift { + label {Frequency shift (800 Hz)} + callback {if( o->value() > 900 ) { o->value(900); return; } if( o->value() < 750 ) { o->value(750); return; } progdefaults.WEFAX_Shift=o->value(); progdefaults.changed = true;} - tooltip {Default 800 Hz. Deutsche Wetterdienst 850Hz} xywh {94 177 80 20} type Int align 8 - code0 {o->value(progdefaults.WEFAX_Shift);} - class Fl_Value_Input2 - } - Fl_Input btnWefaxMaxRows { - label {Received fax maximum rows number (5000)} - callback {if(o->value() > 10000 ) { o->value(10000); return ; } + tooltip {Default 800 Hz. Deutsche Wetterdienst 850Hz} xywh {99 195 80 20} type Int align 8 + code0 {o->value(progdefaults.WEFAX_Shift);} + class Fl_Value_Input2 + } + Fl_Input btnWefaxMaxRows { + label {Received fax maximum rows number (5000)} + callback {if(o->value() > 10000 ) { o->value(10000); return ; } if(o->value() < 1000 ) { o->value(1000); return ; } progdefaults.WEFAX_MaxRows=o->value(); progdefaults.changed = true;} - tooltip {Maximum row number for a received fax image.} xywh {94 217 85 20} type Int align 8 - code0 {o->value(progdefaults.WEFAX_MaxRows);} - class Fl_Value_Input2 - } - Fl_Input btnWefaxSaveDir { - label {Fax images destination directory} - callback {progdefaults.wefax_save_dir=o->value(); + tooltip {Maximum row number for a received fax image.} xywh {99 235 85 20} type Int align 8 + code0 {o->value(progdefaults.WEFAX_MaxRows);} + class Fl_Value_Input2 + } + Fl_Input btnWefaxSaveDir { + label {Fax images destination directory} + callback {progdefaults.wefax_save_dir=o->value(); progdefaults.changed = true;} - xywh {94 267 310 20} align 5 - code0 {o->value(progdefaults.wefax_save_dir.c_str());} - } - Fl_Button btnSelectFaxDestDir { - label {Directory...} - callback {Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); + xywh {99 285 310 20} align 5 + code0 {o->value(progdefaults.wefax_save_dir.c_str());} + } + Fl_Button btnSelectFaxDestDir { + label {Directory...} + callback {Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(WefaxDestDirSet); fc->show();} - xywh {424 267 80 20} - } - Fl_Check_Button btnWefaxHideTx { - label {Hide Transmission window} - callback {progdefaults.WEFAX_HideTx=o->value(); + xywh {429 285 80 20} + } + Fl_Check_Button btnWefaxHideTx { + label {Hide Transmission window} + callback {progdefaults.WEFAX_HideTx=o->value(); progdefaults.changed = true;} - tooltip {Hide transmission window by default.} xywh {94 107 235 30} down_box DOWN_BOX - code0 {o->value(progdefaults.WEFAX_HideTx);} - } - Fl_Check_Button btnWefaxSaveMonochrome { - label {Save image as monochrome file} - callback {progdefaults.WEFAX_SaveMonochrome=o->value(); + tooltip {Hide transmission window by default.} xywh {99 125 235 30} down_box DOWN_BOX + code0 {o->value(progdefaults.WEFAX_HideTx);} + } + Fl_Check_Button btnWefaxSaveMonochrome { + label {Save image as monochrome file} + callback {progdefaults.WEFAX_SaveMonochrome=o->value(); progdefaults.changed = true;} - tooltip {Save the fax image as a gray-level PNG file.} xywh {94 297 235 30} down_box DOWN_BOX - code0 {o->value(progdefaults.WEFAX_SaveMonochrome);} + tooltip {Save the fax image as a gray-level PNG file.} xywh {99 315 235 30} down_box DOWN_BOX + code0 {o->value(progdefaults.WEFAX_SaveMonochrome);} + } + } } - } - } - Fl_Group tabDFTscan { - label Scan open - xywh {0 50 600 330} hide - } { - Fl_Counter cnt_dft_scans { - label {\# scans} - callback {progdefaults.cnt_dft_scans=(int)o->value(); + Fl_Group tabDFTscan { + label Scan + xywh {0 75 600 310} + } { + Fl_Counter cnt_dft_scans { + label {\# scans} + callback {progdefaults.cnt_dft_scans=(int)o->value(); progdefaults.changed = true;} - xywh {235 129 132 21} minimum 10 maximum 1000 step 10 value 60 - code0 {o->value(progdefaults.cnt_dft_scans);} - code1 {o->lstep(100.0);} - } - Fl_Counter cnt_dft_range { - label {dB Range} - callback {progdefaults.cnt_dft_range=o->value(); + xywh {235 154 132 21} minimum 10 maximum 1000 step 10 value 60 + code0 {o->value(progdefaults.cnt_dft_scans);} + code1 {o->lstep(100.0);} + } + Fl_Counter cnt_dft_range { + label {dB Range} + callback {progdefaults.cnt_dft_range=o->value(); update_scope(); progdefaults.changed = true;} - xywh {251 194 100 21} type Simple minimum 20 maximum 120 step 10 value 60 - code0 {o->value(progdefaults.cnt_dft_range);} - } - Fl_Check_Button btn_use_relative_dB { - label {Use relative dB} - callback {progdefaults.dft_relative=o->value(); + xywh {251 219 100 21} type Simple minimum 20 maximum 120 step 10 value 60 + code0 {o->value(progdefaults.cnt_dft_range);} + } + Fl_Check_Button btn_use_relative_dB { + label {Use relative dB} + callback {progdefaults.dft_relative=o->value(); update_scope(); progdefaults.changed = true;} - xywh {275 265 70 15} down_box DOWN_BOX - code0 {o->value(progdefaults.dft_relative);} + xywh {275 290 70 15} down_box DOWN_BOX + code0 {o->value(progdefaults.dft_relative);} + } + } } } } } Fl_Group tabRig { label Rig open - tooltip {Transceiver control} xywh {0 23 600 357} hide + tooltip {Transceiver control} xywh {0 25 600 360} hide } { Fl_Tabs tabsRig {open - xywh {0 23 600 357} selection_color 50 + xywh {0 25 600 360} selection_color 50 } { Fl_Group {} { - label RigCAT open - tooltip {Rig Control using xml spec file} xywh {0 50 600 330} + label RigCAT + tooltip {Rig Control using xml spec file} xywh {0 50 600 335} hide } { Fl_Check_Button chkUSERIGCAT { label {Use RigCAT} @@ -4959,8 +4968,8 @@ btnRevertRIGCAT->activate();} } } Fl_Group tabHamlib { - label Hamlib open - xywh {0 50 600 330} hide + label Hamlib + xywh {0 50 600 335} hide } { Fl_Check_Button chkUSEHAMLIB { label {Use Hamlib} @@ -5186,8 +5195,8 @@ progdefaults.changed = true;} } } Fl_Group {} { - label {Hardware PTT} open - xywh {0 50 600 330} hide + label {Hardware PTT} + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 57 490 38} box ENGRAVED_FRAME @@ -5344,8 +5353,8 @@ progdefaults.changed = true;} } } Fl_Group tabXMLRPC { - label {XML-RPC} open - xywh {0 50 600 330} hide + label {XML-RPC} + xywh {0 50 600 335} hide } { Fl_Group grpXMLRPC {open xywh {55 61 490 160} box ENGRAVED_FRAME @@ -5392,7 +5401,7 @@ when both in same macro definition} xywh {210 239 90 21} type Simple align 8 min } Fl_Group tabFLRIG { label flrig open - xywh {0 50 600 330} hide + xywh {0 50 600 335} } { Fl_Output {} { tooltip {" "} xywh {75 77 465 58} type Multiline box BORDER_BOX color 50 align 0 @@ -5409,15 +5418,15 @@ progdefaults.changed = true;} } } Fl_Group tabSoundCard { - label Audio open - tooltip {Audio devices} xywh {0 25 600 355} hide + label Audio + tooltip {Audio devices} xywh {0 25 600 360} hide } { Fl_Tabs tabsSoundCard {open - xywh {0 25 600 355} selection_color 50 + xywh {0 25 600 360} selection_color 50 } { Fl_Group tabAudio { label Devices open - xywh {0 50 600 330} + xywh {0 50 600 335} } { Fl_Group AudioOSS {open xywh {55 65 490 45} box ENGRAVED_FRAME @@ -5501,7 +5510,7 @@ resetSoundCard();} } Fl_Group tabAudioOpt { label Settings open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group grpAudioSampleRate { label {Sample rate} open @@ -5584,7 +5593,7 @@ progdefaults.changed = true;} } Fl_Group tabAudioRightChannel { label {Right channel} open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group {} { label {Transmit Usage} open @@ -5689,7 +5698,7 @@ progdefaults.changed = true;} } Fl_Group tabWavFile { label Wav open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group listbox_wav_samplerate { label {Wav write sample rate} @@ -5706,14 +5715,14 @@ progdefaults.changed = true;} open } Fl_Group tabID { label ID open - xywh {0 23 600 357} hide + xywh {0 25 600 360} hide } { Fl_Tabs tabsID {open - xywh {0 23 600 357} + xywh {0 25 600 360} } { Fl_Group tabRsID { label RsID open - xywh {0 50 600 330} + xywh {0 50 600 335} hide } { Fl_Group {} { label {Reed-Solomon ID (Rx)} open @@ -5854,7 +5863,7 @@ progdefaults.changed = true;} } Fl_Group tabVideoID { label Video open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group {} { label {Video Preamble ID} open @@ -5926,7 +5935,7 @@ progdefaults.changed = true;} } Fl_Group tabCwID { label CW - xywh {0 50 600 330} hide + xywh {0 50 600 335} } { Fl_Group sld { label {CW Postamble ID} open @@ -5962,14 +5971,14 @@ progdefaults.changed = true;} } Fl_Group tabMisc { label Misc open - xywh {0 25 600 355} hide + xywh {0 25 600 360} hide } { Fl_Tabs tabsMisc {open - xywh {0 25 600 355} selection_color 50 + xywh {0 25 600 360} selection_color 50 } { Fl_Group tabCPUspeed { label CPU open - xywh {0 50 600 330} + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 75 490 51} box ENGRAVED_FRAME align 21 @@ -5985,7 +5994,7 @@ progdefaults.changed = true;} } Fl_Group tabNBEMS { label NBEMS open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group {} { label {NBEMS data file interface} open @@ -6048,7 +6057,7 @@ progdefaults.changed=true;} } Fl_Group tabPskmail { label Pskmail open - xywh {0 50 600 330} align 5 hide + xywh {0 50 600 335} align 5 hide } { Fl_Group {} { label {Mail Server Attributes} open @@ -6115,7 +6124,7 @@ progdefaults.changed = true;} } Fl_Group tabSpot { label Spotting open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group {} { label {PSK Reporter} open @@ -6198,7 +6207,7 @@ progdefaults.changed = true;} } Fl_Group tabSweetSpot { label {Sweet Spot} open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 71 490 75} box ENGRAVED_FRAME align 21 @@ -6255,7 +6264,7 @@ Other radios should not need it.} xywh {270 172 70 15} down_box DOWN_BOX } Fl_Group tabText_IO { label {Text i/o} open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group grpTalker { label {Talker Socket (MS only)} open @@ -6295,7 +6304,7 @@ progdefaults.changed = true;} } Fl_Group tabDTMF { label DTMF open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Check_Button chkDTMFdecode { label {Decode DTMF tones} @@ -6306,7 +6315,7 @@ progdefaults.changed = true;} } Fl_Group tabWX { label WX open - xywh {0 50 600 330} hide + xywh {0 50 600 335} hide } { Fl_Group {} { label {Weather query specification} open @@ -6414,7 +6423,7 @@ progdefaults.changed = true;} } Fl_Group tabKML { label KML open - xywh {0 50 600 330} hide + xywh {0 50 600 335} } { Fl_Input btnKmlSaveDir { label {KML files directory} @@ -6520,15 +6529,15 @@ if (progdefaults.kml_enabled) { } } Fl_Group tabQRZ { - label Web open - tooltip {Callsign database} xywh {0 25 600 355} hide + label Web + tooltip {Callsign database} xywh {0 25 600 360} hide } { Fl_Tabs tabsQRZ {open - xywh {0 25 600 355} + xywh {0 25 600 360} } { Fl_Group {} { label {Call Lookup} open - xywh {0 50 600 330} + xywh {0 50 600 335} hide } { Fl_Group {} { label {Web Browser lookup} open @@ -6701,7 +6710,7 @@ progdefaults.changed= true;} } Fl_Group {} { label eQSL open - xywh {0 50 600 330} hide + xywh {0 50 600 335} } { Fl_Input inpEQSL_id { label {User ID} @@ -6791,12 +6800,12 @@ progdefaults.changed = true;} } Fl_Group tabAutoStart { label Autostart - callback {progdefaults.changed = true;} open - tooltip {Operator information} xywh {0 25 600 355} when 1 hide + callback {progdefaults.changed = true;} + tooltip {Operator information} xywh {0 25 600 360} when 1 hide } { Fl_Group {} { label {Auto start programs with fldigi} open - xywh {2 32 596 330} box ENGRAVED_BOX align 17 + xywh {2 32 596 335} box ENGRAVED_BOX align 17 } { Fl_Input txt_auto_flrig_pathname { label {flrig:} @@ -6993,8 +7002,8 @@ progdefaults.changed = true;} } Fl_Group tabIO { label IO - callback {btnDisable_p2p_io_widgets->value(1);} open selected - tooltip {Program to Program Communications} xywh {0 25 600 355} + callback {btnDisable_p2p_io_widgets->value(1);} + tooltip {Program to Program Communications} xywh {0 25 600 360} hide code0 {btnDisable_p2p_io_widgets->value(1);} } { Fl_Group {} {open @@ -7002,7 +7011,7 @@ progdefaults.changed = true;} } { Fl_Check_Button btnDisable_p2p_io_widgets { label Lock user_data_type long - callback { progStatus.ip_lock = o->value(); + callback {progStatus.ip_lock = o->value(); if(o->value()) disable_config_p2p_io_widgets(); else @@ -7381,32 +7390,32 @@ number to the default value.} xywh {425 345 73 25} Fl_Button btnSaveConfig { label Save callback {progdefaults.saveDefaults();} - xywh {330 388 130 22} + xywh {330 390 130 22} } Fl_Return_Button btnCloseConfig { label Close callback {closeDialog();} - xywh {462 388 130 22} + xywh {462 390 130 22} } Fl_Button btnResetConfig { label {Restore defaults} callback {progdefaults.resetDefaults(); progdefaults.changed = false;} - xywh {20 388 130 22} + xywh {20 390 130 22} } } -} +} Function {openConfig()} {return_type void } { code {if (!dlgConfig) createConfig(); progdefaults.loadDefaults();} {} -} +} Function {closeDialog()} {return_type void } { code {if (dlgConfig) dlgConfig->hide();} {} -} +} Function {createConfig()} {return_type void } { @@ -7414,10 +7423,10 @@ Function {createConfig()} {return_type void dlgConfig = ConfigureDialog(); dlgConfig->xclass(PACKAGE_NAME); }} {} -} +} decl {class Fl_File_Chooser ;} {public global -} +} Function {WefaxDestDirSet(Fl_File_Chooser *w, void *userdata)} {return_type void } { @@ -7427,7 +7436,7 @@ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnWefaxSaveDir->redraw(); cb_btnWefaxSaveDir( btnWefaxSaveDir, NULL ); }} {} -} +} Function {KmlDestDirSet(Fl_File_Chooser *w, void *userdata)} {open return_type void } { @@ -7437,9 +7446,9 @@ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnKmlSaveDir->redraw(); cb_btnKmlSaveDir( btnKmlSaveDir, NULL ); }} {} -} +} -Function {make_window()} {} {} +Function {make_window()} {} {} Function {make_window()} {open -} {} +} {} diff --git a/src/include/confdialog.h b/src/include/confdialog.h index 1f16dcc4..ceffbd1a 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -428,6 +428,8 @@ extern Fl_Check_Button *valTHOR_PREAMBLE; extern Fl_Check_Button *valTHOR_SOFTSYMBOLS; extern Fl_Check_Button *valTHOR_SOFTBITS; extern Fl_Counter2 *valTHOR_PATHS; +extern Fl_Group *tabOther; +extern Fl_Tabs *tabsOther; extern Fl_Group *tabNavtex; extern Fl_Check_Button *btnNvtxAdifLog; extern Fl_Check_Button *btnNvtxKmlLog; From 759e6cfb05c82ba90c1fb0d6f53f313393b7c309 Mon Sep 17 00:00:00 2001 From: David Freese Date: Fri, 15 Apr 2016 13:14:49 -0500 Subject: [PATCH 106/138] Suppress dockable macros * suppress use of dockable macros - creates a minimal vertical pixel height of 436 - allows use of fldigi on vertically challenged screens - user can manually modify the fldigi_def.xml file to disable the dockable macro set 1 set value to false, 0. - or disable on the configuration tab for macros - the "View/Hide 48 macros" menu item will be hidden when DOCKABLE_MACROS set to 0, false --- src/dialogs/confdialog.cxx | 74 ++++++++++++++++++++------------ src/dialogs/confdialog.fl | 83 +++++++++++++++++++++--------------- src/dialogs/fl_digi.cxx | 85 ++++++++++++++++++++++++------------- src/include/confdialog.h | 1 + src/include/configuration.h | 5 ++- src/misc/macroedit.cxx | 7 +-- src/misc/status.cxx | 2 +- 7 files changed, 159 insertions(+), 98 deletions(-) diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index 07374b3a..7e156b10 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -1045,6 +1045,13 @@ progdefaults.SaveMacros = o->value(); progdefaults.changed = true; } +Fl_Check_Button *btn_dockable_macros=(Fl_Check_Button *)0; + +static void cb_btn_dockable_macros(Fl_Check_Button* o, void*) { + progdefaults.dockable_macros = !o->value(); +progdefaults.changed = true; +} + Fl_Group *tabWF_UI=(Fl_Group *)0; Fl_Check_Button *btnWF_UIrev=(Fl_Check_Button *)0; @@ -5948,7 +5955,7 @@ Fl_Double_Window* ConfigureDialog() { o->selection_color((Fl_Color)51); o->labelsize(18); o->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE)); - { tabsConfigure = new Fl_Tabs(0, 0, 600, 385); + { tabsConfigure = new Fl_Tabs(0, 0, 600, 390); tabsConfigure->color(FL_LIGHT1); tabsConfigure->selection_color(FL_LIGHT1); { tabOperator = new Fl_Group(0, 25, 600, 360, _("Operator")); @@ -6089,14 +6096,13 @@ Fl_Double_Window* ConfigureDialog() { } // Fl_Group* grpNoise tabOperator->end(); } // Fl_Group* tabOperator - { tabUI = new Fl_Group(0, 25, 600, 360, _("UI")); + { tabUI = new Fl_Group(0, 25, 600, 365, _("UI")); tabUI->tooltip(_("User Interface")); tabUI->hide(); - { tabsUI = new Fl_Tabs(0, 25, 600, 360); + { tabsUI = new Fl_Tabs(0, 25, 600, 365); tabsUI->selection_color(FL_LIGHT1); { tabBrowser = new Fl_Group(0, 50, 600, 335, _("Browser")); tabBrowser->tooltip(_("User Interface - Browser")); - tabBrowser->hide(); { Fl_Group* o = new Fl_Group(30, 65, 540, 300); o->box(FL_ENGRAVED_FRAME); { Fl_Spinner2* o = cntChannels = new Fl_Spinner2(46, 75, 50, 24, _("Channels, first channel starts at waterfall lower limit")); @@ -6517,7 +6523,7 @@ Fl_Double_Window* ConfigureDialog() { } // Fl_Group* o tabUserInterface->end(); } // Fl_Group* tabUserInterface - { tabLogServer = new Fl_Group(0, 50, 600, 335, _("Log")); + { tabLogServer = new Fl_Group(0, 50, 600, 340, _("Log")); tabLogServer->tooltip(_("User Interface - Colors / Fonts")); tabLogServer->hide(); { tabsLog = new Fl_Tabs(0, 55, 600, 335); @@ -6720,9 +6726,9 @@ ab and newline are automatically included.")); { tabMBars = new Fl_Group(0, 50, 600, 335, _("Macros")); tabMBars->tooltip(_("User Interface - Macros")); tabMBars->hide(); - { Fl_Group* o = new Fl_Group(52, 263, 496, 35); + { Fl_Group* o = new Fl_Group(5, 240, 590, 35); o->box(FL_ENGRAVED_FRAME); - { Fl_Check_Button* o = btnMacroMouseWheel = new Fl_Check_Button(62, 271, 296, 20, _("Mouse wheel active on macro buttons")); + { Fl_Check_Button* o = btnMacroMouseWheel = new Fl_Check_Button(62, 248, 296, 20, _("Mouse wheel active on macro buttons")); btnMacroMouseWheel->tooltip(_("enable mouse wheel control of macro bar")); btnMacroMouseWheel->down_box(FL_DOWN_BOX); btnMacroMouseWheel->callback((Fl_Callback*)cb_btnMacroMouseWheel); @@ -6730,10 +6736,10 @@ ab and newline are automatically included.")); } // Fl_Check_Button* btnMacroMouseWheel o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(52, 61, 496, 200, _("Number and position of macro bars")); + { Fl_Group* o = new Fl_Group(5, 60, 590, 180, _("Number and position of macro bars")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { Fl_Counter* o = cnt_macro_height = new Fl_Counter(215, 93, 89, 22, _("Button Height")); + { Fl_Counter* o = cnt_macro_height = new Fl_Counter(215, 85, 89, 22, _("Button Height")); cnt_macro_height->tooltip(_("Height of macro bar")); cnt_macro_height->type(1); cnt_macro_height->minimum(22); @@ -6744,89 +6750,89 @@ ab and newline are automatically included.")); cnt_macro_height->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.macro_height); } // Fl_Counter* cnt_macro_height - { btn_scheme_0 = new Fl_Round_Button(61, 130, 144, 22, _("One above Rx/Tx")); + { btn_scheme_0 = new Fl_Round_Button(61, 113, 144, 22, _("One above Rx/Tx")); btn_scheme_0->tooltip(_("Single macro bar below logging panel\nvariable height")); btn_scheme_0->type(102); btn_scheme_0->down_box(FL_ROUND_DOWN_BOX); btn_scheme_0->callback((Fl_Callback*)cb_btn_scheme_0); } // Fl_Round_Button* btn_scheme_0 - { btn_scheme_1 = new Fl_Round_Button(61, 155, 144, 22, _("One above waterfall")); + { btn_scheme_1 = new Fl_Round_Button(61, 138, 144, 22, _("One above waterfall")); btn_scheme_1->type(102); btn_scheme_1->down_box(FL_ROUND_DOWN_BOX); btn_scheme_1->callback((Fl_Callback*)cb_btn_scheme_1); } // Fl_Round_Button* btn_scheme_1 - { btn_scheme_2 = new Fl_Round_Button(61, 180, 144, 22, _("One below waterfall")); + { btn_scheme_2 = new Fl_Round_Button(61, 163, 144, 22, _("One below waterfall")); btn_scheme_2->type(102); btn_scheme_2->down_box(FL_ROUND_DOWN_BOX); btn_scheme_2->callback((Fl_Callback*)cb_btn_scheme_2); } // Fl_Round_Button* btn_scheme_2 - { btn_scheme_3 = new Fl_Round_Button(228, 130, 144, 22, _("Two scheme 1")); + { btn_scheme_3 = new Fl_Round_Button(228, 113, 144, 22, _("Two scheme 1")); btn_scheme_3->type(102); btn_scheme_3->down_box(FL_ROUND_DOWN_BOX); btn_scheme_3->callback((Fl_Callback*)cb_btn_scheme_3); } // Fl_Round_Button* btn_scheme_3 - { btn_scheme_5 = new Fl_Round_Button(228, 155, 144, 22, _("Two scheme 3")); + { btn_scheme_5 = new Fl_Round_Button(228, 138, 144, 22, _("Two scheme 3")); btn_scheme_5->type(102); btn_scheme_5->down_box(FL_ROUND_DOWN_BOX); btn_scheme_5->callback((Fl_Callback*)cb_btn_scheme_5); } // Fl_Round_Button* btn_scheme_5 - { btn_scheme_7 = new Fl_Round_Button(228, 180, 144, 22, _("Two scheme 5")); + { btn_scheme_7 = new Fl_Round_Button(228, 163, 144, 22, _("Two scheme 5")); btn_scheme_7->type(102); btn_scheme_7->down_box(FL_ROUND_DOWN_BOX); btn_scheme_7->callback((Fl_Callback*)cb_btn_scheme_7); } // Fl_Round_Button* btn_scheme_7 - { btn_scheme_9 = new Fl_Round_Button(228, 205, 144, 22, _("Two scheme 7")); + { btn_scheme_9 = new Fl_Round_Button(228, 188, 144, 22, _("Two scheme 7")); btn_scheme_9->type(102); btn_scheme_9->down_box(FL_ROUND_DOWN_BOX); btn_scheme_9->callback((Fl_Callback*)cb_btn_scheme_9); } // Fl_Round_Button* btn_scheme_9 - { btn_scheme_11 = new Fl_Round_Button(228, 230, 144, 22, _("Two scheme 9")); + { btn_scheme_11 = new Fl_Round_Button(228, 213, 144, 22, _("Two scheme 9")); btn_scheme_11->type(102); btn_scheme_11->down_box(FL_ROUND_DOWN_BOX); btn_scheme_11->callback((Fl_Callback*)cb_btn_scheme_11); } // Fl_Round_Button* btn_scheme_11 - { btn_scheme_4 = new Fl_Round_Button(396, 130, 144, 22, _("Two scheme 2")); + { btn_scheme_4 = new Fl_Round_Button(396, 113, 144, 22, _("Two scheme 2")); btn_scheme_4->type(102); btn_scheme_4->down_box(FL_ROUND_DOWN_BOX); btn_scheme_4->callback((Fl_Callback*)cb_btn_scheme_4); } // Fl_Round_Button* btn_scheme_4 - { btn_scheme_6 = new Fl_Round_Button(396, 155, 144, 22, _("Two scheme 4")); + { btn_scheme_6 = new Fl_Round_Button(396, 138, 144, 22, _("Two scheme 4")); btn_scheme_6->type(102); btn_scheme_6->down_box(FL_ROUND_DOWN_BOX); btn_scheme_6->callback((Fl_Callback*)cb_btn_scheme_6); } // Fl_Round_Button* btn_scheme_6 - { btn_scheme_8 = new Fl_Round_Button(396, 180, 144, 22, _("Two scheme 6")); + { btn_scheme_8 = new Fl_Round_Button(396, 163, 144, 22, _("Two scheme 6")); btn_scheme_8->type(102); btn_scheme_8->down_box(FL_ROUND_DOWN_BOX); btn_scheme_8->callback((Fl_Callback*)cb_btn_scheme_8); } // Fl_Round_Button* btn_scheme_8 - { btn_scheme_10 = new Fl_Round_Button(396, 205, 144, 22, _("Two scheme 8")); + { btn_scheme_10 = new Fl_Round_Button(396, 188, 144, 22, _("Two scheme 8")); btn_scheme_10->type(102); btn_scheme_10->down_box(FL_ROUND_DOWN_BOX); btn_scheme_10->callback((Fl_Callback*)cb_btn_scheme_10); } // Fl_Round_Button* btn_scheme_10 - { btn_scheme_12 = new Fl_Round_Button(396, 230, 144, 22, _("Two scheme 10")); + { btn_scheme_12 = new Fl_Round_Button(396, 213, 144, 22, _("Two scheme 10")); btn_scheme_12->type(102); btn_scheme_12->down_box(FL_ROUND_DOWN_BOX); btn_scheme_12->callback((Fl_Callback*)cb_btn_scheme_12); } // Fl_Round_Button* btn_scheme_12 o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(52, 299, 496, 76); + { Fl_Group* o = new Fl_Group(5, 275, 590, 55); o->box(FL_ENGRAVED_FRAME); - { Fl_Check_Button* o = btnUseLastMacro = new Fl_Check_Button(62, 305, 277, 20, _("Load last used macro file on startup")); + { Fl_Check_Button* o = btnUseLastMacro = new Fl_Check_Button(62, 280, 277, 20, _("Load last used macro file at start")); btnUseLastMacro->tooltip(_("ON - use last set of macros\nOFF - use default set")); btnUseLastMacro->down_box(FL_DOWN_BOX); btnUseLastMacro->callback((Fl_Callback*)cb_btnUseLastMacro); o->value(progdefaults.UseLastMacro); } // Fl_Check_Button* btnUseLastMacro - { Fl_Check_Button* o = btnDisplayMacroFilename = new Fl_Check_Button(62, 327, 277, 20, _("Display macro filename on startup")); + { Fl_Check_Button* o = btnDisplayMacroFilename = new Fl_Check_Button(62, 302, 277, 20, _("Display macro filename at start")); btnDisplayMacroFilename->tooltip(_("The filename is written to the RX text area")); btnDisplayMacroFilename->down_box(FL_DOWN_BOX); btnDisplayMacroFilename->callback((Fl_Callback*)cb_btnDisplayMacroFilename); o->value(progdefaults.DisplayMacroFilename); } // Fl_Check_Button* btnDisplayMacroFilename - { Fl_Check_Button* o = btn_save_macros_on_exit = new Fl_Check_Button(62, 349, 305, 20, _("Prompt to save macro file when closing")); + { Fl_Check_Button* o = btn_save_macros_on_exit = new Fl_Check_Button(345, 280, 216, 20, _("Prompt to save macro file")); btn_save_macros_on_exit->tooltip(_("Write current macro set on program exit")); btn_save_macros_on_exit->down_box(FL_DOWN_BOX); btn_save_macros_on_exit->callback((Fl_Callback*)cb_btn_save_macros_on_exit); @@ -6834,6 +6840,17 @@ ab and newline are automatically included.")); } // Fl_Check_Button* btn_save_macros_on_exit o->end(); } // Fl_Group* o + { Fl_Group* o = new Fl_Group(5, 330, 590, 55, _("Change takes effect after program restart")); + o->box(FL_ENGRAVED_FRAME); + o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); + { Fl_Check_Button* o = btn_dockable_macros = new Fl_Check_Button(152, 353, 296, 20, _("Disable dockable macro bar")); + btn_dockable_macros->tooltip(_("Allow minimized main dialog height \n411 pixels with WF height = 100")); + btn_dockable_macros->down_box(FL_DOWN_BOX); + btn_dockable_macros->callback((Fl_Callback*)cb_btn_dockable_macros); + o->value(!progdefaults.dockable_macros); + } // Fl_Check_Button* btn_dockable_macros + o->end(); + } // Fl_Group* o tabMBars->end(); } // Fl_Group* tabMBars { tabWF_UI = new Fl_Group(0, 50, 600, 335, _("WF Ctrls")); @@ -6923,7 +6940,8 @@ ab and newline are automatically included.")); } // Fl_Group* tabWF_UI { tabColorsFonts = new Fl_Group(0, 50, 600, 335, _("Clrs/Fnts")); tabColorsFonts->tooltip(_("User Interface - Colors / Fonts")); - { tabsColors = new Fl_Tabs(0, 55, 600, 325); + tabColorsFonts->hide(); + { tabsColors = new Fl_Tabs(0, 55, 600, 330); { Fl_Group* o = new Fl_Group(0, 80, 600, 305, _("Rx/Tx")); o->hide(); { Fl_ListBox* o = listbox_charset_status = new Fl_ListBox(96, 90, 165, 24, _("Rx/Tx Character set")); @@ -7552,7 +7570,6 @@ i on a\ntouch screen device such as a tablet.")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 335, _("FFT Processing")); - o->hide(); { Fl_Group* o = new Fl_Group(55, 71, 490, 135); o->box(FL_ENGRAVED_FRAME); { Fl_Counter2* o = cntLowFreqCutoff = new Fl_Counter2(100, 89, 70, 22, _("Lower limit")); @@ -7688,6 +7705,7 @@ i on a\ntouch screen device such as a tablet.")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 600, 335, _("Mouse")); + o->hide(); { Fl_Group* o = new Fl_Group(55, 73, 490, 170); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnWaterfallHistoryDefault = new Fl_Check_Button(65, 87, 340, 20, _("Left or right click always replays audio history")); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index c6b74dee..f6a77deb 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -362,7 +362,7 @@ static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} xywh {900 170 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible } { Fl_Tabs tabsConfigure {open - xywh {0 0 600 385} color 50 selection_color 50 + xywh {0 0 600 390} color 50 selection_color 50 } { Fl_Group tabOperator { label Operator @@ -466,15 +466,15 @@ progdefaults.changed = true;} } } Fl_Group tabUI { - label UI - tooltip {User Interface} xywh {0 25 600 360} hide + label UI open + tooltip {User Interface} xywh {0 25 600 365} hide } { Fl_Tabs tabsUI {open - xywh {0 25 600 360} selection_color 50 + xywh {0 25 600 365} selection_color 50 } { Fl_Group tabBrowser { label Browser - tooltip {User Interface - Browser} xywh {0 50 600 335} hide + tooltip {User Interface - Browser} xywh {0 50 600 335} } { Fl_Group {} {open xywh {30 65 540 300} box ENGRAVED_FRAME @@ -936,7 +936,7 @@ progdefaults.changed = true;} } Fl_Group tabLogServer { label Log - tooltip {User Interface - Colors / Fonts} xywh {0 50 600 335} hide + tooltip {User Interface - Colors / Fonts} xywh {0 50 600 340} hide } { Fl_Tabs tabsLog {open xywh {0 55 600 335} @@ -1160,23 +1160,23 @@ progdefaults.changed = true;} } } Fl_Group tabMBars { - label Macros + label Macros open tooltip {User Interface - Macros} xywh {0 50 600 335} hide } { Fl_Group {} {open - xywh {52 263 496 35} box ENGRAVED_FRAME + xywh {5 240 590 35} box ENGRAVED_FRAME } { Fl_Check_Button btnMacroMouseWheel { label {Mouse wheel active on macro buttons} callback {progdefaults.macro_wheel = o->value(); progdefaults.changed = true;} - tooltip {enable mouse wheel control of macro bar} xywh {62 271 296 20} down_box DOWN_BOX + tooltip {enable mouse wheel control of macro bar} xywh {62 248 296 20} down_box DOWN_BOX code0 {o->value(progdefaults.macro_wheel);} } } Fl_Group {} { label {Number and position of macro bars} open - xywh {52 61 496 200} box ENGRAVED_FRAME align 21 + xywh {5 60 590 180} box ENGRAVED_FRAME align 21 } { Fl_Counter cnt_macro_height { label {Button Height} @@ -1184,7 +1184,7 @@ progdefaults.changed = true;} progdefaults.changed = true; set_macroLabels(); UI_select();} - tooltip {Height of macro bar} xywh {215 93 89 22} type Simple align 8 minimum 22 maximum 66 step 2 value 22 + tooltip {Height of macro bar} xywh {215 85 89 22} type Simple align 8 minimum 22 maximum 66 step 2 value 22 code0 {o->value(progdefaults.macro_height);} } Fl_Round_Button btn_scheme_0 { @@ -1194,7 +1194,7 @@ progdefaults.changed = true; set_macroLabels(); UI_select();} tooltip {Single macro bar below logging panel -variable height} xywh {61 130 144 22} type Radio down_box ROUND_DOWN_BOX +variable height} xywh {61 113 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_1 { label {One above waterfall} @@ -1202,7 +1202,7 @@ variable height} xywh {61 130 144 22} type Radio down_box ROUND_DOWN_BOX progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {61 155 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {61 138 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_2 { label {One below waterfall} @@ -1210,7 +1210,7 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {61 180 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {61 163 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_3 { label {Two scheme 1} @@ -1218,7 +1218,7 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {228 130 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {228 113 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_5 { label {Two scheme 3} @@ -1226,7 +1226,7 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {228 155 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {228 138 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_7 { label {Two scheme 5} @@ -1234,7 +1234,7 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {228 180 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {228 163 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_9 { label {Two scheme 7} @@ -1242,7 +1242,7 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {228 205 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {228 188 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_11 { label {Two scheme 9} @@ -1250,7 +1250,7 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {228 230 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {228 213 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_4 { label {Two scheme 2} @@ -1258,7 +1258,7 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {396 130 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {396 113 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_6 { label {Two scheme 4} @@ -1266,7 +1266,7 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {396 155 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {396 138 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_8 { label {Two scheme 6} @@ -1274,7 +1274,7 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {396 180 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {396 163 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_10 { label {Two scheme 8} @@ -1282,7 +1282,7 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {396 205 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {396 188 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_12 { label {Two scheme 10} @@ -1290,37 +1290,50 @@ UI_select();} progdefaults.changed = true; set_macroLabels(); UI_select();} - xywh {396 230 144 22} type Radio down_box ROUND_DOWN_BOX + xywh {396 213 144 22} type Radio down_box ROUND_DOWN_BOX } } Fl_Group {} {open - xywh {52 299 496 76} box ENGRAVED_FRAME + xywh {5 275 590 55} box ENGRAVED_FRAME } { Fl_Check_Button btnUseLastMacro { - label {Load last used macro file on startup} + label {Load last used macro file at start} callback {progdefaults.UseLastMacro = o->value(); update_main_title(); progdefaults.changed = true;} tooltip {ON - use last set of macros -OFF - use default set} xywh {62 305 277 20} down_box DOWN_BOX +OFF - use default set} xywh {62 280 277 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseLastMacro);} } Fl_Check_Button btnDisplayMacroFilename { - label {Display macro filename on startup} + label {Display macro filename at start} callback {progdefaults.DisplayMacroFilename = o->value(); progdefaults.changed = true;} - tooltip {The filename is written to the RX text area} xywh {62 327 277 20} down_box DOWN_BOX + tooltip {The filename is written to the RX text area} xywh {62 302 277 20} down_box DOWN_BOX code0 {o->value(progdefaults.DisplayMacroFilename);} } Fl_Check_Button btn_save_macros_on_exit { - label {Prompt to save macro file when closing} + label {Prompt to save macro file} callback {btn2_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true;} - tooltip {Write current macro set on program exit} xywh {62 349 305 20} down_box DOWN_BOX + tooltip {Write current macro set on program exit} xywh {345 280 216 20} down_box DOWN_BOX code0 {o->value(progdefaults.SaveMacros);} } } + Fl_Group {} { + label {Change takes effect after program restart} open + xywh {5 330 590 55} box ENGRAVED_FRAME align 17 + } { + Fl_Check_Button btn_dockable_macros { + label {Disable dockable macro bar} + callback {progdefaults.dockable_macros = !o->value(); +progdefaults.changed = true;} + tooltip {Allow minimized main dialog height +411 pixels with WF height = 100} xywh {152 353 296 20} down_box DOWN_BOX + code0 {o->value(!progdefaults.dockable_macros);} + } + } } Fl_Group tabWF_UI { label {WF Ctrls} @@ -1463,10 +1476,10 @@ WF_UI();} } Fl_Group tabColorsFonts { label {Clrs/Fnts} - tooltip {User Interface - Colors / Fonts} xywh {0 50 600 335} + tooltip {User Interface - Colors / Fonts} xywh {0 50 600 335} hide } { Fl_Tabs tabsColors {open - xywh {0 55 600 325} + xywh {0 55 600 330} } { Fl_Group {} { label {Rx/Tx} @@ -2812,7 +2825,7 @@ progdefaults.changed = true;} } Fl_Group {} { label {FFT Processing} open - xywh {0 50 600 335} hide + xywh {0 50 600 335} } { Fl_Group {} {open xywh {55 71 490 135} box ENGRAVED_FRAME @@ -2897,7 +2910,7 @@ progdefaults.changed = true;} } Fl_Group {} { label Mouse open - xywh {0 50 600 335} + xywh {0 50 600 335} hide } { Fl_Group {} {open xywh {55 73 490 170} box ENGRAVED_FRAME diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 8632104c..b9e8d3a2 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -195,6 +195,8 @@ #define LOG_CONNECT_SERVER _("Connect to server") +#define DOCKED_MACROS_LABEL _("View/Hide 48 macros") + // MAXIMUM allowable string lengths in log fields #define MAX_FREQ 14 #define MAX_TIME 4 @@ -1881,8 +1883,10 @@ void macro_cb(Fl_Widget *w, void *v) restoreFocus(5); } -void colorize_docked_macros(int i) +void colorize_dockable_macros(int i) { + if (!progdefaults.dockable_macros) return; + if (progdefaults.useGroupColors == true) { int k = i / 4; if (k == 0 || k == 3 || k == 6 || k == 9) @@ -1957,7 +1961,7 @@ void colorize_macros() { FL_LOCK_D(); for (int i = 0; i < NUMMACKEYS * NUMKEYROWS; i++) colorize_macro(i); - for (int i = 0; i < 48; i++) colorize_docked_macros(i); + for (int i = 0; i < 48; i++) colorize_dockable_macros(i); btnAltMacros1->labelsize(progdefaults.MacroBtnFontsize); btnAltMacros1->redraw_label(); btnAltMacros2->labelsize(progdefaults.MacroBtnFontsize); @@ -2702,9 +2706,11 @@ void set_macroLabels() btnMacro[i]->redraw_label(); } } - for (int i = 0; i < 48; i++) { - btnDockMacro[i]->label(macros.name[i].c_str()); - btnDockMacro[i]->redraw_label(); + if (progdefaults.dockable_macros) { + for (int i = 0; i < 48; i++) { + btnDockMacro[i]->label(macros.name[i].c_str()); + btnDockMacro[i]->redraw_label(); + } } } @@ -3724,7 +3730,7 @@ int UI_position_macros(int x, int y1, int w, int HTh) // docked macro's - if (progStatus.tbar_is_docked) { + if (progdefaults.dockable_macros && progStatus.tbar_is_docked) { resize_macroframe2(x,y1,w,mh2); macroFrame2->hide(); btnAltMacros2->deactivate(); @@ -4134,6 +4140,8 @@ UI_return: void cb_docked(Fl_Widget*, void*) { + if (!progdefaults.dockable_macros) return; + UI_select(); } @@ -4222,6 +4230,8 @@ void cb_menu_make_default_scripts(Fl_Widget*, void*) void cb_view_hide_macros(Fl_Widget*, void*) { + if (!progdefaults.dockable_macros) return; + progStatus.tile_y = progdefaults.rxtx_swap ? TransmitText->h() : ReceiveText->h(); progStatus.tile_y_ratio = 1.0 * progStatus.tile_y / text_group->h(); @@ -4502,7 +4512,7 @@ _FL_MULTI_LABEL, 0, 14, 0}, { VIEW_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("View/Hide Channels")), 'v', (Fl_Callback*)cb_view_hide_channels, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, -{ icons::make_icon_label(_("View/Hide 48 macros")), 0, (Fl_Callback*)cb_view_hide_macros, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, +{ icons::make_icon_label(DOCKED_MACROS_LABEL), 0, (Fl_Callback*)cb_view_hide_macros, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Floating scope"), utilities_system_monitor_icon), 'd', (Fl_Callback*)cb_mnuDigiscope, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(MFSK_IMAGE_MLABEL, image_icon), 'm', (Fl_Callback*)cb_mnuPicViewer, 0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, @@ -5666,22 +5676,24 @@ void create_fl_digi_main_primary() { int fixed_height = Hmenu + - TB_HEIGHT + Hqsoframe + - Hmacros*3 + + Hmacros*2 + Hwfall + Hstatus + 16; // inter group spacings + if (progdefaults.dockable_macros) fixed_height += TB_HEIGHT; main_hmin = minhtext + mintxtext + 5 + fixed_height; - if (progStatus.mainH < main_hmin) progStatus.mainH = main_hmin; + if (progStatus.mainH < main_hmin) { + progStatus.mainH = main_hmin; + } int Htext = main_hmin - fixed_height; if (progStatus.tile_y > Htext) progStatus.tile_y = Htext / 2; - fl_digi_main = new dropwin(progStatus.mainW, main_hmin);//progStatus.mainH); + fl_digi_main = new dropwin(progStatus.mainW, main_hmin); mnuFrame = new Fl_Group(0,0,progStatus.mainW, Hmenu); mnu = new Fl_Menu_Bar(pad, 0, progStatus.mainW - 325 - pad, Hmenu); @@ -5737,24 +5749,33 @@ void create_fl_digi_main_primary() { mnuFrame->end(); // add draggable toolbar with 4 rows of 12 macros each - dock = new dockgroup(pad, mnu->h() + 2, fl_digi_main->w() - 2*pad, TB_HEIGHT); - dock->box(FL_THIN_DOWN_BOX); - dock->end(); - dock->set_window(fl_digi_main); + if (progdefaults.dockable_macros) { + dock = new dockgroup(pad, mnu->h() + 2, fl_digi_main->w() - Hmenu - 2*pad, TB_HEIGHT); + dock->box(FL_THIN_DOWN_BOX); + dock->end(); + dock->set_window(fl_digi_main); - // Create a toolgroup already docked in this dock - add_docked(dock); - dock->redraw(); +// Create a toolgroup already docked in this dock + add_docked(dock); + dock->redraw(); - // Record in the dropwin which dock to use - fl_digi_main->set_dock(dock); +// Record in the dropwin which dock to use + fl_digi_main->set_dock(dock); - fl_digi_main->begin(); + fl_digi_main->begin(); // docked window workspace - fl_digi_main->workspace = new Fl_Group( - pad, dock->y() + dock->h(), - dock->w(), fl_digi_main->h() - dock->h() - dock->y() - pad); + fl_digi_main->workspace = new Fl_Group( + pad, dock->y() + dock->h(), + dock->w(), fl_digi_main->h() - dock->h() - dock->y() - 2 * pad); + } else { + fl_digi_main->begin(); + fl_digi_main->workspace = new Fl_Group( + pad, mnu->h() + 2, + fl_digi_main->w() - 2*pad, fl_digi_main->h() - Hmenu - 2 * pad); + getMenuItem(DOCKED_MACROS_LABEL)->hide(); + + } // reset the message dialog font fl_message_font(FL_HELVETICA, FL_NORMAL_SIZE); @@ -7214,7 +7235,8 @@ void create_fl_digi_main_primary() { fl_digi_main->end(); fl_digi_main->resizable(fl_digi_main->workspace); - dock->callback(cb_docked); + if (progdefaults.dockable_macros) + dock->callback(cb_docked); fl_digi_main->callback(cb_wMain); @@ -7256,12 +7278,15 @@ void create_fl_digi_main_primary() { toggle_smeter(); - if (progStatus.tbar_is_docked) // do not change interface state + if (progdefaults.dockable_macros) { + if (progStatus.tbar_is_docked) // do not change interface state + UI_select(); + else { + progStatus.tbar_is_docked = true; // for tbar toggle + cb_view_hide_macros((Fl_Widget *)0, (void *)0); + } + } else UI_select(); - else { - progStatus.tbar_is_docked = true; // for tbar toggle - cb_view_hide_macros((Fl_Widget *)0, (void *)0); - } wf->UI_select(progStatus.WF_UI); diff --git a/src/include/confdialog.h b/src/include/confdialog.h index ceffbd1a..dbf5f720 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -143,6 +143,7 @@ extern Fl_Round_Button *btn_scheme_12; extern Fl_Check_Button *btnUseLastMacro; extern Fl_Check_Button *btnDisplayMacroFilename; extern Fl_Check_Button *btn_save_macros_on_exit; +extern Fl_Check_Button *btn_dockable_macros; extern Fl_Group *tabWF_UI; extern Fl_Check_Button *btnWF_UIrev; extern Fl_Check_Button *btnWF_UIx1; diff --git a/src/include/configuration.h b/src/include/configuration.h index 321171db..da64df78 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -1902,7 +1902,10 @@ 16) \ ELEM_(bool, psk8DCDShortFlag, "PSK8DCDSHORTFLAG", \ "Flag: Change DCD pre-ample length", \ - false) + false) \ + ELEM_(bool, dockable_macros, "DOCKABLE_MACROS", \ + "Allow dockable macros", \ + true) // declare the struct diff --git a/src/misc/macroedit.cxx b/src/misc/macroedit.cxx index 497f6ca4..23573f31 100644 --- a/src/misc/macroedit.cxx +++ b/src/misc/macroedit.cxx @@ -320,9 +320,10 @@ void update_macro_button(int iMacro, const char *text, const char *name) btnMacro[iMacro % NUMMACKEYS]->label( macros.name[iMacro].c_str() ); btnMacro[iMacro % NUMMACKEYS]->redraw_label(); } - btnDockMacro[iMacro]->label(macros.name[iMacro].c_str()); - btnDockMacro[iMacro]->redraw_label(); - + if (progdefaults.dockable_macros) { + btnDockMacro[iMacro]->label(macros.name[iMacro].c_str()); + btnDockMacro[iMacro]->redraw_label(); + } macros.changed = true; } diff --git a/src/misc/status.cxx b/src/misc/status.cxx index 93509619..c89ff3cc 100644 --- a/src/misc/status.cxx +++ b/src/misc/status.cxx @@ -570,7 +570,7 @@ void status::loadLastState() if (mainW > Fl::w()) mainW = Fl::w(); spref.get("main_h", mainH, mainH); - if (mainH < HMIN) mainH = HMIN; +// if (mainH < HMIN) mainH = HMIN; if (mainH > Fl::w()) mainH = Fl::h(); spref.get("wf_ui", i, WF_UI); WF_UI = i; From b4b8df4ac96b6e0cabf7b93843092f2966bbf0fe Mon Sep 17 00:00:00 2001 From: David Freese Date: Sat, 23 Apr 2016 08:36:27 -0500 Subject: [PATCH 107/138] ASCII ctl chars * modify CTL char display to ignore chars * pass unprocessed data to xmlrpc call rx_get_data --- src/dialogs/fl_digi.cxx | 6 ++++-- src/misc/ascii.cxx | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index b9e8d3a2..a383156e 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -8181,10 +8181,10 @@ static void rx_parser(const unsigned char data, int style) if (data == '\n' && lastdata == '\r'); else if (data == '\r') { - add_rx_char('\n'); +// add_rx_char('\n'); display_rx_data('\n', style); } else { - add_rx_char(data); +// add_rx_char(data); display_rx_data(data, style); } @@ -8219,6 +8219,8 @@ static void put_rx_char_flmain(unsigned int data, int style) // select a byte translation table trx_mode mode = active_modem->get_mode(); + add_rx_char(data & 0xFF); + if (mailclient || mailserver) rx_chd.rx((unsigned char *)ascii2[data & 0xFF]); diff --git a/src/misc/ascii.cxx b/src/misc/ascii.cxx index 24d4a578..36eda487 100644 --- a/src/misc/ascii.cxx +++ b/src/misc/ascii.cxx @@ -117,7 +117,7 @@ const char *ascii2[256] = { const char *ascii3[256] = { "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", + "", "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", From 5b367fb63893c95b7dbdc090b8243ac53f4b8019 Mon Sep 17 00:00:00 2001 From: David Freese Date: Sat, 30 Apr 2016 08:45:45 -0500 Subject: [PATCH 108/138] 4bars * Corrected width setting on dockable control --- src/dialogs/fl_digi.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index a383156e..5dda543e 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -5750,7 +5750,7 @@ void create_fl_digi_main_primary() { // add draggable toolbar with 4 rows of 12 macros each if (progdefaults.dockable_macros) { - dock = new dockgroup(pad, mnu->h() + 2, fl_digi_main->w() - Hmenu - 2*pad, TB_HEIGHT); + dock = new dockgroup(pad, mnu->h() + 2, fl_digi_main->w() - 2*pad, TB_HEIGHT); dock->box(FL_THIN_DOWN_BOX); dock->end(); dock->set_window(fl_digi_main); From aa6592c59b69f5c64a6e03c112d4adfee255e909 Mon Sep 17 00:00:00 2001 From: David Freese Date: Tue, 3 May 2016 08:25:32 -0500 Subject: [PATCH 109/138] flmsg interface * Added xmlrpc procedures to specifically to allow flmsg i/o using ARQ protocol. - main.flmsg_online main.flmsg_available main.flmsg_transfer --- fldigi_doxygen/user_src_docs/ConfigMisc.txt | 6 +- src/dialogs/confdialog.cxx | 37 +- src/dialogs/confdialog.fl | 31 +- src/include/confdialog.h | 1 + src/include/configuration.h | 3 + src/include/xmlrpc.h | 4 + src/logger/rx_extract.cxx | 6 + src/misc/xmlrpc.cxx | 402 ++++++++++++-------- 8 files changed, 311 insertions(+), 179 deletions(-) diff --git a/fldigi_doxygen/user_src_docs/ConfigMisc.txt b/fldigi_doxygen/user_src_docs/ConfigMisc.txt index a45c3409..b4f82f6e 100644 --- a/fldigi_doxygen/user_src_docs/ConfigMisc.txt +++ b/fldigi_doxygen/user_src_docs/ConfigMisc.txt @@ -107,7 +107,7 @@ over HF and VHF radio.Additional information on flarq is available here: The reception of a flwrap and flmsg files can be automated by selecting -the "Enable detection & extraction" option. The wrap program +the "Enable detection" option. The wrap program can then be used to test for validity and data extraction at some later time. fldigi can recognize flmsg data files and automatically open the flmsg program with the newly received data stream. It @@ -115,6 +115,10 @@ can also transfer the data stream to flmsg and instruct flmsg to save the data file, unwrap and decode it, display the data in a fully formatted html page and then exit. Pressing "Locate flmsg" performs differently on the different OS that are supported. + +The ability to transfer incoming flmsg data streams directly to an executing +flmsg was introduced with flmsg 3.0. Check that option if you are using flmsg +3.0 or greater.