bSizer6->Add(m_btnRefresh, 0, wxALIGN_CENTER|wxALL, 2);
m_sdbSizer1 = new wxStdDialogButtonSizer();
+
m_sdbSizer1OK = new wxButton(this, wxID_OK);
m_sdbSizer1->AddButton(m_sdbSizer1OK);
- m_sdbSizer1Apply = new wxButton(this, wxID_APPLY);
- m_sdbSizer1->AddButton(m_sdbSizer1Apply);
+
m_sdbSizer1Cancel = new wxButton(this, wxID_CANCEL);
m_sdbSizer1->AddButton(m_sdbSizer1Cancel);
+
+ m_sdbSizer1Apply = new wxButton(this, wxID_APPLY);
+ m_sdbSizer1->AddButton(m_sdbSizer1Apply);
+
m_sdbSizer1->Realize();
bSizer6->Add(m_sdbSizer1, 1, wxALIGN_CENTER_VERTICAL, 2);
m_SpkOutFreqRespPlot = new PlotSpectrum((wxFrame*)m_auiNotebook, m_SpkOutMagdB, F_MAG_N, FILTER_MIN_MAG_DB, FILTER_MAX_MAG_DB);
m_auiNotebook->AddPage(m_SpkOutFreqRespPlot, _("Speaker Out Equaliser"));
- // Default - Cancel - OK Buttons at the bottom --------------------------
+ // OK - Cancel buttons at the bottom --------------------------
wxBoxSizer* bSizer31 = new wxBoxSizer(wxHORIZONTAL);
- m_sdbSizer5Cancel = new wxButton(this, wxID_CANCEL);
- bSizer31->Add(m_sdbSizer5Cancel, 0, wxALL, 2);
+
m_sdbSizer5OK = new wxButton(this, wxID_OK);
bSizer31->Add(m_sdbSizer5OK, 0, wxALL, 2);
+ m_sdbSizer5Cancel = new wxButton(this, wxID_CANCEL);
+ bSizer31->Add(m_sdbSizer5Cancel, 0, wxALL, 2);
+
bSizer30->Add(bSizer31, 0, wxALIGN_RIGHT|wxALL, 0);
this->SetSizer(bSizer30);
bSizer30->Add(sbSizer_udp,0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 3);
//------------------------------
- // Cancel - OK Buttons
+ // OK - Cancel - Apply Buttons
//------------------------------
wxBoxSizer* bSizer31 = new wxBoxSizer(wxHORIZONTAL);
- m_sdbSizer5Cancel = new wxButton(this, wxID_CANCEL);
- bSizer31->Add(m_sdbSizer5Cancel, 0, wxALL, 2);
+
m_sdbSizer5OK = new wxButton(this, wxID_OK);
bSizer31->Add(m_sdbSizer5OK, 0, wxALL, 2);
+ m_sdbSizer5Cancel = new wxButton(this, wxID_CANCEL);
+ bSizer31->Add(m_sdbSizer5Cancel, 0, wxALL, 2);
+
+ m_sdbSizer5Apply = new wxButton(this, wxID_APPLY);
+ bSizer31->Add(m_sdbSizer5Apply, 0, wxALL, 2);
+
bSizer30->Add(bSizer31, 0, wxALIGN_RIGHT|wxALL, 0);
this->SetSizer(bSizer30);
this->Connect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(OptionsDlg::OnInitDialog));
- m_sdbSizer5Cancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnCancel), NULL, this);
m_sdbSizer5OK->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnOK), NULL, this);
+ m_sdbSizer5Cancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnCancel), NULL, this);
+ m_sdbSizer5Apply->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnApply), NULL, this);
event_in_serial = 0;
event_out_serial = 0;
this->Disconnect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(OptionsDlg::OnInitDialog));
- m_sdbSizer5Cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnCancel), NULL, this);
m_sdbSizer5OK->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnOK), NULL, this);
+ m_sdbSizer5Cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnCancel), NULL, this);
+ m_sdbSizer5Apply->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(OptionsDlg::OnApply), NULL, this);
}
wxGetApp().m_testFrames = m_ckboxTestFrame->GetValue();
wxGetApp().m_events = m_ckbox_events->GetValue();
+
+ // make sure regexp lists are terminated by a \n
+
+ if (m_txt_events_regexp_match->GetValue().Last() != '\n') {
+ m_txt_events_regexp_match->SetValue(m_txt_events_regexp_match->GetValue()+'\n');
+ }
+ if (m_txt_events_regexp_replace->GetValue().Last() != '\n') {
+ m_txt_events_regexp_replace->SetValue(m_txt_events_regexp_replace->GetValue()+'\n');
+ }
wxGetApp().m_events_regexp_match = m_txt_events_regexp_match->GetValue();
wxGetApp().m_events_regexp_replace = m_txt_events_regexp_replace->GetValue();
}
//-------------------------------------------------------------------------
-// OnCancel()
+// OnOK()
//-------------------------------------------------------------------------
-void OptionsDlg::OnCancel(wxCommandEvent& event)
+void OptionsDlg::OnOK(wxCommandEvent& event)
{
- //this->EndModal(wxID_CANCEL);
+ ExchangeData(EXCHANGE_DATA_OUT, true);
+ //this->EndModal(wxID_OK);
this->Show(false);
}
//-------------------------------------------------------------------------
-// OnOK()
+// OnCancel()
//-------------------------------------------------------------------------
-void OptionsDlg::OnOK(wxCommandEvent& event)
+void OptionsDlg::OnCancel(wxCommandEvent& event)
{
- ExchangeData(EXCHANGE_DATA_OUT, true);
- //this->EndModal(wxID_OK);
+ //this->EndModal(wxID_CANCEL);
this->Show(false);
}
//-------------------------------------------------------------------------
-// OnClose()
+// OnApply()
//-------------------------------------------------------------------------
-void OptionsDlg::OnClose(wxCloseEvent& event)
+void OptionsDlg::OnApply(wxCommandEvent& event)
{
- //this->EndModal(wxID_OK);
- this->Show(false);
+ ExchangeData(EXCHANGE_DATA_OUT, true);
}
//-------------------------------------------------------------------------
protected:
// Handlers for events.
- void OnCancel(wxCommandEvent& event);
void OnOK(wxCommandEvent& event);
+ void OnCancel(wxCommandEvent& event);
+ void OnApply(wxCommandEvent& event);
void OnClose(wxCloseEvent& event);
void OnInitDialog(wxInitDialogEvent& event);
wxButton* m_sdbSizer5OK;
wxButton* m_sdbSizer5Cancel;
+ wxButton* m_sdbSizer5Apply;
unsigned int event_in_serial, event_out_serial;
wxGetApp().m_events_regexp_match = pConfig->Read("/Events/regexp_match", wxT("s=(.*)"));
wxGetApp().m_events_regexp_replace = pConfig->Read("/Events/regexp_replace",
wxT("curl http://qso.freedv.org/cgi-bin/onspot.cgi?s=\\1"));
+ // make sure regexp lists are terminated by a \n
+
+ if (wxGetApp().m_events_regexp_match.Last() != '\n') {
+ wxGetApp().m_events_regexp_match = wxGetApp().m_events_regexp_match+'\n';
+ }
+ if (wxGetApp().m_events_regexp_replace.Last() != '\n') {
+ wxGetApp().m_events_regexp_replace = wxGetApp().m_events_regexp_replace+'\n';
+ }
wxGetApp().m_udp_enable = (float)pConfig->Read(wxT("/UDP/enable"), f);
wxGetApp().m_udp_port = (float)pConfig->Read(wxT("/UDP/port"), 3000);
// Start UDP listener thread
m_UDPThread = NULL;
- if (wxGetApp().m_udp_enable) {
- startUDPThread(wxGetApp().m_udp_port);
- }
+ startUDPThread();
optionsDlg = new OptionsDlg(NULL);
m_schedule_restore = false;
wxString s;
if (ret && (checksum_tx == checksum_rx)) {
m_callsign[strlen(m_callsign)-2] = 0;
- s.Printf("rx_txtmsg %s", m_callsign);
+ s.Printf("%s", m_callsign);
m_txtCtrlCallSign->SetValue(s);
- processTxtEvent(m_callsign);
+
+ char s1[MAX_CALLSIGN];
+ sprintf(s1,"rx_txtmsg %s", m_callsign);
+ processTxtEvent(s1);
m_checksumGood++;
s.Printf("%d", m_checksumGood);
delete error_pattern;
}
- // command from UDP thread best processed in main thread
+ // command from UDP thread that is best processed in main thread to avoid seg faults
if (m_schedule_restore) {
- Restore();
+ if (IsIconized())
+ Restore();
m_schedule_restore = false;
}
}
wxString s;
s.Printf("%s", m_callsign);
m_txtCtrlCallSign->SetValue(s);
+ m_checksumGood = m_checksumBad = 0;
+ m_txtChecksumGood->SetLabel(_("0"));
+ m_txtChecksumBad->SetLabel(_("0"));
}
void MainFrame::OnBerReset(wxCommandEvent& event)
m_modal=true;
optionsDlg->Show();
m_modal=false;
-
- // start/stop UDP thread
-
- if (!wxGetApp().m_udp_enable) {
- stopUDPThread();
- }
-
- if (wxGetApp().m_udp_enable && (m_UDPThread == NULL)) {
- startUDPThread(wxGetApp().m_udp_port);
- }
}
//-------------------------------------------------------------------------
wxString regexp_replace = regexp_replace_list.SubString(0, replace_end-1);
//printf("match: %s replace: %s\n", (const char *)regexp_match.c_str(), (const char *)regexp_replace.c_str());
wxRegEx re(regexp_match);
- printf(" checking for match against: %s\n", (const char *)regexp_match.c_str());
+ printf(" checking for match against: %s\n", (const char *)regexp_match.c_str());
// if we found a match, lets run the replace regexp and issue the system command
if (wxGetApp().m_events)
enableSystem = true;
- // If options dialog is up current value of events checkbox overrides wxGetApp().m_events
-
- if (optionsDlg != NULL) {
- if (optionsDlg->enableEventsChecked())
- enableSystem = true;
- else
- enableSystem = false;
- }
-
const char *event_out = event_str_rep.ToUTF8();
wxString event_out_with_return_code;
if (enableSystem) {
- int ret = wxExecute(event_str_rep);
- event_out_with_return_code.Printf(_T("%s -> process ID %d"), event_out, ret);
+ int ret = wxShell(event_str_rep);
+ event_out_with_return_code.Printf(_T("%s -> returned %d"), event_out, ret);
}
else
event_out_with_return_code.Printf(_T("%s)"), event_out);
//printf("data_flag_index: %d\n", data_flag_index);
assert(data_flag_index != -1); // not supported for all rates
- short abit = codec_bits[data_flag_index];
+ short abit[2];
+ abit[0] = codec_bits[data_flag_index];
+ abit[1] = codec_bits[bits_per_codec_frame+11]; // use spare bit, note not FEC protected
char ascii_out;
- int n_ascii = varicode_decode(&g_varicode_dec_states, &ascii_out, &abit, 1, 1);
+ //printf("rx bits %d %d %d\n", abit[0], abit[1], bits_per_codec_frame+11);
+ int n_ascii = varicode_decode(&g_varicode_dec_states, &ascii_out, abit, 1, wxGetApp().m_textEncoding);
assert((n_ascii == 0) || (n_ascii == 1));
if (n_ascii) {
short ashort = ascii_out;
COMP tx_fdm_offset[2*FDMDV_NOM_SAMPLES_PER_FRAME];
int sync_bit;
int i, j, bit, byte, data_flag_index;
- short abit;
+ short abit[2];
int bits_per_fdmdv_frame, bits_per_codec_frame, bytes_per_codec_frame;
bits_per_fdmdv_frame = fdmdv_bits_per_frame(g_pFDMDV);
data_flag_index = codec2_get_spare_bit_index(c2);
assert(data_flag_index != -1); // not supported for all rates
- if (fifo_read(g_txDataInFifo, &abit, 1) == 0)
- bits[data_flag_index] = abit;
+ abit[0] = abit[1] = 0;
+ if (fifo_read(g_txDataInFifo, abit, wxGetApp().m_textEncoding) == 0) {
+ bits[data_flag_index] = abit[0];
+ bits[bits_per_codec_frame+11] = abit[1]; // spare bit that was unused in 1600 mode
+ // note fast varicode must be sent two bits at a time
+ }
else {
bits[data_flag_index] = 0;
- //printf("tx fifle empty - sending a 0!");
+ bits[bits_per_codec_frame+11] = 0;
+ printf("tx fifo empty - sending a 00!\n");
}
/* add FEC ---------------------------------------*/
for(j=0,i=bits_per_codec_frame; i<bits_per_codec_frame+11; i++,j++) {
bits[i] = (codeword1 >> (10-j)) & 0x1;
}
-
- bits[i] = 0; /* spare bit */
}
return n;
}
-void MainFrame::startUDPThread(int port) {
+void MainFrame::startUDPThread(void) {
printf("starting UDP thread!\n");
- m_udp_addr.Service(port);
- m_udp_sock = new wxDatagramSocket(m_udp_addr, wxSOCKET_NOWAIT);
m_UDPThread = new UDPThread;
m_UDPThread->mf = this;
if (m_UDPThread->Create() != wxTHREAD_NO_ERROR ) {
if (m_UDPThread->Run() != wxTHREAD_NO_ERROR ) {
wxLogError(wxT("Can't start thread!"));
delete m_UDPThread;
- delete m_udp_sock;
}
}
if ((m_UDPThread != NULL) && m_UDPThread->m_run) {
m_UDPThread->m_run = 0;
m_UDPThread->Wait();
- delete m_UDPThread;
- delete m_udp_sock;
m_UDPThread = NULL;
}
}
+
+void *UDPThread::Entry() {
+ printf("UDP thread started!\n");
+ while (m_run) {
+ if (wxGetApp().m_udp_enable) {
+ printf("m_udp_enable\n");
+ mf->m_udp_addr.Service(wxGetApp().m_udp_port);
+ mf->m_udp_sock = new wxDatagramSocket(mf->m_udp_addr, wxSOCKET_NOWAIT);
+
+ while (m_run && wxGetApp().m_udp_enable) {
+ if (mf->PollUDP() == 0) {
+ wxThread::Sleep(20);
+ }
+ }
+
+ delete mf->m_udp_sock;
+ }
+ wxThread::Sleep(20);
+ }
+ return NULL;
+}
wxIPV4address m_udp_addr;
wxDatagramSocket *m_udp_sock;
UDPThread *m_UDPThread;
- void startUDPThread(int port);
+ void startUDPThread(void);
void stopUDPThread(void);
int PollUDP();
bool m_schedule_restore;
UDPThread(void) : wxThread(wxTHREAD_JOINABLE) { m_run = 1; }
// thread execution starts here
- void *Entry()
- {
- while (m_run)
- {
- if (mf->PollUDP() == 0) {
- wxThread::Sleep(20);
- }
- }
- return NULL;
- }
+ void *Entry();
// called when the thread exits - whether it terminates normally or is
// stopped with Delete() (but not when it is Kill()ed!)
bSizer15->Add(m_txtCtrlCallSign, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5);
lowerSizer->Add(bSizer15, 1, wxEXPAND, 5);
- m_txtChecksumGood = new wxStaticText(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
- lowerSizer->Add(m_txtChecksumGood, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
- m_txtChecksumBad = new wxStaticText(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
- lowerSizer->Add(m_txtChecksumBad, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
+ wxStaticBoxSizer* sbSizer_Checksum = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, _("Good/Bad Checksums")), wxHORIZONTAL);
+ m_txtChecksumGood = new wxStaticText(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxSize(100,-1), wxALIGN_CENTRE);
+ sbSizer_Checksum->Add(m_txtChecksumGood, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
+ m_txtChecksumBad = new wxStaticText(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxSize(100,-1), wxALIGN_CENTRE);
+ sbSizer_Checksum->Add(m_txtChecksumBad, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
+ lowerSizer->Add(sbSizer_Checksum, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
//=====================================================
// These are the buttons that autosend the userid (?)