made ok-cancel-apply order consistent across dialogs, converted short varicode to...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 12 Jun 2014 03:35:45 +0000 (03:35 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 12 Jun 2014 03:35:45 +0000 (03:35 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1646 01035d8c-6547-0410-b346-abe4f91aad63

fdmdv2/src/dlg_audiooptions.cpp
fdmdv2/src/dlg_filter.cpp
fdmdv2/src/dlg_options.cpp
fdmdv2/src/dlg_options.h
fdmdv2/src/fdmdv2_main.cpp
fdmdv2/src/fdmdv2_main.h
fdmdv2/src/topFrame.cpp

index 994cc51ce692ed2489ff7967781656a1e4bb5531..1c312ef78cf623a93045fe822c46a260f09b15da 100644 (file)
@@ -282,12 +282,16 @@ AudioOptsDialog::AudioOptsDialog(wxWindow* parent, wxWindowID id, const wxString
     bSizer6->Add(m_btnRefresh, 0, wxALIGN_CENTER|wxALL, 2);
 
     m_sdbSizer1 = new wxStdDialogButtonSizer();
+
     m_sdbSizer1OK = new wxButton(this, wxID_OK);
     m_sdbSizer1->AddButton(m_sdbSizer1OK);
-    m_sdbSizer1Apply = new wxButton(this, wxID_APPLY);
-    m_sdbSizer1->AddButton(m_sdbSizer1Apply);
+
     m_sdbSizer1Cancel = new wxButton(this, wxID_CANCEL);
     m_sdbSizer1->AddButton(m_sdbSizer1Cancel);
+
+    m_sdbSizer1Apply = new wxButton(this, wxID_APPLY);
+    m_sdbSizer1->AddButton(m_sdbSizer1Apply);
+
     m_sdbSizer1->Realize();
 
     bSizer6->Add(m_sdbSizer1, 1, wxALIGN_CENTER_VERTICAL, 2);
index 38913099ffcb74f0b54f5d008ae4902209e673c0..879373ddc2375de8de5b0b5c8340e992613bde05 100644 (file)
@@ -140,14 +140,16 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool
     m_SpkOutFreqRespPlot = new PlotSpectrum((wxFrame*)m_auiNotebook, m_SpkOutMagdB, F_MAG_N, FILTER_MIN_MAG_DB, FILTER_MAX_MAG_DB);
     m_auiNotebook->AddPage(m_SpkOutFreqRespPlot, _("Speaker Out Equaliser"));
 
-    // Default - Cancel - OK   Buttons at the bottom --------------------------
+    //  OK - Cancel buttons at the bottom --------------------------
 
     wxBoxSizer* bSizer31 = new wxBoxSizer(wxHORIZONTAL);
-    m_sdbSizer5Cancel = new wxButton(this, wxID_CANCEL);
-    bSizer31->Add(m_sdbSizer5Cancel, 0, wxALL, 2);
+
     m_sdbSizer5OK = new wxButton(this, wxID_OK);
     bSizer31->Add(m_sdbSizer5OK, 0, wxALL, 2);
 
+    m_sdbSizer5Cancel = new wxButton(this, wxID_CANCEL);
+    bSizer31->Add(m_sdbSizer5Cancel, 0, wxALL, 2);
+
     bSizer30->Add(bSizer31, 0, wxALIGN_RIGHT|wxALL, 0);
 
     this->SetSizer(bSizer30);
index 51d9ed4f6ce4845abd1ca71d4d87b1ca58211e47..192e2687b9e59c2dd52604b1f0e056c787676ada 100644 (file)
@@ -121,15 +121,20 @@ OptionsDlg::OptionsDlg(wxWindow* parent, wxWindowID id, const wxString& title, c
     bSizer30->Add(sbSizer_udp,0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 3);
 
     //------------------------------
-    // Cancel - OK Buttons 
+    // OK - Cancel - Apply Buttons 
     //------------------------------
 
     wxBoxSizer* bSizer31 = new wxBoxSizer(wxHORIZONTAL);
-    m_sdbSizer5Cancel = new wxButton(this, wxID_CANCEL);
-    bSizer31->Add(m_sdbSizer5Cancel, 0, wxALL, 2);
+
     m_sdbSizer5OK = new wxButton(this, wxID_OK);
     bSizer31->Add(m_sdbSizer5OK, 0, wxALL, 2);
 
+    m_sdbSizer5Cancel = new wxButton(this, wxID_CANCEL);
+    bSizer31->Add(m_sdbSizer5Cancel, 0, wxALL, 2);
+
+    m_sdbSizer5Apply = new wxButton(this, wxID_APPLY);
+    bSizer31->Add(m_sdbSizer5Apply, 0, wxALL, 2);
+
     bSizer30->Add(bSizer31, 0, wxALIGN_RIGHT|wxALL, 0);
 
     this->SetSizer(bSizer30);
@@ -141,8 +146,9 @@ OptionsDlg::OptionsDlg(wxWindow* parent, wxWindowID id, const wxString& title, c
 
     this->Connect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(OptionsDlg::OnInitDialog));
 
-    m_sdbSizer5Cancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnCancel), NULL, this);
     m_sdbSizer5OK->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnOK), NULL, this);
+    m_sdbSizer5Cancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnCancel), NULL, this);
+    m_sdbSizer5Apply->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnApply), NULL, this);
 
     event_in_serial = 0;
     event_out_serial = 0;
@@ -157,8 +163,9 @@ OptionsDlg::~OptionsDlg()
 
     this->Disconnect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(OptionsDlg::OnInitDialog));
 
-    m_sdbSizer5Cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnCancel), NULL, this);
     m_sdbSizer5OK->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnOK), NULL, this);
+    m_sdbSizer5Cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnCancel), NULL, this);
+    m_sdbSizer5Apply->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnApply), NULL, this);
 }
 
 
@@ -193,6 +200,15 @@ void OptionsDlg::ExchangeData(int inout, bool storePersistent)
         wxGetApp().m_testFrames    = m_ckboxTestFrame->GetValue();
 
         wxGetApp().m_events        = m_ckbox_events->GetValue();
+
+        // make sure regexp lists are terminated by a \n
+
+        if (m_txt_events_regexp_match->GetValue().Last() != '\n') {
+            m_txt_events_regexp_match->SetValue(m_txt_events_regexp_match->GetValue()+'\n');
+        }
+        if (m_txt_events_regexp_replace->GetValue().Last() != '\n') {
+            m_txt_events_regexp_replace->SetValue(m_txt_events_regexp_replace->GetValue()+'\n');
+        }
         wxGetApp().m_events_regexp_match = m_txt_events_regexp_match->GetValue();
         wxGetApp().m_events_regexp_replace = m_txt_events_regexp_replace->GetValue();
  
@@ -223,31 +239,30 @@ void OptionsDlg::ExchangeData(int inout, bool storePersistent)
 }
 
 //-------------------------------------------------------------------------
-// OnCancel()
+// OnOK()
 //-------------------------------------------------------------------------
-void OptionsDlg::OnCancel(wxCommandEvent& event)
+void OptionsDlg::OnOK(wxCommandEvent& event)
 {
-    //this->EndModal(wxID_CANCEL);
+    ExchangeData(EXCHANGE_DATA_OUT, true);
+    //this->EndModal(wxID_OK);
     this->Show(false);
 }
 
 //-------------------------------------------------------------------------
-// OnOK()
+// OnCancel()
 //-------------------------------------------------------------------------
-void OptionsDlg::OnOK(wxCommandEvent& event)
+void OptionsDlg::OnCancel(wxCommandEvent& event)
 {
-    ExchangeData(EXCHANGE_DATA_OUT, true);
-    //this->EndModal(wxID_OK);
+    //this->EndModal(wxID_CANCEL);
     this->Show(false);
 }
 
 //-------------------------------------------------------------------------
-// OnClose()
+// OnApply()
 //-------------------------------------------------------------------------
-void OptionsDlg::OnClose(wxCloseEvent& event)
+void OptionsDlg::OnApply(wxCommandEvent& event)
 {
-    //this->EndModal(wxID_OK);
-    this->Show(false);
+    ExchangeData(EXCHANGE_DATA_OUT, true);
 }
 
 //-------------------------------------------------------------------------
index 45d6235116178ba9316a4aa8ae1658fb897b094b..ff5d708d05a8117d034a3bd73c464e7ad64acbe3 100644 (file)
@@ -44,8 +44,9 @@ class OptionsDlg : public wxDialog
 
     protected:
         // Handlers for events.
-        void    OnCancel(wxCommandEvent& event);
         void    OnOK(wxCommandEvent& event);
+        void    OnCancel(wxCommandEvent& event);
+        void    OnApply(wxCommandEvent& event);
         void    OnClose(wxCloseEvent& event);
         void    OnInitDialog(wxInitDialogEvent& event);
  
@@ -66,6 +67,7 @@ class OptionsDlg : public wxDialog
 
         wxButton*     m_sdbSizer5OK;
         wxButton*     m_sdbSizer5Cancel;
+        wxButton*     m_sdbSizer5Apply;
 
         unsigned int  event_in_serial, event_out_serial;
 
index da98a433f46b2155fcf7b148707168db15d3961c..9c1133a61ac3ad4ffcf1f468d5e5d3a75afcd0b4 100644 (file)
@@ -375,6 +375,14 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)
     wxGetApp().m_events_regexp_match = pConfig->Read("/Events/regexp_match", wxT("s=(.*)"));
     wxGetApp().m_events_regexp_replace = pConfig->Read("/Events/regexp_replace", 
                                                        wxT("curl http://qso.freedv.org/cgi-bin/onspot.cgi?s=\\1"));
+    // make sure regexp lists are terminated by a \n
+
+    if (wxGetApp().m_events_regexp_match.Last() != '\n') {
+        wxGetApp().m_events_regexp_match = wxGetApp().m_events_regexp_match+'\n';
+    }
+    if (wxGetApp().m_events_regexp_replace.Last() != '\n') {
+        wxGetApp().m_events_regexp_replace = wxGetApp().m_events_regexp_replace+'\n';
+    }
 
     wxGetApp().m_udp_enable = (float)pConfig->Read(wxT("/UDP/enable"), f);
     wxGetApp().m_udp_port = (float)pConfig->Read(wxT("/UDP/port"), 3000);
@@ -466,9 +474,7 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)
     // Start UDP listener thread
 
     m_UDPThread = NULL;
-    if (wxGetApp().m_udp_enable) {
-        startUDPThread(wxGetApp().m_udp_port);
-    }
+    startUDPThread();
 
     optionsDlg = new OptionsDlg(NULL);
     m_schedule_restore = false;
@@ -970,9 +976,12 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
             wxString s;
             if (ret && (checksum_tx == checksum_rx)) {
                 m_callsign[strlen(m_callsign)-2] = 0;
-                s.Printf("rx_txtmsg %s", m_callsign);
+                s.Printf("%s", m_callsign);
                 m_txtCtrlCallSign->SetValue(s);
-                processTxtEvent(m_callsign);
+
+                char s1[MAX_CALLSIGN];
+                sprintf(s1,"rx_txtmsg %s", m_callsign);
+                processTxtEvent(s1);
 
                 m_checksumGood++;
                 s.Printf("%d", m_checksumGood);
@@ -1045,10 +1054,11 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
         delete error_pattern;
     }
 
-    // command from UDP thread best processed in main thread
+    // command from UDP thread that is best processed in main thread to avoid seg faults
 
     if (m_schedule_restore) {
-        Restore();
+        if (IsIconized())
+            Restore();
         m_schedule_restore = false;
     }
 }
@@ -1314,6 +1324,9 @@ void MainFrame::OnCallSignReset(wxCommandEvent& event)
     wxString s;
     s.Printf("%s", m_callsign);
     m_txtCtrlCallSign->SetValue(s);
+    m_checksumGood = m_checksumBad = 0;
+    m_txtChecksumGood->SetLabel(_("0"));
+    m_txtChecksumBad->SetLabel(_("0"));
 }
 
 void MainFrame::OnBerReset(wxCommandEvent& event)
@@ -1712,16 +1725,6 @@ void MainFrame::OnToolsOptions(wxCommandEvent& event)
     m_modal=true;
     optionsDlg->Show();
     m_modal=false;
-
-    // start/stop UDP thread
-
-    if (!wxGetApp().m_udp_enable) {
-        stopUDPThread();
-    }
-   
-    if (wxGetApp().m_udp_enable && (m_UDPThread == NULL)) {
-        startUDPThread(wxGetApp().m_udp_port);
-    }
 }
 
 //-------------------------------------------------------------------------
@@ -2580,7 +2583,7 @@ void MainFrame::processTxtEvent(char event[]) {
             wxString regexp_replace = regexp_replace_list.SubString(0, replace_end-1);
             //printf("match: %s replace: %s\n", (const char *)regexp_match.c_str(), (const char *)regexp_replace.c_str());
             wxRegEx re(regexp_match);
-            printf(" checking for match against: %s\n", (const char *)regexp_match.c_str());
+            printf("  checking for match against: %s\n", (const char *)regexp_match.c_str());
 
             // if we found a match, lets run the replace regexp and issue the system command
 
@@ -2594,21 +2597,12 @@ void MainFrame::processTxtEvent(char event[]) {
                 if (wxGetApp().m_events)
                     enableSystem = true;
             
-                // If options dialog is up current value of events checkbox overrides wxGetApp().m_events
-
-                if (optionsDlg != NULL)  {
-                    if (optionsDlg->enableEventsChecked())
-                        enableSystem = true;
-                    else
-                        enableSystem = false;
-                }
-
                 const char *event_out = event_str_rep.ToUTF8();
                 wxString event_out_with_return_code;
 
                 if (enableSystem) {
-                    int ret = wxExecute(event_str_rep);
-                    event_out_with_return_code.Printf(_T("%s -> process ID %d"), event_out, ret);
+                    int ret = wxShell(event_str_rep);
+                    event_out_with_return_code.Printf(_T("%s -> returned %d"), event_out, ret);
                 }
                 else
                     event_out_with_return_code.Printf(_T("%s)"), event_out);
@@ -3341,10 +3335,13 @@ void per_frame_rx_processing(
                     //printf("data_flag_index: %d\n", data_flag_index);
                     assert(data_flag_index != -1); // not supported for all rates
 
-                    short abit = codec_bits[data_flag_index];
+                    short abit[2];
+                    abit[0] = codec_bits[data_flag_index];
+                    abit[1] = codec_bits[bits_per_codec_frame+11]; // use spare bit, note not FEC protected
                     char  ascii_out;
 
-                    int n_ascii = varicode_decode(&g_varicode_dec_states, &ascii_out, &abit, 1, 1);
+                    //printf("rx bits %d %d %d\n", abit[0], abit[1], bits_per_codec_frame+11);
+                    int n_ascii = varicode_decode(&g_varicode_dec_states, &ascii_out, abit, 1, wxGetApp().m_textEncoding);
                     assert((n_ascii == 0) || (n_ascii == 1));
                     if (n_ascii) {
                         short ashort = ascii_out;
@@ -3399,7 +3396,7 @@ void per_frame_tx_processing(
     COMP           tx_fdm_offset[2*FDMDV_NOM_SAMPLES_PER_FRAME];
     int            sync_bit;
     int            i, j, bit, byte, data_flag_index;
-    short          abit;
+    short          abit[2];
     int            bits_per_fdmdv_frame, bits_per_codec_frame, bytes_per_codec_frame;
 
     bits_per_fdmdv_frame = fdmdv_bits_per_frame(g_pFDMDV);
@@ -3431,11 +3428,16 @@ void per_frame_tx_processing(
     data_flag_index = codec2_get_spare_bit_index(c2);
     assert(data_flag_index != -1); // not supported for all rates
 
-    if (fifo_read(g_txDataInFifo, &abit, 1) == 0)
-        bits[data_flag_index] = abit;
+    abit[0] = abit[1] = 0;
+    if (fifo_read(g_txDataInFifo, abit, wxGetApp().m_textEncoding) == 0) {
+        bits[data_flag_index] = abit[0];
+        bits[bits_per_codec_frame+11] = abit[1];  // spare bit that was unused in 1600 mode
+                                                  // note fast varicode must be sent two bits at a time 
+    }
     else {
         bits[data_flag_index] = 0;
-        //printf("tx fifle empty - sending a 0!");
+        bits[bits_per_codec_frame+11] = 0; 
+        printf("tx fifo empty - sending a 00!\n");
     }
 
     /* add FEC  ---------------------------------------*/
@@ -3512,8 +3514,6 @@ void per_frame_tx_processing(
         for(j=0,i=bits_per_codec_frame; i<bits_per_codec_frame+11; i++,j++) {
             bits[i] = (codeword1 >> (10-j)) & 0x1;
         }
-
-        bits[i] = 0; /* spare bit */
     }
 
 
@@ -3752,10 +3752,8 @@ int MainFrame::PollUDP(void)
     return n;
 }
 
-void MainFrame::startUDPThread(int port) {
+void MainFrame::startUDPThread(void) {
     printf("starting UDP thread!\n");
-    m_udp_addr.Service(port);
-    m_udp_sock = new wxDatagramSocket(m_udp_addr, wxSOCKET_NOWAIT);
     m_UDPThread = new UDPThread;
     m_UDPThread->mf = this;
     if (m_UDPThread->Create() != wxTHREAD_NO_ERROR ) {
@@ -3764,7 +3762,6 @@ void MainFrame::startUDPThread(int port) {
     if (m_UDPThread->Run() != wxTHREAD_NO_ERROR ) {
         wxLogError(wxT("Can't start thread!"));
         delete m_UDPThread;
-        delete m_udp_sock;    
     }
 }
 
@@ -3773,8 +3770,27 @@ void MainFrame::stopUDPThread(void) {
     if ((m_UDPThread != NULL) && m_UDPThread->m_run) {
         m_UDPThread->m_run = 0;
         m_UDPThread->Wait();
-        delete m_UDPThread;
-        delete m_udp_sock;
         m_UDPThread = NULL;
     }
 }
+
+void *UDPThread::Entry() {
+    printf("UDP thread started!\n");
+    while (m_run) {
+        if (wxGetApp().m_udp_enable) {
+            printf("m_udp_enable\n");
+            mf->m_udp_addr.Service(wxGetApp().m_udp_port);
+            mf->m_udp_sock = new wxDatagramSocket(mf->m_udp_addr, wxSOCKET_NOWAIT);
+
+            while (m_run && wxGetApp().m_udp_enable) {
+                if (mf->PollUDP() == 0) {
+                    wxThread::Sleep(20);
+                }
+            }
+
+            delete mf->m_udp_sock;
+        }
+        wxThread::Sleep(20);
+    }
+    return NULL;
+}
index b33e8ca817cc1776151f27a5365cd0ba4df4ea62..6fe1acce635039d84cd2bf628adada4b09f849c5 100644 (file)
@@ -409,7 +409,7 @@ class MainFrame : public TopFrame
     wxIPV4address           m_udp_addr;
     wxDatagramSocket       *m_udp_sock;
     UDPThread              *m_UDPThread;
-    void                    startUDPThread(int port);
+    void                    startUDPThread(void);
     void                    stopUDPThread(void);
     int                     PollUDP();
     bool                    m_schedule_restore;
@@ -558,16 +558,7 @@ public:
     UDPThread(void) : wxThread(wxTHREAD_JOINABLE) { m_run = 1; }
 
     // thread execution starts here
-    void *Entry() 
-    {
-        while (m_run) 
-        {
-            if (mf->PollUDP() == 0) {
-                wxThread::Sleep(20);
-            }
-        }
-        return NULL;
-    }
+    void *Entry();
 
     // called when the thread exits - whether it terminates normally or is
     // stopped with Delete() (but not when it is Kill()ed!)
index 9174c89f10825516c3e910366d7d5107c877b2ec..807f95155d30e55694d808860b6910df0a2e4c37 100644 (file)
@@ -219,10 +219,12 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const
     bSizer15->Add(m_txtCtrlCallSign, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5);
     lowerSizer->Add(bSizer15, 1, wxEXPAND, 5);
 
-    m_txtChecksumGood = new wxStaticText(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
-    lowerSizer->Add(m_txtChecksumGood, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
-    m_txtChecksumBad = new wxStaticText(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
-    lowerSizer->Add(m_txtChecksumBad, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
+    wxStaticBoxSizer* sbSizer_Checksum = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, _("Good/Bad Checksums")), wxHORIZONTAL);
+    m_txtChecksumGood = new wxStaticText(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxSize(100,-1), wxALIGN_CENTRE);
+    sbSizer_Checksum->Add(m_txtChecksumGood, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
+    m_txtChecksumBad = new wxStaticText(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxSize(100,-1), wxALIGN_CENTRE);
+    sbSizer_Checksum->Add(m_txtChecksumBad, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
+    lowerSizer->Add(sbSizer_Checksum, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
 
     //=====================================================
     // These are the buttons that autosend the userid (?)