hooked up serial port logic, still to test and debug
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 31 May 2013 22:20:06 +0000 (22:20 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 31 May 2013 22:20:06 +0000 (22:20 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1300 01035d8c-6547-0410-b346-abe4f91aad63

fdmdv2/src/Makefile.linux
fdmdv2/src/dlg_ptt.cpp
fdmdv2/src/dlg_ptt.h
fdmdv2/src/fdmdv2_main.cpp
fdmdv2/src/fdmdv2_main.h
fdmdv2/src/version.h

index 23ec27e8ee1c02d26bd623f3cf35b6b80b4f697b..ab6db1b4a9c9b27cb3705a7455ef710b69f3d8d1 100644 (file)
@@ -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 \
index 9a8858c850e54c5bdd637cafc2d3996463755067..06236ff96098a3dca0d3bf7aaac74c9e8fa9e783 100644 (file)
@@ -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()
 //-------------------------------------------------------------------------
index 1712e255718195e8d9a5da60c133f37c866583fc..34a99e55d6c9d9b40b3a2d61d0a0694d58ff0d47 100644 (file)
@@ -59,14 +59,14 @@ class ComPortsDlg : public wxDialog
 
         /* Serial Settings */
 
-        wxListBoxm_listCtrlPorts;
-        wxCheckBoxm_ckUseSerialPTT;
-        wxStaticTextm_staticText12;
-        wxTextCtrl *m_txtCtlDevicePath;
-        wxRadioButtonm_rbUseDTR;
-        wxCheckBoxm_ckRTSPos;
-        wxRadioButtonm_rbUseRTS;
-        wxCheckBoxm_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);
index a2993b0f4f55900b08a9f93afd7db48f8f36687b..9baae5b4792c7377160fced1370d8516a7d8f7cf 100644 (file)
@@ -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;
+    }
+}
index f4e5c014c961e960657382ed6ac5f47d9f01583b..4b23653758d50ae1a08b8f07769b7e6de3a3c9bc 100644 (file)
 #include <samplerate.h>
 
 #include <hamlib.h> 
+#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
index 5ebb6f5ebe971202c3c05614db21becc9739e009..66aabee463b670ebb739e50971665dae40f85376 100644 (file)
@@ -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