From 11cb7ed494c4e23f7070dc22236d7a3010076a60 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Thu, 5 Jun 2014 21:22:42 +0000 Subject: [PATCH] added feature to optionally play 1 kHz tone in left channel to trigger vox git-svn-id: https://svn.code.sf.net/p/freetel/code@1641 01035d8c-6547-0410-b346-abe4f91aad63 --- fdmdv2/src/dlg_ptt.cpp | 9 +++++++-- fdmdv2/src/dlg_ptt.h | 1 + fdmdv2/src/fdmdv2_defines.h | 4 +++- fdmdv2/src/fdmdv2_main.cpp | 27 +++++++++++++++++++++------ fdmdv2/src/fdmdv2_main.h | 7 +++++++ 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/fdmdv2/src/dlg_ptt.cpp b/fdmdv2/src/dlg_ptt.cpp index 3c306306..2643c1d6 100644 --- a/fdmdv2/src/dlg_ptt.cpp +++ b/fdmdv2/src/dlg_ptt.cpp @@ -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. */ diff --git a/fdmdv2/src/dlg_ptt.h b/fdmdv2/src/dlg_ptt.h index 045bb938..8fa9b9d2 100644 --- a/fdmdv2/src/dlg_ptt.h +++ b/fdmdv2/src/dlg_ptt.h @@ -48,6 +48,7 @@ class ComPortsDlg : public wxDialog protected: wxCheckBox* m_ckHalfDuplex; + wxCheckBox* m_ckLeftChannelVoxTone; /* Hamlib settings.*/ diff --git a/fdmdv2/src/fdmdv2_defines.h b/fdmdv2/src/fdmdv2_defines.h index 3c2168e1..032cece3 100644 --- a/fdmdv2/src/fdmdv2_defines.h +++ b/fdmdv2/src/fdmdv2_defines.h @@ -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 diff --git a/fdmdv2/src/fdmdv2_main.cpp b/fdmdv2/src/fdmdv2_main.cpp index d1e87101..9b55d416 100644 --- a/fdmdv2/src/fdmdv2_main.cpp +++ b/fdmdv2/src/fdmdv2_main.cpp @@ -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 diff --git a/fdmdv2/src/fdmdv2_main.h b/fdmdv2/src/fdmdv2_main.h index d52351ff..16b2ed2d 100644 --- a/fdmdv2/src/fdmdv2_main.h +++ b/fdmdv2/src/fdmdv2_main.h @@ -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; //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= -- 2.25.1