From 03fd7e73b8c100be8f69f6f153563696cac56764 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Tue, 27 Nov 2012 05:03:09 +0000 Subject: [PATCH] rewrote callsign system along fdmdv1 lines git-svn-id: https://svn.code.sf.net/p/freetel/code@1083 01035d8c-6547-0410-b346-abe4f91aad63 --- fdmdv2/src/fdmdv2_defines.h | 4 +- fdmdv2/src/fdmdv2_main.cpp | 276 ++++++++++++------------------------ fdmdv2/src/fdmdv2_main.h | 10 +- fdmdv2/src/topFrame.cpp | 41 ++---- fdmdv2/src/topFrame.h | 5 +- 5 files changed, 114 insertions(+), 222 deletions(-) diff --git a/fdmdv2/src/fdmdv2_defines.h b/fdmdv2/src/fdmdv2_defines.h index 92ad3de8..cacac6b0 100644 --- a/fdmdv2/src/fdmdv2_defines.h +++ b/fdmdv2/src/fdmdv2_defines.h @@ -77,9 +77,7 @@ #define SNRSLOW_BETA 0.5 // time constant for slow SNR for display // Data -#define MAX_TXID 1024 -#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 +#define MAX_CALLSIGN 80 enum { diff --git a/fdmdv2/src/fdmdv2_main.cpp b/fdmdv2/src/fdmdv2_main.cpp index b4cfbfed..8f5efef4 100644 --- a/fdmdv2/src/fdmdv2_main.cpp +++ b/fdmdv2/src/fdmdv2_main.cpp @@ -49,10 +49,9 @@ int g_split; int g_tx; float g_snr; -// sending and receiving data +// sending and receiving Call Sign 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 @@ -321,13 +320,7 @@ 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); + wxGetApp().m_callSign = pConfig->Read("/Data/CallSign", wxT("")); pConfig->SetPath(wxT("/")); @@ -407,8 +400,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); + g_txDataInFifo = fifo_create(MAX_CALLSIGN*VARICODE_MAX_BITS); + g_rxDataOutFifo = fifo_create(MAX_CALLSIGN*VARICODE_MAX_BITS); varicode_decode_init(&g_varicode_dec_states); } @@ -471,9 +464,7 @@ MainFrame::~MainFrame() 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()); + pConfig->Write(wxT("/Data/CallSign"), wxGetApp().m_callSign); } //m_togRxID->Disconnect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnRxIDUI), NULL, this); @@ -646,24 +637,37 @@ void MainFrame::OnTimer(wxTimerEvent &evt) m_rbSync->SetValue(false); } - // send Tx ID + // send Callsign - if (m_togTxID->GetValue()) { - m_txIDTimerTics += DT; - if (m_txIDTimerTics > TXID_PERIOD) { - m_txIDTimerTics = 0.0; - sendTxID(); - } + if (fifo_used(g_txDataInFifo) == 0) { + char callsign[MAX_CALLSIGN]; + strncpy(callsign, (const char*) wxGetApp().m_callSign.mb_str(wxConvUTF8), MAX_CALLSIGN-1); + char callsigncr[MAX_CALLSIGN+1]; + strcpy(callsigncr, callsign); + callsigncr[strlen(callsign)] = 13; + + // varicode encode and write to tx data fifo + + short varicode[MAX_CALLSIGN*VARICODE_MAX_BITS]; + int nout = varicode_encode(varicode, callsigncr, MAX_CALLSIGN*VARICODE_MAX_BITS, strlen(callsign)+1); + fifo_write(g_txDataInFifo, varicode, nout); + //printf("Callsign sending: %s nout: %d\n", callsign, nout); } - // See if any ID info received + // See if any callsign info received - if (m_togRxID->GetValue()) { - short ashort; - while (fifo_read(g_rxDataOutFifo, &ashort, 1) == 0) { + short ashort; + while (fifo_read(g_rxDataOutFifo, &ashort, 1) == 0) { + if ((ashort == 13) || ((m_pcallsign - m_callsign) > MAX_CALLSIGN-1)) { + // CR completes line + *m_pcallsign = 0; + m_pcallsign = m_callsign; + } + else { + *m_pcallsign++ = (char)ashort; wxString s; - s.Printf("%c", (char)ashort); - m_txtCtrlRx->AppendText(s); + s.Printf("%s", m_callsign); + m_txtCtrlCallSign->SetValue(s); } } @@ -840,33 +844,11 @@ void MainFrame::OnTogBtnRxID(wxCommandEvent& event) event.Skip(); } -//------------------------------------------------------------------------- -// sendTxID() -//------------------------------------------------------------------------- -void MainFrame::sendTxID(void) -{ - wxString txid = m_txtCtrlTx->GetValue() + " "; - char txid2[MAX_TXID]; - strncpy(txid2, (const char*) txid.mb_str(wxConvUTF8), MAX_TXID-1); - - // varicode encode and write to tx data fifo - - 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; iEnable(); - m_togRxID->Enable(); - m_togTxID->Enable(); + //m_togRxID->Enable(); + //m_togTxID->Enable(); m_togBtnAnalog->Enable(); m_btnTogTX->Enable(); m_togBtnOnOff->SetLabel(wxT("Stop")); @@ -1400,10 +1379,9 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event) g_State = 0; g_snr = 0.0; - m_txIDTimerTics = 0.0; - m_txtCtrlRx->SetValue(wxT("")); + m_pcallsign = m_callsign; - m_maxLevel = 0; + m_maxLevel = 0; m_textLevel->SetLabel(wxT("")); m_gaugeLevel->SetValue(0); @@ -2105,7 +2083,7 @@ void per_frame_rx_processing( int rx_bits[FDMDV_BITS_PER_FRAME]; unsigned char packed_bits[BYTES_PER_CODEC_FRAME]; float rx_spec[FDMDV_NSPEC]; - int i,j; + int i; int nin_prev; int bit; int byte; @@ -2206,79 +2184,49 @@ void per_frame_rx_processing( if(sync_bit == 1) { 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)); - // lets see if this is a data frame + // extract data bit data_flag_index = codec2_get_spare_bit_index(c2); assert(data_flag_index != -1); // not supported for all rates - if (codec_bits[data_flag_index]) { - //printf("data_flag_index: %d\n", data_flag_index); - //printf("rx data bits: "); - //for(i=0; i peak) - peak = input_buf[i]; + /* unpack bits, MSB first */ + + bit = 7; byte = 0; + for(i=0; i> bit) & 0x1; + bit--; + if (bit < 0) { + bit = 7; + byte++; + } } + assert(byte == BYTES_PER_CODEC_FRAME); // voice/data flag is a spare bit in 1400 bit/s frame that - // codec defines + // codec defines. Use this 1 bit/frame to send call sign data data_flag_index = codec2_get_spare_bit_index(c2); assert(data_flag_index != -1); // not supported for all rates - // potential bug: this should really track background noise level - // e.g. look at minimum frame energy. OW a high backfround level might - // mean no data.... - - if ((peak < SILENCE_THRESHOLD) && fifo_used(g_txDataInFifo)) { - //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 - - for(i=0; i> bit) & 0x1; - bit--; - if (bit < 0) { - bit = 7; - byte++; - } - } - assert(byte == BYTES_PER_CODEC_FRAME); - + if (fifo_read(g_txDataInFifo, &abit, 1) == 0) + bits[data_flag_index] = abit; + else bits[data_flag_index] = 0; - } /* modulate even and odd frames */ diff --git a/fdmdv2/src/fdmdv2_main.h b/fdmdv2/src/fdmdv2_main.h index a2461d5b..38f27ae1 100644 --- a/fdmdv2/src/fdmdv2_main.h +++ b/fdmdv2/src/fdmdv2_main.h @@ -43,6 +43,7 @@ #include #include #include +#include #include @@ -133,6 +134,8 @@ class MainApp : public wxApp unsigned int m_recFileFromRadioSecs; wxString m_playFileFromRadioPath; + wxString m_callSign; + bool m_snrSlow; // Codec 2 Post Filter @@ -291,7 +294,6 @@ class MainFrame : public TopFrame protected: void setsnrBeta(bool snrSlow); - void sendTxID(void); // protected event handlers virtual void OnCloseFrame(wxCloseEvent& event); @@ -310,6 +312,7 @@ class MainFrame : public TopFrame void OnToolsComCfg( wxCommandEvent& event ); void OnToolsComCfgUI( wxUpdateUIEvent& event ); void OnToolsFilter( wxCommandEvent& event ); + void OnToolsSetCallSign(wxCommandEvent& event); void OnPlayFileToMicIn( wxCommandEvent& event ); void OnRecFileFromRadio( wxCommandEvent& event ); @@ -349,7 +352,10 @@ class MainFrame : public TopFrame wxTextCtrl* m_tc; int m_zoom; float m_snrBeta; - float m_txIDTimerTics; + + // Callsign + char m_callsign[MAX_CALLSIGN]; + char *m_pcallsign; // level Gauge float m_maxLevel; diff --git a/fdmdv2/src/topFrame.cpp b/fdmdv2/src/topFrame.cpp index 8f7097a0..ea1d98f2 100644 --- a/fdmdv2/src/topFrame.cpp +++ b/fdmdv2/src/topFrame.cpp @@ -60,6 +60,10 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const m_menuItemFilter = new wxMenuItem(tools, wxID_ANY, wxString(_("&Filter")) , wxEmptyString, wxITEM_NORMAL); tools->Append(m_menuItemFilter); + wxMenuItem* m_menuItemSetCallSign; + m_menuItemSetCallSign = new wxMenuItem(tools, wxID_ANY, wxString(_("Set Call Sign")) , wxEmptyString, wxITEM_NORMAL); + tools->Append(m_menuItemSetCallSign); + wxMenuItem* m_menuItemCaptTxInStream; m_menuItemCaptTxInStream = new wxMenuItem(tools, wxID_ANY, wxString(_("&Capture Tx Input Stream")), wxEmptyString, wxITEM_NORMAL); @@ -168,46 +172,19 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const // 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); - m_txtCtrlTx->SetToolTip(_("Text in this box wll be sent when TxID button is pressed")); - 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|wxTE_MULTILINE); - bSizer15->Add(m_txtCtrlRx, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5); - m_txtCtrlRx->SetToolTip(_("Text will be received here when RxID button is pressed")); + m_txtCtrlCallSign = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); + m_txtCtrlCallSign->SetToolTip(_("Call Sign of transmitting station will appear here")); + bSizer15->Add(m_txtCtrlCallSign, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5); lowerSizer->Add(bSizer15, 1, wxEXPAND, 5); wxBoxSizer* bSizer141; - bSizer141 = new wxBoxSizer(wxVERTICAL); + bSizer141 = new wxBoxSizer(wxHORIZONTAL); //===================================================== // These are the buttons that autosend the userid (?) @@ -393,6 +370,8 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const this->Connect(m_menuItemFilter->GetId(), wxEVT_UPDATE_UI, wxUpdateUIEventHandler(TopFrame::OnToolsFilterUI)); this->Connect(m_menuItemRigCtrlCfg->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(TopFrame::OnToolsComCfg)); this->Connect(m_menuItemRigCtrlCfg->GetId(), wxEVT_UPDATE_UI, wxUpdateUIEventHandler(TopFrame::OnToolsComCfgUI)); + this->Connect(m_menuItemSetCallSign->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(TopFrame::OnToolsSetCallSign)); + this->Connect(m_menuItemSetCallSign->GetId(), wxEVT_UPDATE_UI, wxUpdateUIEventHandler(TopFrame::OnToolsSetCallSignUI)); this->Connect(m_menuItemPlayFileToMicIn->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(TopFrame::OnPlayFileToMicIn)); this->Connect(m_menuItemRecFileFromRadio->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(TopFrame::OnRecFileFromRadio)); diff --git a/fdmdv2/src/topFrame.h b/fdmdv2/src/topFrame.h index fd962489..70e9c5d7 100644 --- a/fdmdv2/src/topFrame.h +++ b/fdmdv2/src/topFrame.h @@ -90,8 +90,7 @@ class TopFrame : public wxFrame wxCheckBox* m_ckboxSNR; wxGauge* m_gaugeLevel; wxStaticText* m_textLevel; - wxTextCtrl* m_txtCtrlTx; - wxTextCtrl* m_txtCtrlRx; + wxTextCtrl* m_txtCtrlCallSign; wxSlider* m_sliderSQ; wxCheckBox* m_ckboxSQ; wxStaticText* m_textSQ; @@ -109,6 +108,8 @@ class TopFrame : public wxFrame virtual void OnToolsAudioUI( wxUpdateUIEvent& event ) { event.Skip(); } virtual void OnToolsFilter( wxCommandEvent& event ) { event.Skip(); } virtual void OnToolsFilterUI( wxUpdateUIEvent& event ) { event.Skip(); } + virtual void OnToolsSetCallSign( wxCommandEvent& event ) { event.Skip(); } + virtual void OnToolsSetCallSignUI( wxUpdateUIEvent& event ) { event.Skip(); } virtual void OnToolsComCfg( wxCommandEvent& event ) { event.Skip(); } virtual void OnToolsComCfgUI( wxUpdateUIEvent& event ) { event.Skip(); } virtual void OnPlayFileToMicIn( wxCommandEvent& event ) { event.Skip(); } -- 2.25.1