// Connect events
this->Connect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(ComPortsDlg::OnInitDialog), NULL, this);
+ m_ckUseHamlibPTT->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(ComPortsDlg::PTTUseHamLibClicked), NULL, this);
+ m_ckUseSerialPTT->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(ComPortsDlg::PTTUseSerialClicked), NULL, this);
m_buttonOK->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(ComPortsDlg::OnOK), NULL, this);
m_buttonCancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(ComPortsDlg::OnCancel), NULL, this);
m_buttonApply->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(ComPortsDlg::OnApply), NULL, this);
{
// Disconnect Events
this->Disconnect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(ComPortsDlg::OnInitDialog), NULL, this);
+ m_ckUseHamlibPTT->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(ComPortsDlg::PTTUseHamLibClicked), NULL, this);
+ m_ckUseSerialPTT->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(ComPortsDlg::PTTUseSerialClicked), NULL, this);
m_buttonOK->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(ComPortsDlg::OnOK), NULL, this);
m_buttonCancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(ComPortsDlg::OnCancel), NULL, this);
m_buttonApply->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(ComPortsDlg::OnApply), NULL, this);
delete wxConfigBase::Set((wxConfigBase *) NULL);
}
+//-------------------------------------------------------------------------
+// PTTUseHamLibClicked()
+//-------------------------------------------------------------------------
+void ComPortsDlg::PTTUseHamLibClicked(wxCommandEvent& event)
+{
+ m_ckUseSerialPTT->SetValue(false);
+}
+
+//-------------------------------------------------------------------------
+// PTTUseSerialClicked()
+//-------------------------------------------------------------------------
+void ComPortsDlg::PTTUseSerialClicked(wxCommandEvent& event)
+{
+ m_ckUseHamlibPTT->SetValue(false);
+}
+
//-------------------------------------------------------------------------
// OnApply()
//-------------------------------------------------------------------------
/* Serial Settings */
- wxListBox* m_listCtrlPorts;
- wxCheckBox* m_ckUseSerialPTT;
- wxStaticText* m_staticText12;
- wxTextCtrl *m_txtCtlDevicePath;
- wxRadioButton* m_rbUseDTR;
- wxCheckBox* m_ckRTSPos;
- wxRadioButton* m_rbUseRTS;
- wxCheckBox* m_ckDTRPos;
+ wxListBox *m_listCtrlPorts;
+ wxCheckBox *m_ckUseSerialPTT;
+ wxStaticText *m_staticText12;
+ wxTextCtrl *m_txtCtlDevicePath;
+ wxRadioButton *m_rbUseDTR;
+ wxCheckBox *m_ckRTSPos;
+ wxRadioButton *m_rbUseRTS;
+ wxCheckBox *m_ckDTRPos;
/* Ok - Cancel - Apply */
protected:
void populatePortList();
+ void PTTUseHamLibClicked(wxCommandEvent& event);
+ void PTTUseSerialClicked(wxCommandEvent& event);
+
void OnOK(wxCommandEvent& event);
void OnCancel(wxCommandEvent& event);
void OnApply(wxCommandEvent& event);
{
m_zoom = 1.;
- /* TODO(Joel): Try making hamlib owned by MainFrame. */
+ // Init Hamlib library, but we dont start talking to any rigs yet
+
wxGetApp().m_hamlib = new Hamlib();
tools->AppendSeparator();
m_btnTogPTT->Disable();
//m_togBtnALC->Disable();
- OpenHamlibRig();
-
// squelch settings
char sqsnr[15];
m_sliderSQ->SetValue((int)(g_SquelchLevel*2.0));
}
void MainFrame::togglePTT(void) {
+
+ // Change tabbed page in centre panel depending on PTT state
+
if (g_tx)
{
// tx-> rx transition, swap to the page we were on for last rx
wxGetApp().m_rxNbookCtrl = m_auiNbookCtrl->GetSelection();
m_auiNbookCtrl->ChangeSelection(m_auiNbookCtrl->GetPageIndex((wxWindow *)m_panelSpeechIn));
}
+
g_tx = m_btnTogPTT->GetValue();
- // Hamlib
- Hamlib *rig = wxGetApp().m_hamlib;
- if (wxGetApp().m_boolHamlibUseForPTT && rig != NULL) {
- rig->ptt(g_tx);
+ // Hamlib PTT
+
+ if (wxGetApp().m_boolHamlibUseForPTT) {
+ Hamlib *rig = wxGetApp().m_hamlib;
+ if (wxGetApp().m_boolHamlibUseForPTT && rig != NULL) {
+ rig->ptt(g_tx);
+ }
+ }
+
+ // Serial PTT
+
+ /* Truth table:
+
+ g_tx RTSPos RTS
+ -------------------
+ 0 1 0
+ 1 1 1
+ 0 0 1
+ 1 0 0
+
+ -> exclusive NOR
+ */
+
+ if(wxGetApp().m_boolUseSerialPTT && m_serialPort != NULL) {
+ if (wxGetApp().m_boolUseRTS) {
+ bool serialLine = !(g_tx ^ wxGetApp().m_boolRTSPos);
+ printf("g_tx: %d m_boolRTSPos: %d serialLine: %d\n", g_tx, wxGetApp().m_boolRTSPos, serialLine);
+ if (serialLine)
+ m_serialPort->SetLineState(ctb::LinestateRts);
+ else
+ m_serialPort->ClrLineState(ctb::LinestateRts);
+ }
+ if (wxGetApp().m_boolUseDTR) {
+ bool serialLine = !(g_tx ^ wxGetApp().m_boolRTSPos);
+ printf("g_tx: %d m_boolDTRPos: %d serialLine: %d\n", g_tx, wxGetApp().m_boolDTRPos, serialLine);
+ if (serialLine)
+ m_serialPort->SetLineState(ctb::LinestateCts);
+ else
+ m_serialPort->ClrLineState(ctb::LinestateCts);
+ }
+
}
// reset level gauge
+
m_maxLevel = 0;
m_textLevel->SetLabel(wxT(""));
m_gaugeLevel->SetValue(0);
wxUnusedVar(event);
ComPortsDlg *dlg = new ComPortsDlg(NULL);
- if(dlg->ShowModal() == wxID_OK)
+
+ int rv = dlg->ShowModal();
+
+ // test Hamlib/Serial set up
+
+ if(rv == wxID_OK)
{
- dlg->ExchangeData(EXCHANGE_DATA_OUT);
- /* Opening is done on app start. If the user has just
- * adjusted the hamlib settings, do an open when they press
- * okay. */
- OpenHamlibRig();
+ if (wxGetApp().m_boolHamlibUseForPTT) {
+ OpenHamlibRig();
+ }
+ if (wxGetApp().m_boolUseSerialPTT) {
+ SetupSerialPort();
+ CloseSerialPort();
+ }
}
+
delete dlg;
}
}
-//bool wxLaunchDefaultBrowser(http:("http://freedv.org/");
+
+// Attempt to talk to rig using Hamlib
bool MainFrame::OpenHamlibRig() {
if (wxGetApp().m_boolHamlibUseForPTT != true)
//printf("g_stats.snr: %f\n", g_stats.snr_est);
+ // attempt to start PTT ......
+
+ if (wxGetApp().m_boolHamlibUseForPTT)
+ OpenHamlibRig();
+ if (wxGetApp().m_boolUseSerialPTT)
+ SetupSerialPort();
+
// attempt to start sound cards and tx/rx processing
startRxStream();
}
// Stop was pressed or start up failed
+
if (startStop.IsSameAs("Stop") || !m_RxRunning ) {
//
m_plotTimer.Stop();
#endif // _USE_TIMER
- // ensure we are not transmitting
- Hamlib *rig = wxGetApp().m_hamlib;
- if (wxGetApp().m_boolHamlibUseForPTT && rig != NULL) {
- rig->ptt(false);
+ // ensure we are not transmitting and shut down audio processing
+
+ if (wxGetApp().m_boolHamlibUseForPTT) {
+ Hamlib *rig = wxGetApp().m_hamlib;
+ if (wxGetApp().m_boolHamlibUseForPTT && rig != NULL) {
+ rig->ptt(false);
+ }
}
+
+ if (wxGetApp().m_boolUseSerialPTT)
+ CloseSerialPort();
+
m_btnTogPTT->SetValue(false);
stopRxStream();
+ // free up states
+
free(g_error_pattern);
fifo_destroy(g_errorFifo);
fdmdv_destroy(g_pFDMDV);
g_RxFreqOffsetHz = FDMDV_FCENTRE - freq;
}
}
+
+//----------------------------------------------------------------
+// SetupSerialPort()
+//----------------------------------------------------------------
+void MainFrame::SetupSerialPort(void)
+{
+ long baudrate;
+
+ baudrate = 10;
+ if(!wxGetApp().m_strRigCtrlPort.IsEmpty())
+ {
+ wxString protocol = _("8N1");
+ m_serialPort = new ctb::SerialPort();
+ if(m_serialPort->Open(wxGetApp().m_strRigCtrlPort.c_str(), baudrate, protocol.c_str(), ctb::SerialPort::NoFlowControl ) >= 0 )
+ {
+ m_device = m_serialPort;
+ // always start PTT in Rx state
+ SerialPTTRx();
+ }
+ else
+ {
+ m_serialPort = NULL;
+ m_device = NULL;
+ }
+ }
+}
+
+void MainFrame::SerialPTTRx(void)
+{
+ if(wxGetApp().m_boolRTSPos) // RTS cleared LOW
+ {
+ m_serialPort->ClrLineState(ctb::LinestateRts);
+ }
+ else // RTS cleared HIGH
+ {
+ m_serialPort->SetLineState(ctb::LinestateRts);
+ }
+ if(wxGetApp().m_boolDTRPos) // DTR cleared LOW
+ {
+ m_serialPort->ClrLineState(ctb::LinestateDtr);
+ }
+ else // DTR cleared HIGH
+ {
+ m_serialPort->SetLineState(ctb::LinestateDtr);
+ }
+}
+
+//----------------------------------------------------------------
+// CloseSerialPort()
+//----------------------------------------------------------------
+void MainFrame::CloseSerialPort(void)
+{
+ // always end with PTT in rx state
+
+ SerialPTTRx();
+
+ if((m_serialPort != NULL) && m_serialPort->IsOpen())
+ {
+ m_serialPort->Close();
+ m_serialPort = NULL;
+ m_device = NULL;
+ }
+}