From 0a6eeb76690dc9e910d2daef2ab293b688de61c7 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Fri, 31 May 2013 22:20:06 +0000 Subject: [PATCH] hooked up serial port logic, still to test and debug git-svn-id: https://svn.code.sf.net/p/freetel/code@1300 01035d8c-6547-0410-b346-abe4f91aad63 --- fdmdv2/src/Makefile.linux | 10 ++- fdmdv2/src/dlg_ptt.cpp | 20 +++++ fdmdv2/src/dlg_ptt.h | 19 +++-- fdmdv2/src/fdmdv2_main.cpp | 166 +++++++++++++++++++++++++++++++++---- fdmdv2/src/fdmdv2_main.h | 10 +++ fdmdv2/src/version.h | 2 +- 6 files changed, 198 insertions(+), 29 deletions(-) diff --git a/fdmdv2/src/Makefile.linux b/fdmdv2/src/Makefile.linux index 23ec27e8..ab6db1b4 100644 --- a/fdmdv2/src/Makefile.linux +++ b/fdmdv2/src/Makefile.linux @@ -83,13 +83,19 @@ HAMLIB_LIB=$(HAMLIB)/src/.libs/libhamlib.a LIBS_TO_BUILD += $(HAMLIB)/.built endif +# CTB --------------------------------------------------- + +CTB=libctb-0.16 +CTB_INC=-I$(CTB)/include +CTB_LIB=$(CTB)/lib/libctb-0.16.a + # FreeDV ------------------------------------------------ CPP_FLAGS = -D_NO_AUTOTOOLS_ $(WX_CPPFLAGS) $(PORTAUDIO_INC) $(CODEC2_INC) \ - $(HAMLIB_INC) $(SOX_INC) -I. -g -Wall -O2 \ + $(HAMLIB_INC) $(CTB_INC) $(SOX_INC) -I. -g -Wall -O2 \ -DSVN_REVISION='"$(SVN_REVISION)"' -MMD -MP FREEDV_LIBS = $(WX_LIBS) $(PORTAUDIO_LIB) $(CODEC2_LIB) $(SOX_LIB) $(HAMLIB_LIB) \ - $(HAMLIB_LIB) -lm -lpthread -lsndfile -lsamplerate $(LIBASOUND) + $(CTB_LIB) -lm -lpthread -lsndfile -lsamplerate $(LIBASOUND) OBJS = topFrame.o \ fdmdv2_main.o \ diff --git a/fdmdv2/src/dlg_ptt.cpp b/fdmdv2/src/dlg_ptt.cpp index 9a8858c8..06236ff9 100644 --- a/fdmdv2/src/dlg_ptt.cpp +++ b/fdmdv2/src/dlg_ptt.cpp @@ -174,6 +174,8 @@ ComPortsDlg::ComPortsDlg(wxWindow* parent, wxWindowID id, const wxString& title, // 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); @@ -186,6 +188,8 @@ ComPortsDlg::~ComPortsDlg() { // 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); @@ -322,6 +326,22 @@ void ComPortsDlg::ExchangeData(int inout) 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() //------------------------------------------------------------------------- diff --git a/fdmdv2/src/dlg_ptt.h b/fdmdv2/src/dlg_ptt.h index 1712e255..34a99e55 100644 --- a/fdmdv2/src/dlg_ptt.h +++ b/fdmdv2/src/dlg_ptt.h @@ -59,14 +59,14 @@ class ComPortsDlg : public wxDialog /* 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 */ @@ -78,6 +78,9 @@ class ComPortsDlg : public wxDialog protected: void populatePortList(); + void PTTUseHamLibClicked(wxCommandEvent& event); + void PTTUseSerialClicked(wxCommandEvent& event); + void OnOK(wxCommandEvent& event); void OnCancel(wxCommandEvent& event); void OnApply(wxCommandEvent& event); diff --git a/fdmdv2/src/fdmdv2_main.cpp b/fdmdv2/src/fdmdv2_main.cpp index a2993b0f..9baae5b4 100644 --- a/fdmdv2/src/fdmdv2_main.cpp +++ b/fdmdv2/src/fdmdv2_main.cpp @@ -182,7 +182,8 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent) { 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(); @@ -376,8 +377,6 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent) m_btnTogPTT->Disable(); //m_togBtnALC->Disable(); - OpenHamlibRig(); - // squelch settings char sqsnr[15]; m_sliderSQ->SetValue((int)(g_SquelchLevel*2.0)); @@ -933,6 +932,9 @@ void MainFrame::OnTogBtnPTT (wxCommandEvent& event) } 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 @@ -944,15 +946,54 @@ void MainFrame::togglePTT(void) { 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); @@ -1413,14 +1454,22 @@ void MainFrame::OnToolsComCfg(wxCommandEvent& event) 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; } @@ -1518,7 +1567,8 @@ void MainFrame::OnHelpAbout(wxCommandEvent& event) } -//bool wxLaunchDefaultBrowser(http:("http://freedv.org/"); + +// Attempt to talk to rig using Hamlib bool MainFrame::OpenHamlibRig() { if (wxGetApp().m_boolHamlibUseForPTT != true) @@ -1647,6 +1697,13 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event) //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(); @@ -1660,6 +1717,7 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event) } // Stop was pressed or start up failed + if (startStop.IsSameAs("Stop") || !m_RxRunning ) { // @@ -1670,15 +1728,24 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event) 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); @@ -3004,3 +3071,66 @@ void fdmdv2_clickTune(float freq) { 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; + } +} diff --git a/fdmdv2/src/fdmdv2_main.h b/fdmdv2/src/fdmdv2_main.h index f4e5c014..4b236537 100644 --- a/fdmdv2/src/fdmdv2_main.h +++ b/fdmdv2/src/fdmdv2_main.h @@ -52,6 +52,10 @@ #include #include +#include "ctb-0.16/ctb.h" +#include "ctb-0.16/portscan.h" +#include "ctb-0.16/serportx.h" +#include "ctb-0.16/serport.h" #include "codec2.h" #include "codec2_fdmdv.h" @@ -331,6 +335,9 @@ class MainFrame : public TopFrame txRxThread* m_txRxThread; bool OpenHamlibRig(); + void SetupSerialPort(void); + void CloseSerialPort(void); + void SerialPTTRx(void); #ifdef _USE_TIMER wxTimer m_plotTimer; @@ -366,6 +373,9 @@ class MainFrame : public TopFrame protected: + ctb::IOBase* m_device; + ctb::SerialPort* m_serialPort; + void setsnrBeta(bool snrSlow); // protected event handlers diff --git a/fdmdv2/src/version.h b/fdmdv2/src/version.h index 5ebb6f5e..66aabee4 100644 --- a/fdmdv2/src/version.h +++ b/fdmdv2/src/version.h @@ -1,6 +1,6 @@ #ifndef FREEDV_VER_DOT_H #define FREEDV_VER_DOT_H 1 -#define FREEDV_VERSION "0.96.2 Beta" +#define FREEDV_VERSION "0.96.3 Beta" #endif //FREEDV_VER_DOT_H -- 2.25.1