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