added feature to optionally play 1 kHz tone in left channel to trigger vox
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 5 Jun 2014 21:22:42 +0000 (21:22 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 5 Jun 2014 21:22:42 +0000 (21:22 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1641 01035d8c-6547-0410-b346-abe4f91aad63

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

index 3c306306ec07f1c72de986296fbb92f99ebb6c52..2643c1d6474f7057bddebf612bacb4bc6eabffc8 100644 (file)
@@ -46,10 +46,12 @@ ComPortsDlg::ComPortsDlg(wxWindow* parent, wxWindowID id, const wxString& title,
 
     // DR: should this be on options dialog?
 
-    wxStaticBoxSizer* staticBoxSizer28 = new wxStaticBoxSizer( new wxStaticBox(this, wxID_ANY, _("VOX PTT Settings")), wxVERTICAL);
+    wxStaticBoxSizer* staticBoxSizer28 = new wxStaticBoxSizer( new wxStaticBox(this, wxID_ANY, _("VOX PTT Settings")), wxHORIZONTAL);
     m_ckHalfDuplex = new wxCheckBox(this, wxID_ANY, _("Half Duplex"), wxDefaultPosition, wxSize(-1,-1), 0);
-    m_ckHalfDuplex->SetToolTip(_("Should be checked for VOX operated Tx/Rx switching"));
     staticBoxSizer28->Add(m_ckHalfDuplex, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
+    m_ckLeftChannelVoxTone = new wxCheckBox(this, wxID_ANY, _("Left Channel Vox Tone"), wxDefaultPosition, wxSize(-1,-1), 0);
+    staticBoxSizer28->Add(m_ckLeftChannelVoxTone, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
+
     mainSizer->Add(staticBoxSizer28, 0, wxEXPAND, 5);
 
     //----------------------------------------------------------------------
@@ -310,6 +312,7 @@ void ComPortsDlg::ExchangeData(int inout)
     if(inout == EXCHANGE_DATA_IN)
     {
         m_ckHalfDuplex->SetValue(wxGetApp().m_boolHalfDuplex);
+        m_ckLeftChannelVoxTone->SetValue(wxGetApp().m_leftChannelVoxTone);
 
         m_ckUseHamlibPTT->SetValue(wxGetApp().m_boolHamlibUseForPTT);
         m_cbRigName->SetSelection(wxGetApp().m_intHamlibRig);
@@ -332,6 +335,8 @@ void ComPortsDlg::ExchangeData(int inout)
     {
         wxGetApp().m_boolHalfDuplex = m_ckHalfDuplex->GetValue();
         pConfig->Write(wxT("/Rig/HalfDuplex"), wxGetApp().m_boolHalfDuplex);
+        wxGetApp().m_leftChannelVoxTone = m_ckLeftChannelVoxTone->GetValue();
+        pConfig->Write(wxT("/Rig/leftChannelVoxTone"), wxGetApp().m_leftChannelVoxTone);
 
         /* Hamlib settings. */
 
index 045bb938b319c6bbfb786cf48db8632953b29734..8fa9b9d2c1cb70f9bd000bf873cfc55ea56c56a0 100644 (file)
@@ -48,6 +48,7 @@ class ComPortsDlg : public wxDialog
 
     protected:
         wxCheckBox* m_ckHalfDuplex;
+        wxCheckBox* m_ckLeftChannelVoxTone;
 
         /* Hamlib settings.*/
 
index 3c2168e1debfedfdfadedd15595f489da09d01ea..032cece374717b3f663dd3cc49a2895647a41c8b 100644 (file)
@@ -61,6 +61,8 @@
 #define MEM8                (FDMDV_OS_TAPS/FDMDV_OS)
 #define N48                 (N8*FDMDV_OS)                  // processing buffer size at 48 kHz
 #define NUM_CHANNELS        2                              // I think most sound cards prefer stereo we will convert to mono
+#define VOX_TONE_FREQ       1000.0                         // optional left channel vox tone freq
+#define VOX_TONE_AMP        30000                          // optional left channel vox tone amp
 
 #define MAX_BITS_PER_CODEC_FRAME 64                            // 1600 bit/s mode
 #define MAX_BYTES_PER_CODEC_FRAME (MAX_BITS_PER_CODEC_FRAME/8)
@@ -77,7 +79,7 @@
 // SNR
 #define SNRSLOW_BETA        0.5                           // time constant for slow SNR for display
 
-// Data
+// Text messaging Data
 #define MAX_CALLSIGN         80
 
 enum
index d1e871012c1eff9b88dc2f40aabb25429fb0d557..9b55d41665f850111a4392d02c83b58ca02dca67 100644 (file)
@@ -321,7 +321,8 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)
     // PTT -------------------------------------------------------------------
 
     wxGetApp().m_boolHalfDuplex     = pConfig->ReadBool(wxT("/Rig/HalfDuplex"),     true);
-
+    wxGetApp().m_leftChannelVoxTone = pConfig->ReadBool("/Rig/leftChannelVoxTone",  false);
     wxGetApp().m_boolHamlibUseForPTT = pConfig->ReadBool("/Hamlib/UseForPTT", false);
     wxGetApp().m_intHamlibRig = pConfig->ReadLong("/Hamlib/RigName", 0);
     wxGetApp().m_strHamlibSerialPort = pConfig->Read("/Hamlib/SerialPort", "");
@@ -510,6 +511,7 @@ MainFrame::~MainFrame()
         pConfig->Write(wxT("/Audio/soundCard2SampleRate"),    g_soundCard2SampleRate );
 
         pConfig->Write(wxT("/Rig/HalfDuplex"),              wxGetApp().m_boolHalfDuplex);
+        pConfig->Write(wxT("/Rig/leftChannelVoxTone"),      wxGetApp().m_leftChannelVoxTone);
         pConfig->Write("/Hamlib/UseForPTT", wxGetApp().m_boolHamlibUseForPTT);
         pConfig->Write("/Hamlib/RigName", wxGetApp().m_intHamlibRig);
         pConfig->Write("/Hamlib/SerialPort", wxGetApp().m_strHamlibSerialPort);
@@ -2285,6 +2287,11 @@ void MainFrame::startRxStream()
         g_rxUserdata->micInEQEnable = wxGetApp().m_MicInEQEnable;
         g_rxUserdata->spkOutEQEnable = wxGetApp().m_SpkOutEQEnable;
 
+        // optional tone in left channel to reliably trigger vox
+        
+        g_rxUserdata->leftChannelVoxTone = wxGetApp().m_leftChannelVoxTone;
+        g_rxUserdata->voxTonePhase = 0;
+
         // Start sound card 1 ----------------------------------------------------------
 
         m_rxInPa->setUserData(g_rxUserdata);
@@ -2706,7 +2713,7 @@ void txRxProcessing()
                 if (g_loopPlayFileFromRadio)
                     sf_seek(g_sfPlayFileFromRadio, 0, SEEK_SET);
                 else {
-                    printf("playFileFromRadio fnsihed, issuing event!\n");
+                    printf("playFileFromRadio finished, issuing event!\n");
                     wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, g_playFileFromRadioEventId );
                     // call stop/start play menu item, should be thread safe
                     g_parent->GetEventHandler()->AddPendingEvent( event );
@@ -2909,8 +2916,16 @@ int MainFrame::rxCallback(
                        // write signal to both channels */
                        for(i = 0; i < framesPerBuffer; i++, wptr += 2)
                        {
-                               wptr[0] = outdata[i];
-                               wptr[1] = outdata[i];
+                            if (cbData->leftChannelVoxTone) {
+                                cbData->voxTonePhase += 2.0*M_PI*VOX_TONE_FREQ/g_soundCard1SampleRate;
+                                cbData->voxTonePhase -= 2.0*M_PI*floor(cbData->voxTonePhase/(2.0*M_PI));
+                                wptr[0] = VOX_TONE_AMP*cos(cbData->voxTonePhase);                              
+                                //printf("%f %d\n", cbData->voxTonePhase, wptr[0]);
+                            }
+                            else
+                               wptr[0] = outdata[i];
+                               
+                            wptr[1] = outdata[i];
                        }
                }
                else
@@ -3471,8 +3486,8 @@ int MainFrame::txCallback(
                        // write signal to both channels */
                        for(i = 0; i < framesPerBuffer; i++, wptr += 2)
                        {
-                               wptr[0] = outdata[i];
-                               wptr[1] = outdata[i];
+                            wptr[0] = outdata[i];
+                            wptr[1] = outdata[i];
                        }
                }
                else
index d52351ff9146f04b09e8dc3555a4635438b7a2d3..16b2ed2d53d2fa9f8971e2716ba346cdbae7c632 100644 (file)
@@ -215,6 +215,9 @@ class MainApp : public wxApp
         int                 m_show_demod_in;
         int                 m_show_test_frame_errors;
 
+        // optional vox trigger tone
+        bool                m_leftChannelVoxTone;
+
         // notebook display after tx->rxtransition
         int                 m_rxNbookCtrl;
 
@@ -275,6 +278,10 @@ typedef struct
     bool            micInEQEnable;
     bool            spkOutEQEnable;
 
+    // optional loud tone on left channel to reliably trigger vox
+    bool            leftChannelVoxTone;
+    float           voxTonePhase;
+
 } paCallBackData;
 
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=