// 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;
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));
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();
// 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);
-
}
//-------------------------------------------------------------------------
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);
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
}
//-------------------------------------------------------------------------
-// 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);
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();
}
stopRxStream();
}
m_togBtnSplit->Disable();
- //m_togRxID->Disable();
+ m_togRxID->Disable();
m_togTxID->Disable();
m_togBtnAnalog->Disable();
//m_togBtnALC->Disable();
if (startStop.IsSameAs("Start")) {
m_togBtnSplit->Enable();
- //m_togRxID->Enable();
+ m_togRxID->Enable();
m_togTxID->Enable();
m_togBtnAnalog->Enable();
m_btnTogTX->Enable();
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
codec2_destroy(g_pCodec2);
m_togBtnSplit->Disable();
- //m_togRxID->Disable();
+ m_togRxID->Disable();
m_togTxID->Disable();
m_togBtnAnalog->Disable();
m_btnTogTX->Disable();
}
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));
// 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++)
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 {
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;
}
// 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
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);