receive data now doing something sensible, but I think rxid window is too big
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 26 Nov 2012 06:03:20 +0000 (06:03 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 26 Nov 2012 06:03:20 +0000 (06:03 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1073 01035d8c-6547-0410-b346-abe4f91aad63

fdmdv2/src/fdmdv2_defines.h
fdmdv2/src/fdmdv2_main.cpp
fdmdv2/src/fdmdv2_main.h
fdmdv2/src/topFrame.cpp

index 7492d19d1f781dae01d0169f28850fe4150b84bf..889201cbb5decae9550f51510168cffad5d3578f 100644 (file)
@@ -71,7 +71,8 @@
 
 // Data
 #define MAX_TXID            1024
-#define SILENCE_THRESHOLD    100
+#define SILENCE_THRESHOLD    300                          // when Mic In beneath this level we drop vocie frame and send data
+#define TXID_PERIOD           10                          // period between sending data
 
 enum
 {
index 88d877d2a62fbfebe849d2fb1a8c51b390e17673..e23410960fa84e49fe5f206be396e8cfbc12d2f8 100644 (file)
@@ -52,6 +52,8 @@ float g_snr;
 // sending and receiving data
 struct FIFO         *g_txDataInFifo;
 struct VARICODE_DEC  g_varicode_dec_states;
+unsigned char        g_prev_packed_bits[BYTES_PER_CODEC_FRAME];
+struct FIFO         *g_rxDataOutFifo;
 
 // tx/rx processing states
 int                 g_nRxIn = FDMDV_NOM_SAMPLES_PER_FRAME;
@@ -308,6 +310,14 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)
     wxGetApp().m_codec2LPCPostFilterBeta       = (float)pConfig->Read(wxT("/Filter/codec2LPCPostFilterBeta"),      CODEC2_LPC_PF_BETA*100)/100.0;
     //printf("main(): m_codec2LPCPostFilterBeta: %f\n", wxGetApp().m_codec2LPCPostFilterBeta);
 
+    wxString txID = pConfig->Read("/Data/txID", wxT(""));
+    m_txtCtrlTx->SetValue(txID);
+    bool f = false;
+    bool txIDEnable = pConfig->Read("/Data/txIDEnable", f);
+    m_togTxID->SetValue(txIDEnable);
+    bool rxIDEnable = pConfig->Read("/Data/rxIDEnable", f);
+    m_togRxID->SetValue(rxIDEnable);
+
     pConfig->SetPath(wxT("/"));
 
 //    this->Connect(m_menuItemHelpUpdates->GetId(), wxEVT_UPDATE_UI, wxUpdateUIEventHandler(TopFrame::OnHelpCheckUpdatesUI));
@@ -320,7 +330,7 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)
     m_btnTogTX->Connect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnTXClickUI), NULL, this);
 
     m_togBtnSplit->Disable();
-    //m_togRxID->Disable();
+    m_togRxID->Disable();
     m_togTxID->Disable();
     m_togBtnAnalog->Disable();
     //m_togBtnALC->Disable();
@@ -382,8 +392,8 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)
     // data states
     
     g_txDataInFifo = fifo_create(MAX_TXID*VARICODE_MAX_BITS);   
+    g_rxDataOutFifo = fifo_create(MAX_TXID*VARICODE_MAX_BITS);   
     varicode_decode_init(&g_varicode_dec_states);
-
 }
 
 //-------------------------------------------------------------------------
@@ -443,7 +453,11 @@ MainFrame::~MainFrame()
         pConfig->Write(wxT("/File/recFileFromRadioSecs"),   wxGetApp().m_recFileFromRadioSecs);
 
         pConfig->Write(wxT("/Audio/snrSlow"), wxGetApp().m_snrSlow);
-    }
+
+        pConfig->Write(wxT("/Data/txID"), m_txtCtrlTx->GetValue());
+        pConfig->Write(wxT("/Data/txIDEnable"), m_togTxID->GetValue());
+        pConfig->Write(wxT("/Data/rxIDEnable"), m_togRxID->GetValue());
+   }
 
     //m_togRxID->Disconnect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnRxIDUI), NULL, this);
     m_togTxID->Disconnect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnTxIDUI), NULL, this);
@@ -569,6 +583,28 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
         m_rbSync->SetForegroundColour( wxColour( 255, 0, 0 ) ); // red
         m_rbSync->SetValue(false);
     }
+
+    // send Tx ID
+
+    if (m_togTxID->GetValue()) {
+        m_txIDTimerTics += DT;
+        if (m_txIDTimerTics > TXID_PERIOD) {
+            m_txIDTimerTics = 0.0;
+            sendTxID();
+        }
+    }
+
+    // See if any ID info received
+
+    if (m_togRxID->GetValue()) {
+        short ashort;
+        while (fifo_read(g_rxDataOutFifo, &ashort, 1) == 0) {            
+            wxString s;
+            s.Printf("%c", (char)ashort);
+            m_txtCtrlRx->AppendText(s);
+        }
+    }
+
 }
 #endif
 
@@ -735,11 +771,11 @@ void MainFrame::OnTogBtnRxID(wxCommandEvent& event)
 }
 
 //-------------------------------------------------------------------------
-// OnTogBtnTxID()
+// sendTxID()
 //-------------------------------------------------------------------------
-void MainFrame::OnTogBtnTxID(wxCommandEvent& event)
+void MainFrame::sendTxID(void)
 {
-    wxString txid = m_txtCtrlTx->GetValue();
+    wxString txid = m_txtCtrlTx->GetValue() + " ";
     char txid2[MAX_TXID];
     strncpy(txid2, (const char*) txid.mb_str(wxConvUTF8), MAX_TXID-1);
     
@@ -747,13 +783,20 @@ void MainFrame::OnTogBtnTxID(wxCommandEvent& event)
 
     short varicode[MAX_TXID*VARICODE_MAX_BITS];
     int nout = varicode_encode(varicode, txid2, MAX_TXID*VARICODE_MAX_BITS, strlen(txid2));
-    printf("tx varicode: ");
-    for(int i=0; i<nout; i++)
-        printf("%d", varicode[i]);
-    printf("\n");
+    //printf("tx varicode: ");
+    //for(int i=0; i<nout; i++)
+    //    printf("%d", varicode[i]);
+    //printf("\n");
     int ret = fifo_write(g_txDataInFifo, varicode, nout);
-    printf("MainFrame::OnTogBtnTxID, sending: %s nout: %d ret: %d\n", txid2, nout, ret);
+    //printf("MainFrame::OnTogBtnTxID, sending: %s nout: %d ret: %d\n", txid2, nout, ret);
+}
 
+//-------------------------------------------------------------------------
+// OnTogBtnTxID()
+//-------------------------------------------------------------------------
+void MainFrame::OnTogBtnTxID(wxCommandEvent& event)
+{
+    m_txIDTimerTics = TXID_PERIOD; // this forces an immediate send in OnTimer
     event.Skip();
 }
 
@@ -1026,7 +1069,7 @@ void MainFrame::OnExit(wxCommandEvent& event)
         stopRxStream();
     }
     m_togBtnSplit->Disable();
-    //m_togRxID->Disable();
+    m_togRxID->Disable();
     m_togTxID->Disable();
     m_togBtnAnalog->Disable();
     //m_togBtnALC->Disable();
@@ -1180,7 +1223,7 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)
     if (startStop.IsSameAs("Start")) {
 
         m_togBtnSplit->Enable();
-        //m_togRxID->Enable();
+        m_togRxID->Enable();
         m_togTxID->Enable();
         m_togBtnAnalog->Enable();
         m_btnTogTX->Enable();
@@ -1202,6 +1245,9 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)
         g_State = 0;
         g_snr = 0.0;
 
+        m_txIDTimerTics = 0.0;
+        m_txtCtrlRx->SetValue(wxT(""));
+
         //printf("g_stats.snr: %f\n", g_stats.snr_est);
 
         // attempt to start sound cards and tx/rx processing
@@ -1230,7 +1276,7 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)
         codec2_destroy(g_pCodec2);
 
         m_togBtnSplit->Disable();
-        //m_togRxID->Disable();
+        m_togRxID->Disable();
         m_togTxID->Disable();
         m_togBtnAnalog->Disable();
         m_btnTogTX->Disable();
@@ -1983,7 +2029,8 @@ void per_frame_rx_processing(
                 }
                 if(sync_bit == 1)
                 {
-                    int data_flag_index;
+                    int  data_flag_index;
+                    char ascii_out[MAX_TXID];
 
                     // second half of frame of codec bits
                     memcpy(&codec_bits[FDMDV_BITS_PER_FRAME], rx_bits, FDMDV_BITS_PER_FRAME*sizeof(int));
@@ -2003,7 +2050,6 @@ void per_frame_rx_processing(
                         // if data construct data frame, varicode decode, write to fifo, send event
 
                         short varicode[BITS_PER_CODEC_FRAME - 1];
-                        char  ascii_out[MAX_TXID];
                         int   n_ascii;
 
                         for(i=0,j=0; i<data_flag_index; i++,j++)
@@ -2014,8 +2060,16 @@ void per_frame_rx_processing(
                         
                         if (n_ascii) {
                             ascii_out[n_ascii] = 0;
-                            printf("%d ascii received: %s\n", n_ascii, ascii_out);
+                            //printf("rx data: %s\n", ascii_out);
+                            for(i=0; i<n_ascii; i++) {
+                                short ashort = (short)ascii_out[i];
+                                fifo_write(g_rxDataOutFifo, &ashort, 1);
+                            }
                         }
+                        // use previous frame of packed bits if we have lost this one due to data
+                        memcpy(packed_bits, g_prev_packed_bits, BYTES_PER_CODEC_FRAME);
+
                     }
                     else {
 
@@ -2044,9 +2098,14 @@ void per_frame_rx_processing(
 
                         assert(codec2_samples_per_frame(c2) == (2*N8));
 
-                        codec2_decode(c2, output_buf, packed_bits);
-                        fifo_write(output_fifo, output_buf, codec2_samples_per_frame(c2));
+                        memcpy(g_prev_packed_bits, packed_bits, BYTES_PER_CODEC_FRAME);
                     }
+
+                    // always decode a speech frame, even when we have losta frame due to data
+
+                    codec2_decode(c2, output_buf, packed_bits);
+                    fifo_write(output_fifo, output_buf, codec2_samples_per_frame(c2));
+
                 }
                 break;
         }
@@ -2086,7 +2145,7 @@ void per_frame_tx_processing(
     // if there is low speech energy and data to send, then send data frame
 
     if ((peak < SILENCE_THRESHOLD) && fifo_used(g_txDataInFifo)) {
-        printf("sending data ...\n");
+        //printf("sending data ...\n");
 
         // we have to handle the case where we might not have a whole
         // frame of data to send, in that case pad with zeros
index d43f1094bf63aecfa482b67ce7274a73ecfc7187..96c8e48f3ad95616903a44eeb351832b61b01a87 100644 (file)
@@ -284,6 +284,7 @@ class MainFrame : public TopFrame
  protected:
 
         void setsnrBeta(bool snrSlow);
+        void sendTxID(void);
 
         // protected event handlers
         virtual void OnCloseFrame(wxCloseEvent& event);
@@ -336,12 +337,11 @@ class MainFrame : public TopFrame
         void OnIdle(wxIdleEvent &evt);
 #endif
     private:
-#ifdef __WXMSW__
-#endif // __WXMSW__
         bool        m_useMemory;
         wxTextCtrl* m_tc;
         int         m_zoom;
         float       m_snrBeta;
+        float       m_txIDTimerTics;
 };
 
 void resample_for_plot(struct FIFO *plotFifo, short buf[], int length);
index 23efd247b8d41fba22bd5529b30a17bb3a57ce3f..10bbcf4890befaeeeb56aadb2750a50f42193a12 100644 (file)
@@ -154,35 +154,66 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const
 
     upperSizer->Add(m_auiNbookCtrl, 1, wxALIGN_TOP|wxEXPAND, 1);
     centerSizer->Add(upperSizer, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALIGN_TOP|wxEXPAND, 0);
+
+    // lower middle used for user ID
+
+#ifdef NEW
+    wxBoxSizer* lowerSizer = new wxBoxSizer(wxVERTICAL);
+
+    wxBoxSizer* lowerSizerTop = new wxBoxSizer(wxHORIZONTAL);
+    wxBoxSizer* lowerSizerBottom = new wxBoxSizer(wxHORIZONTAL);
+
+    m_txtCtrlTx = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
+    lowerSizerTop->Add(m_txtCtrlTx, 0, wxALL|wxEXPAND, 5);
+    
+    m_togTxID = new wxToggleButton(this, wxID_ANY, _("TxID"), wxDefaultPosition, wxDefaultSize, 0);
+    m_togTxID->SetToolTip(_("Send Tx ID information"));
+    //lowerSizerTop->Add(m_togTxID, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
+    /*
+    m_txtCtrlRx = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
+    lowerSizerBottom->Add(m_txtCtrlRx, 1, wxALL|wxEXPAND, 5);
+
+    m_togRxID = new wxToggleButton(this, wxID_ANY, _("RxID"), wxDefaultPosition, wxDefaultSize, 0);
+    m_togRxID->SetToolTip(_("Enable reception of ID information"));
+    lowerSizerBottom->Add(m_togRxID, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
+    */
+    lowerSizer->Add(lowerSizerTop, 0 ,wxEXPAND);
+    //lowerSizer->Add(lowerSizerBottom);
+#endif
+
     wxBoxSizer* lowerSizer;
     lowerSizer = new wxBoxSizer(wxHORIZONTAL);
+
     wxBoxSizer* bSizer15;
     bSizer15 = new wxBoxSizer(wxVERTICAL);
+
     m_txtCtrlTx = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
     bSizer15->Add(m_txtCtrlTx, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5);
-    m_txtCtrlRx = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
+    m_txtCtrlRx = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_MULTILINE);
     bSizer15->Add(m_txtCtrlRx, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5);
     lowerSizer->Add(bSizer15, 1, wxEXPAND, 5);
+
     wxBoxSizer* bSizer141;
-    bSizer141 = new wxBoxSizer(wxHORIZONTAL);
+    bSizer141 = new wxBoxSizer(wxVERTICAL);
 
     //=====================================================
     // These are the buttons that autosend the userid (?)
     //=====================================================
 
-#ifdef UNIMPLEMENTED
-    // RxID
-    //---------
-    m_togRxID = new wxToggleButton(this, wxID_ANY, _("RxID"), wxDefaultPosition, wxDefaultSize, 0);
-    bSizer141->Add(m_togRxID, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxALL|wxFIXED_MINSIZE, 5);
-#endif
-
     // TxID
     //---------
     m_togTxID = new wxToggleButton(this, wxID_ANY, _("TxID"), wxDefaultPosition, wxDefaultSize, 0);
-    bSizer141->Add(m_togTxID, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
+    m_togTxID->SetToolTip(_("Send Tx ID information"));
+    bSizer141->Add(m_togTxID, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
+
+    // RxID
+    //---------
+    m_togRxID = new wxToggleButton(this, wxID_ANY, _("RxID"), wxDefaultPosition, wxDefaultSize, 0);
+    m_togRxID->SetToolTip(_("Enable reception of ID information"));
+    bSizer141->Add(m_togRxID, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_LEFT|wxALL|wxFIXED_MINSIZE, 5);
 
     lowerSizer->Add(bSizer141, 0, wxALIGN_RIGHT, 5);
+
     centerSizer->Add(lowerSizer, 0, wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 2);
     bSizer1->Add(centerSizer, 4, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 1);