My radio interface - works for me.

Based upon SVN r1245 and previous patches

>From d6dd2a2f461ab1482ec5feb154549e1ac72378f8 Mon Sep 17 00:00:00 2001
From: "A. Maitland Bottoms" <[email protected]>
Date: Sun, 27 Jan 2013 20:01:21 -0500
Subject: [PATCH] Initial working HID PTT changes, GPIO=2 only
Comment: updated for 0.96 update, SVN r1228, March 2013

---
 src/dlg_comports.cpp |   43 +++++++++++++++++++++--
 src/dlg_comports.h   |    4 +++
 src/fdmdv2_main.cpp  |   94 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/fdmdv2_main.h    |   15 ++++++++
 4 files changed, 153 insertions(+), 3 deletions(-)

--- a/src/dlg_comports.cpp
+++ b/src/dlg_comports.cpp
@@ -66,12 +66,20 @@
     wxArrayString m_listCtrlPortsArr;
     m_listCtrlPorts = new wxListBox(this, wxID_ANY, wxDefaultPosition, 
wxSize(-1,45), m_listCtrlPortsArr, wxLB_SINGLE | wxLB_SORT);
     staticBoxSizer31->Add(m_listCtrlPorts, 1, wxALIGN_CENTER, 0);
+
+    m_ckUseHIDPTT = new wxCheckBox(this, wxID_ANY, _("Use HID Port PTT"), 
wxDefaultPosition, wxSize(-1,-1), 0);
+    m_ckUseHIDPTT->SetValue(false);
+    staticBoxSizer31->Add(m_ckUseHIDPTT, 0, wxALIGN_LEFT, 20);
+
+    wxArrayString m_listHidPortsArr;
+    m_listHidPorts = new wxListBox(this, wxID_ANY, wxDefaultPosition, 
wxSize(-1,45), m_listHidPortsArr, wxLB_SINGLE | wxLB_SORT);
+    staticBoxSizer31->Add(m_listHidPorts, 1, wxALIGN_CENTER, 0);
 #endif
 #ifdef __WXGTK__
     wxBoxSizer* bSizer83;
     bSizer83 = new wxBoxSizer(wxHORIZONTAL);
 
-    wxGridSizer* gridSizer200 = new wxGridSizer(1, 3, 0, 0);
+    wxGridSizer* gridSizer200 = new wxGridSizer(2, 3, 0, 0);
     
     m_ckUseSerialPTT = new wxCheckBox(this, wxID_ANY, _("Use Serial Port 
PTT"), wxDefaultPosition, wxSize(-1,-1), 0);
     m_ckUseSerialPTT->SetValue(false);
@@ -86,13 +94,26 @@
 //    gridSizer200->Add(m_txtCtlDevicePath, 1, 
wxALIGN_CENTER|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 2);
     gridSizer200->Add(m_txtCtlDevicePath, 1, 
wxEXPAND|wxALIGN_CENTER|wxALIGN_RIGHT, 2);
     
+    m_ckUseHIDPTT = new wxCheckBox(this, wxID_ANY, _("Use HID Port PTT"), 
wxDefaultPosition, wxSize(-1,-1), 0);
+    m_ckUseHIDPTT->SetValue(false);
+    gridSizer200->Add(m_ckUseHIDPTT, 1, 
wxALIGN_CENTER|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 2);
+
+    m_staticText12 = new wxStaticText(this, wxID_ANY, _("Device:  "), 
wxDefaultPosition, wxDefaultSize, 0);
+    m_staticText12->Wrap(-1);
+    gridSizer200->Add(m_staticText12, 1,wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 
2);
+//    gridSizer200->Add(m_staticText12, 1, 
wxEXPAND|wxALIGN_CENTER|wxALIGN_RIGHT, 2);
+
+    m_txtHidDevicePath = new wxTextCtrl(this, wxID_ANY, wxEmptyString, 
wxDefaultPosition, wxDefaultSize, 0);
+//    gridSizer200->Add(m_txtHidDevicePath, 1, 
wxALIGN_CENTER|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 2);
+    gridSizer200->Add(m_txtHidDevicePath, 1, 
wxEXPAND|wxALIGN_CENTER|wxALIGN_RIGHT, 2);
+
     bSizer83->Add(gridSizer200, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | 
wxALL, 2);
     staticBoxSizer31->Add(bSizer83, 1, wxALIGN_CENTER_VERTICAL|wxALL, 1);
 
 #endif
     wxBoxSizer* boxSizer19 = new wxBoxSizer(wxVERTICAL);
     staticBoxSizer17->Add(boxSizer19, 1, wxEXPAND, 5);
-    wxStaticBoxSizer* staticBoxSizer16 = new wxStaticBoxSizer( new 
wxStaticBox(this, wxID_ANY, _("Signal polarity")), wxHORIZONTAL);
+    wxStaticBoxSizer* staticBoxSizer16 = new wxStaticBoxSizer( new 
wxStaticBox(this, wxID_ANY, _("Serial Port PTT Signal polarity")), 
wxHORIZONTAL);
     boxSizer19->Add(staticBoxSizer16, 1, 
wxEXPAND|wxALIGN_CENTER|wxALIGN_RIGHT, 5);
 
     wxGridSizer* gridSizer17 = new wxGridSizer(2, 2, 0, 0);
@@ -148,6 +169,7 @@
     this->Connect(wxEVT_INIT_DIALOG, 
wxInitDialogEventHandler(ComPortsDlg::OnInitDialog), NULL, this);
 //    m_ckPTTRtChan->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, 
wxCommandEventHandler(ComPortsDlg::PTTAudioClick), NULL, this);
 //    m_listCtrlPorts->Connect(wxEVT_COMMAND_LISTBOX_SELECTED, 
wxCommandEventHandler(ComPortsDlg::PTTPortSlelcted), NULL, this);
+    m_ckUseHIDPTT->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, 
wxCommandEventHandler(ComPortsDlg::PTTUseHIDClicked), NULL, this);
     m_ckUseSerialPTT->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, 
wxCommandEventHandler(ComPortsDlg::PTTUseSerialClicked), NULL, this);
     m_rbUseDTR->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, 
wxCommandEventHandler(ComPortsDlg::UseDTRCliched), NULL, this);
     m_rbUseRTS->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, 
wxCommandEventHandler(ComPortsDlg::UseRTSClicked), NULL, this);
@@ -167,6 +189,7 @@
     this->Disconnect(wxEVT_INIT_DIALOG, 
wxInitDialogEventHandler(ComPortsDlg::OnInitDialog), NULL, this);
 //    m_ckPTTRtChan->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, 
wxCommandEventHandler(ComPortsDlg::PTTAudioClick), NULL, this);
 //    m_listCtrlPorts->Disconnect(wxEVT_COMMAND_LISTBOX_SELECTED, 
wxCommandEventHandler(ComPortsDlg::PTTPortSlelcted), NULL, this);
+    m_ckUseHIDPTT->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, 
wxCommandEventHandler(ComPortsDlg::PTTUseHIDClicked), NULL, this);
     m_ckUseSerialPTT->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, 
wxCommandEventHandler(ComPortsDlg::PTTUseSerialClicked), NULL, this);
     m_rbUseDTR->Disconnect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, 
wxCommandEventHandler(ComPortsDlg::UseDTRCliched), NULL, this);
     m_rbUseRTS->Disconnect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, 
wxCommandEventHandler(ComPortsDlg::UseRTSClicked), NULL, this);
@@ -241,19 +264,23 @@
 void ComPortsDlg::ExchangeData(int inout)
 {
     wxConfigBase *pConfig = wxConfigBase::Get();
-    wxString str;
+    wxString str,hidstr;
     
     if(inout == EXCHANGE_DATA_IN)
     {
 //        m_ckUsePTTRtChan->SetValue(wxGetApp().m_boolUseTonePTT);
         m_ckHalfDuplex->SetValue(wxGetApp().m_boolHalfDuplex);
         m_ckUseSerialPTT->SetValue(wxGetApp().m_boolUseSerialPTT);
+        m_ckUseHIDPTT->SetValue(wxGetApp().m_boolUseHIDPTT);
         str = wxGetApp().m_strRigCtrlPort;
+        hidstr = wxGetApp().m_strRigHidPort;
 #ifdef __WXMSW__
         m_listCtrlPorts->SetStringSelection(str);
+        m_listHidPorts->SetStringSelection(hidstr);
 #endif
 #ifdef __WXGTK__
         m_txtCtlDevicePath->SetValue(str);
+        m_txtHidDevicePath->SetValue(hidstr);
 #endif
         str = wxGetApp().m_strRigCtrlBaud;
 
@@ -271,12 +298,15 @@
     {
         wxGetApp().m_boolHalfDuplex             = m_ckHalfDuplex->GetValue();
         wxGetApp().m_boolUseSerialPTT           = 
m_ckUseSerialPTT->IsChecked();
+        wxGetApp().m_boolUseHIDPTT           = m_ckUseHIDPTT->IsChecked();
 //        wxGetApp().m_boolUseTonePTT             = 
m_ckUsePTTRtChan->IsChecked();
 #ifdef __WXMSW__
         wxGetApp().m_strRigCtrlPort             = 
m_listCtrlPorts->GetStringSelection();
+        wxGetApp().m_strRigHidPort             = 
m_listHidPorts->GetStringSelection();
 #endif
 #ifdef __WXGTK__
         wxGetApp().m_strRigCtrlPort             = 
m_txtCtlDevicePath->GetValue();
+        wxGetApp().m_strRigHidPort             = 
m_txtHidDevicePath->GetValue();
 #endif
         wxGetApp().m_boolUseRTS                 = m_rbUseRTS->GetValue();
         wxGetApp().m_boolRTSPos                 = m_ckRTSPos->IsChecked();
@@ -289,6 +319,7 @@
         pConfig->Write(wxT("/Rig/DTRPolarity"),     wxGetApp().m_boolDTRPos);
         pConfig->Write(wxT("/Rig/UseTonePTT"),      
wxGetApp().m_boolUseTonePTT);
         pConfig->Write(wxT("/Rig/UseSerialPTT"),    
wxGetApp().m_boolUseSerialPTT);
+        pConfig->Write(wxT("/Rig/UseHIDPTT"),    wxGetApp().m_boolUseHIDPTT);
 
 //        wxGetApp().m_strRigCtrlBaud             = 
m_listCtrlBaudrates->GetStringSelection();
 //        wxGetApp().m_strRigCtrlDatabits         = 
m_textRigCtrlDatabits->GetValue();
@@ -313,6 +344,12 @@
 }
 
 //-------------------------------------------------------------------------
+// PTTUseHIDClicked()
+//-------------------------------------------------------------------------
+void ComPortsDlg::PTTUseHIDClicked(wxCommandEvent& event)
+{
+}
+//-------------------------------------------------------------------------
 // PTTUseSerialClicked()
 //-------------------------------------------------------------------------
 void ComPortsDlg::PTTUseSerialClicked(wxCommandEvent& event)
--- a/src/dlg_comports.h
+++ b/src/dlg_comports.h
@@ -48,9 +48,12 @@
         wxCheckBox* m_ckHalfDuplex;
         wxCheckBox* m_ckUsePTTRtChan;
         wxListBox* m_listCtrlPorts;
+        wxListBox* m_listHidPorts;
+        wxCheckBox* m_ckUseHIDPTT;
         wxCheckBox* m_ckUseSerialPTT;
         wxStaticText* m_staticText12;
         wxTextCtrl *m_txtCtlDevicePath;
+        wxTextCtrl *m_txtHidDevicePath;
         wxRadioButton* m_rbUseDTR;
         wxCheckBox* m_ckRTSPos;
         wxRadioButton* m_rbUseRTS;
@@ -65,6 +68,7 @@
         void populatePortList(void);
         void PTTAudioClick(wxCommandEvent& event);
 //        void PTTPortSlelcted(wxCommandEvent& event);
+        void PTTUseHIDClicked(wxCommandEvent& event);
         void PTTUseSerialClicked(wxCommandEvent& event);
         void UseDTRCliched(wxCommandEvent& event);
         //void DTRVPlusClicked(wxCommandEvent& event);
--- a/src/fdmdv2_main.cpp
+++ b/src/fdmdv2_main.cpp
@@ -308,6 +308,7 @@
             g_nSoundCards = 2;
     }
 
+    wxGetApp().m_strRigHidPort      = pConfig->Read(wxT("/Rig/HIDPort"),       
     wxT("/dev/hidraw0"));
     wxGetApp().m_strRigCtrlPort     = pConfig->Read(wxT("/Rig/Port"),          
     wxT("COM3"));
     wxGetApp().m_strRigCtrlBaud     = pConfig->Read(wxT("/Rig/Baud"),          
     wxT("9600"));
     wxGetApp().m_strRigCtrlDatabits = pConfig->Read(wxT("/Rig/DataBits"),      
     wxT("8"));
@@ -315,6 +316,7 @@
     wxGetApp().m_strRigCtrlParity   = pConfig->Read(wxT("/Rig/Parity"),        
     wxT("n"));
     wxGetApp().m_boolUseTonePTT     = pConfig->Read(wxT("/Rig/UseTonePTT"),    
 (bool*) false);
     wxGetApp().m_boolHalfDuplex     = pConfig->Read(wxT("/Rig/HalfDuplex"),    
 (bool*) true);
+    wxGetApp().m_boolUseHIDPTT      = pConfig->Read(wxT("/Rig/UseHIDPTT"),     
 (bool*) false);
     wxGetApp().m_boolUseSerialPTT   = pConfig->Read(wxT("/Rig/UseSerialPTT"),  
 (bool*) false);
     wxGetApp().m_boolUseRTS         = pConfig->Read(wxT("/Rig/UseRTS"),        
 (bool*) true);
     wxGetApp().m_boolRTSPos         = pConfig->Read(wxT("/Rig/RTSPolarity"),   
 (bool*) false);
@@ -376,6 +378,7 @@
     //m_togBtnALC->Disable();
 
     SetupSerialPort();
+    SetupHIDPort();
 
     // squelch settings
     char sqsnr[15];
@@ -494,6 +497,7 @@
         pConfig->Write(wxT("/Audio/soundCard2OutDeviceNum"),  
g_soundCard2OutDeviceNum);
         pConfig->Write(wxT("/Audio/soundCard2SampleRate"),    
g_soundCard2SampleRate );
 
+        pConfig->Write(wxT("/Rig/HIDPort"),                 
wxGetApp().m_strRigHidPort);
         pConfig->Write(wxT("/Rig/Port"),                    
wxGetApp().m_strRigCtrlPort);
         pConfig->Write(wxT("/Rig/Baud"),                    
wxGetApp().m_strRigCtrlBaud);
         pConfig->Write(wxT("/Rig/DataBits"),                
wxGetApp().m_strRigCtrlDatabits);
@@ -528,6 +532,7 @@
     //m_togBtnALC->Disconnect(wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(MainFrame::OnTogBtnALCClickUI), NULL, this);
     //m_btnTogPTT->Disconnect(wxEVT_UPDATE_UI, 
wxUpdateUIEventHandler(MainFrame::OnTogBtnPTT_UI), NULL, this);
 
+    CloseHIDPort();
     CloseSerialPort();
     sox_biquad_finish();
 
@@ -986,6 +991,13 @@
             }
         }
     }
+    if(wxGetApp().m_boolUseHIDPTT && m_hidPort >= 0)
+    {
+        if(event.IsChecked())
+         HIDPTT(1);
+        else  // !isChecked() - so Clear
+         HIDPTT(0);
+    }
     // reset level gauge
     m_maxLevel = 0;
     m_textLevel->SetLabel(wxT(""));
@@ -1392,6 +1404,7 @@
     m_togBtnAnalog->Disable();
     //m_togBtnALC->Disable();
     //m_btnTogPTT->Disable();
+    CloseHIDPort();
     CloseSerialPort();
     Pa_Terminate();
     Destroy();
@@ -3122,3 +3135,84 @@
         //m_btnTogPTT->Enable(false);
     }
 }
+
+//----------------------------------------------------------------
+// HIDPTT(int pushed)
+//----------------------------------------------------------------
+void MainFrame::HIDPTT(int pushed)
+{
+#ifdef HAVE_LINUX_HIDRAW_H
+  m_hidGPIO = 2;
+  if (m_hidPort>0) {
+    // Build two packets for CM108 HID.  One turns a GPIO bit on.  The other 
turns it off.
+    // Packet is 4 bytes, preceded by a 'report number' byte
+    // 0x00 report number
+    // Write data packet (from CM108 documentation)
+    // byte 0: 00xx xxxx     Write GPIO
+    // byte 1: xxxx dcba     GPIO3-0 output values (1=high)
+    // byte 2: xxxx dcba     GPIO3-0 data-direction register (1=output)
+    // byte 3: xxxx xxxx     SPDIF
+
+    char out_rep[] = {
+      0x00, // report number
+      // HID output report
+      0x00,
+      pushed ? (1 << m_hidGPIO) : 0, // set GPIO
+      1 << m_hidGPIO, // Data direction register (1=output)
+      0x00
+    };
+
+    printf("HIDPTT: using gpio=%d\n", m_hidGPIO);
+    printf("HIDPTT: ptt state=%d\n", pushed ? (1 << m_hidGPIO) : 0);
+    if (write(m_hidPort, out_rep, sizeof(out_rep)) < 0) {
+      printf("HIDPTT: CM108 write error\n");
+    }
+  }
+#endif
+}
+
+//----------------------------------------------------------------
+// SetupHIDPort()
+//----------------------------------------------------------------
+void MainFrame::SetupHIDPort(void)
+{
+#ifdef HAVE_LINUX_HIDRAW_H
+  struct hidraw_devinfo hiddevinfo;
+
+    if(!wxGetApp().m_strRigHidPort.IsEmpty())
+    {
+      m_hidPort = open(wxGetApp().m_strRigHidPort.c_str(),O_RDWR,0);
+      // 0x0d8c is the vendor id of CMedia USB sound devices that may have HID 
GPIO features
+      if ((m_hidPort >=0)&&(!ioctl(m_hidPort, HIDIOCGRAWINFO, &hiddevinfo) && 
hiddevinfo.vendor == 0x0d8c))
+        {
+            //  always start with PTT cleared
+           HIDPTT(0);
+            //m_btnTogPTT->Enable(true);
+            m_btnTogPTT->SetValue(false);
+        }
+        else
+        {
+#endif
+            m_hidPort = -1;
+            m_hidGPIO = -1;
+            //m_btnTogPTT->Disable();
+#ifdef HAVE_LINUX_HIDRAW_H
+        }
+    }
+#endif
+}
+
+//----------------------------------------------------------------
+// CloseHIDPort()
+//----------------------------------------------------------------
+void MainFrame::CloseHIDPort(void)
+{
+    if(m_hidPort != 0)
+    {
+      close(m_hidPort);
+      m_hidPort = 0;
+      m_hidGPIO = -1;
+      //m_btnTogPTT->SetLabel(wxT("PTT"));
+      //m_btnTogPTT->Enable(false);
+    }
+}
--- a/src/fdmdv2_main.h
+++ b/src/fdmdv2_main.h
@@ -51,6 +51,15 @@
 #include <wx/listbox.h>
 #include <wx/textdlg.h>
 
+#define HAVE_LINUX_HIDRAW_H
+#ifdef HAVE_LINUX_HIDRAW_H
+#include <linux/hidraw.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#endif
+
 #include <samplerate.h>
 
 #include "codec2.h"
@@ -135,11 +144,13 @@
         wxString            m_strBitrate;
 
         wxString            m_strRigCtrlPort;
+        wxString            m_strRigHidPort;
         wxString            m_strRigCtrlBaud;
         wxString            m_strRigCtrlDatabits;
         wxString            m_strRigCtrlStopbits;
         wxString            m_strRigCtrlParity;
         bool                m_boolHalfDuplex;
+        bool                m_boolUseHIDPTT;
         bool                m_boolUseSerialPTT;
         bool                m_boolUseTonePTT;
         bool                m_boolUseRTS;
@@ -321,6 +332,9 @@
         
         txRxThread*             m_txRxThread;
 
+        void HIDPTT(int pushed);
+        void SetupHIDPort(void);
+        void CloseHIDPort(void);
         void SetupSerialPort(void);
         void CloseSerialPort(void);
 
@@ -358,6 +372,8 @@
 
         ctb::IOBase*            m_device;
         ctb::SerialPort*        m_serialPort;
+       int                     m_hidPort;
+       int                     m_hidGPIO;
 
         void setsnrBeta(bool snrSlow);
 
------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may
_______________________________________________
Freetel-codec2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freetel-codec2

Reply via email to