2018-06-19 12:58:52 -07:00
# include "rigcommander.h"
# include <QDebug>
2018-11-24 00:10:05 -08:00
# include "rigidentities.h"
2021-02-23 21:21:22 +00:00
# include "logcategories.h"
2023-01-21 13:38:39 -08:00
# include "printhex.h"
2018-11-24 00:10:05 -08:00
2023-04-24 08:37:10 +01:00
// Copyright 2017-2023 Elliott H. Liggett W6EL and Phil E. Taylor M0VSE
2018-11-16 14:08:21 -08:00
// This file parses data from the radio and also forms commands to the radio.
// The radio physical interface is handled by the commHandler() instance "comm"
2018-06-19 12:58:52 -07:00
//
// See here for a wonderful CI-V overview:
// http://www.plicht.de/ekki/civ/civ-p0a.html
//
// The IC-7300 "full" manual also contains a command reference.
// How to make spectrum display stop using rigctl:
2021-02-27 21:18:26 +01:00
// echo "w \0xFE\0xFE\0x94\0xE0\0x27\0x11\0x00\0xFD" | rigctl -m 3073 -r /dev/ttyUSB0 -s 115200 -vvvvv
2018-06-19 12:58:52 -07:00
// Note: When sending \x00, must use QByteArray.setRawData()
2022-05-08 19:31:05 +01:00
rigCommander : : rigCommander ( QObject * parent ) : QObject ( parent )
2021-02-10 17:32:56 +00:00
{
2023-05-01 21:56:52 +01:00
2022-01-26 09:49:52 +00:00
qInfo ( logRig ( ) ) < < " creating instance of rigCommander() " ;
2023-05-12 00:24:01 +01:00
2022-01-26 09:49:52 +00:00
}
2022-05-08 19:31:05 +01:00
rigCommander : : rigCommander ( quint8 guid [ GUIDLEN ] , QObject * parent ) : QObject ( parent )
2022-01-26 09:49:52 +00:00
{
2023-05-01 21:56:52 +01:00
2022-01-26 09:49:52 +00:00
qInfo ( logRig ( ) ) < < " creating instance of rigCommander() " ;
2022-01-29 22:50:58 +00:00
memcpy ( this - > guid , guid , GUIDLEN ) ;
2023-05-12 00:24:01 +01:00
// Add some commands that is a minimum for rig detection
2021-02-10 17:32:56 +00:00
}
rigCommander : : ~ rigCommander ( )
{
2022-01-26 09:49:52 +00:00
qInfo ( logRig ( ) ) < < " closing instance of rigCommander() " ;
2021-02-10 17:32:56 +00:00
closeComm ( ) ;
}
2018-06-19 12:58:52 -07:00
2021-02-10 17:32:56 +00:00
2023-04-23 21:29:44 +01:00
void rigCommander : : commSetup ( QHash < unsigned char , QString > rigList , unsigned char rigCivAddr , QString rigSerialPort , quint32 rigBaudRate , QString vsp , quint16 tcpPort , quint8 wf )
2018-06-19 12:58:52 -07:00
{
// construct
2023-05-12 00:24:01 +01:00
2018-11-07 15:54:03 -08:00
// TODO: Bring this parameter and the comm port from the UI.
2018-11-26 23:10:23 -08:00
// Keep in hex in the UI as is done with other CIV apps.
2023-04-23 21:29:44 +01:00
this - > rigList = rigList ;
2023-05-12 00:24:01 +01:00
civAddr = rigCivAddr ; // address of the radio.
2021-02-10 17:32:56 +00:00
usingNativeLAN = false ;
2022-04-18 20:29:50 +01:00
2021-02-10 17:32:56 +00:00
this - > rigSerialPort = rigSerialPort ;
this - > rigBaudRate = rigBaudRate ;
2022-01-26 09:49:52 +00:00
rigCaps . baudRate = rigBaudRate ;
2018-11-26 23:10:23 -08:00
2022-05-08 19:31:05 +01:00
comm = new commHandler ( rigSerialPort , rigBaudRate , wf , this ) ;
ptty = new pttyHandler ( vsp , this ) ;
2018-06-19 12:58:52 -07:00
2022-04-08 14:40:05 +01:00
if ( tcpPort > 0 ) {
tcp = new tcpServer ( this ) ;
tcp - > startServer ( tcpPort ) ;
}
2022-03-23 10:12:42 +00:00
2018-06-19 12:58:52 -07:00
// data from the comm port to the program:
connect ( comm , SIGNAL ( haveDataFromPort ( QByteArray ) ) , this , SLOT ( handleNewData ( QByteArray ) ) ) ;
2021-03-04 20:19:05 +00:00
// data from the ptty to the rig:
connect ( ptty , SIGNAL ( haveDataFromPort ( QByteArray ) ) , comm , SLOT ( receiveDataFromUserToRig ( QByteArray ) ) ) ;
2022-03-23 10:12:42 +00:00
2018-06-19 12:58:52 -07:00
// data from the program to the comm port:
connect ( this , SIGNAL ( dataForComm ( QByteArray ) ) , comm , SLOT ( receiveDataFromUserToRig ( QByteArray ) ) ) ;
2023-05-08 13:26:45 +01:00
// Whether radio is half duplex only
connect ( this , SIGNAL ( setHalfDuplex ( bool ) ) , comm , SLOT ( setHalfDuplex ( bool ) ) ) ;
2022-04-08 14:40:05 +01:00
if ( tcpPort > 0 ) {
// data from the tcp port to the rig:
connect ( tcp , SIGNAL ( receiveData ( QByteArray ) ) , comm , SLOT ( receiveDataFromUserToRig ( QByteArray ) ) ) ;
connect ( comm , SIGNAL ( haveDataFromPort ( QByteArray ) ) , tcp , SLOT ( sendData ( QByteArray ) ) ) ;
}
2021-11-05 23:21:36 -07:00
connect ( this , SIGNAL ( toggleRTS ( bool ) ) , comm , SLOT ( setRTS ( bool ) ) ) ;
2018-06-19 12:58:52 -07:00
2021-03-04 20:19:05 +00:00
// data from the rig to the ptty:
2021-03-05 12:53:23 +00:00
connect ( comm , SIGNAL ( haveDataFromPort ( QByteArray ) ) , ptty , SLOT ( receiveDataFromRigToPtty ( QByteArray ) ) ) ;
2021-03-04 20:19:05 +00:00
2023-01-05 19:37:53 +00:00
connect ( comm , SIGNAL ( havePortError ( errorType ) ) , this , SLOT ( handlePortError ( errorType ) ) ) ;
2023-01-07 11:36:53 +00:00
connect ( ptty , SIGNAL ( havePortError ( errorType ) ) , this , SLOT ( handlePortError ( errorType ) ) ) ;
2021-02-10 17:32:56 +00:00
2018-06-19 12:58:52 -07:00
connect ( this , SIGNAL ( getMoreDebug ( ) ) , comm , SLOT ( debugThis ( ) ) ) ;
2021-03-04 20:19:05 +00:00
connect ( this , SIGNAL ( getMoreDebug ( ) ) , ptty , SLOT ( debugThis ( ) ) ) ;
2021-08-29 00:16:31 +01:00
connect ( this , SIGNAL ( discoveredRigID ( rigCapabilities ) ) , ptty , SLOT ( receiveFoundRigID ( rigCapabilities ) ) ) ;
2023-05-12 00:24:01 +01:00
commonSetup ( ) ;
2021-02-10 17:32:56 +00:00
}
2023-04-23 21:29:44 +01:00
void rigCommander : : commSetup ( QHash < unsigned char , QString > rigList , unsigned char rigCivAddr , udpPreferences prefs , audioSetup rxSetup , audioSetup txSetup , QString vsp , quint16 tcpPort )
2021-02-10 17:32:56 +00:00
{
// construct
// TODO: Bring this parameter and the comm port from the UI.
// Keep in hex in the UI as is done with other CIV apps.
2023-04-23 21:29:44 +01:00
this - > rigList = rigList ;
2023-05-12 00:24:01 +01:00
civAddr = rigCivAddr ; // address of the radio
2021-02-10 17:32:56 +00:00
usingNativeLAN = true ;
2022-03-23 10:12:42 +00:00
2021-02-10 17:32:56 +00:00
if ( udp = = Q_NULLPTR ) {
2021-02-21 14:53:42 +00:00
2021-06-04 08:24:26 +01:00
udp = new udpHandler ( prefs , rxSetup , txSetup ) ;
2021-02-21 14:53:42 +00:00
udpHandlerThread = new QThread ( this ) ;
2022-05-02 16:11:35 +01:00
udpHandlerThread - > setObjectName ( " udpHandler() " ) ;
2021-02-21 14:53:42 +00:00
udp - > moveToThread ( udpHandlerThread ) ;
connect ( this , SIGNAL ( initUdpHandler ( ) ) , udp , SLOT ( init ( ) ) ) ;
connect ( udpHandlerThread , SIGNAL ( finished ( ) ) , udp , SLOT ( deleteLater ( ) ) ) ;
udpHandlerThread - > start ( ) ;
emit initUdpHandler ( ) ;
2021-03-05 12:53:23 +00:00
//this->rigSerialPort = rigSerialPort;
//this->rigBaudRate = rigBaudRate;
2021-03-04 20:19:05 +00:00
2022-05-08 19:31:05 +01:00
ptty = new pttyHandler ( vsp , this ) ;
2021-03-04 20:19:05 +00:00
2022-04-08 14:40:05 +01:00
if ( tcpPort > 0 ) {
tcp = new tcpServer ( this ) ;
tcp - > startServer ( tcpPort ) ;
}
2021-03-05 12:53:23 +00:00
// Data from UDP to the program
2021-02-10 17:32:56 +00:00
connect ( udp , SIGNAL ( haveDataFromPort ( QByteArray ) ) , this , SLOT ( handleNewData ( QByteArray ) ) ) ;
2021-03-05 12:53:23 +00:00
2021-03-04 20:19:05 +00:00
// data from the rig to the ptty:
connect ( udp , SIGNAL ( haveDataFromPort ( QByteArray ) ) , ptty , SLOT ( receiveDataFromRigToPtty ( QByteArray ) ) ) ;
2021-03-05 12:53:23 +00:00
// Audio from UDP
2021-03-01 19:53:12 +00:00
connect ( udp , SIGNAL ( haveAudioData ( audioPacket ) ) , this , SLOT ( receiveAudioData ( audioPacket ) ) ) ;
2021-02-10 17:32:56 +00:00
2021-03-05 12:53:23 +00:00
// data from the program to the rig:
2021-02-10 17:32:56 +00:00
connect ( this , SIGNAL ( dataForComm ( QByteArray ) ) , udp , SLOT ( receiveDataFromUserToRig ( QByteArray ) ) ) ;
2021-03-05 12:53:23 +00:00
2021-03-04 20:19:05 +00:00
// data from the ptty to the rig:
connect ( ptty , SIGNAL ( haveDataFromPort ( QByteArray ) ) , udp , SLOT ( receiveDataFromUserToRig ( QByteArray ) ) ) ;
2022-04-08 14:40:05 +01:00
if ( tcpPort > 0 ) {
// data from the tcp port to the rig:
connect ( tcp , SIGNAL ( receiveData ( QByteArray ) ) , udp , SLOT ( receiveDataFromUserToRig ( QByteArray ) ) ) ;
connect ( udp , SIGNAL ( haveDataFromPort ( QByteArray ) ) , tcp , SLOT ( sendData ( QByteArray ) ) ) ;
}
2022-03-23 10:12:42 +00:00
2021-02-27 00:37:00 +00:00
connect ( this , SIGNAL ( haveChangeLatency ( quint16 ) ) , udp , SLOT ( changeLatency ( quint16 ) ) ) ;
2021-03-22 18:53:34 +00:00
connect ( this , SIGNAL ( haveSetVolume ( unsigned char ) ) , udp , SLOT ( setVolume ( unsigned char ) ) ) ;
2021-05-21 16:30:52 +01:00
connect ( udp , SIGNAL ( haveBaudRate ( quint32 ) ) , this , SLOT ( receiveBaudRate ( quint32 ) ) ) ;
2021-02-10 17:32:56 +00:00
// Connect for errors/alerts
2023-01-05 19:37:53 +00:00
connect ( udp , SIGNAL ( haveNetworkError ( errorType ) ) , this , SLOT ( handlePortError ( errorType ) ) ) ;
2022-01-22 15:12:36 +00:00
connect ( udp , SIGNAL ( haveNetworkStatus ( networkStatus ) ) , this , SLOT ( handleStatusUpdate ( networkStatus ) ) ) ;
2022-08-23 22:24:05 -07:00
connect ( udp , SIGNAL ( haveNetworkAudioLevels ( networkAudioLevels ) ) , this , SLOT ( handleNetworkAudioLevels ( networkAudioLevels ) ) ) ;
2021-03-04 20:19:05 +00:00
2023-01-05 19:37:53 +00:00
connect ( ptty , SIGNAL ( havePortError ( errorType ) ) , this , SLOT ( handlePortError ( errorType ) ) ) ;
2021-03-04 20:19:05 +00:00
connect ( this , SIGNAL ( getMoreDebug ( ) ) , ptty , SLOT ( debugThis ( ) ) ) ;
2021-07-05 16:45:19 -07:00
2021-08-29 00:16:31 +01:00
connect ( this , SIGNAL ( discoveredRigID ( rigCapabilities ) ) , ptty , SLOT ( receiveFoundRigID ( rigCapabilities ) ) ) ;
2022-01-21 19:23:32 +00:00
connect ( udp , SIGNAL ( requestRadioSelection ( QList < radio_cap_packet > ) ) , this , SLOT ( radioSelection ( QList < radio_cap_packet > ) ) ) ;
2022-01-23 17:54:40 +00:00
connect ( udp , SIGNAL ( setRadioUsage ( quint8 , quint8 , QString , QString ) ) , this , SLOT ( radioUsage ( quint8 , quint8 , QString , QString ) ) ) ;
connect ( this , SIGNAL ( selectedRadio ( quint8 ) ) , udp , SLOT ( setCurrentRadio ( quint8 ) ) ) ;
2021-07-05 16:45:19 -07:00
emit haveAfGain ( rxSetup . localAFgain ) ;
2022-01-04 18:34:34 +00:00
localVolume = rxSetup . localAFgain ;
2021-02-10 17:32:56 +00:00
2023-05-12 00:24:01 +01:00
}
2021-02-10 17:32:56 +00:00
2023-05-12 00:24:01 +01:00
commonSetup ( ) ;
2021-02-10 17:32:56 +00:00
2018-06-19 12:58:52 -07:00
}
2021-02-10 17:32:56 +00:00
void rigCommander : : closeComm ( )
{
2021-05-22 17:02:51 +01:00
qDebug ( logRig ( ) ) < < " Closing rig comms " ;
2021-02-10 17:32:56 +00:00
if ( comm ! = Q_NULLPTR ) {
delete comm ;
}
comm = Q_NULLPTR ;
2021-02-21 14:53:42 +00:00
if ( udpHandlerThread ! = Q_NULLPTR ) {
udpHandlerThread - > quit ( ) ;
udpHandlerThread - > wait ( ) ;
2021-02-10 17:32:56 +00:00
}
udp = Q_NULLPTR ;
2021-03-04 20:19:05 +00:00
if ( ptty ! = Q_NULLPTR ) {
delete ptty ;
}
2021-03-05 12:53:23 +00:00
ptty = Q_NULLPTR ;
2021-02-10 17:32:56 +00:00
}
2023-05-12 00:24:01 +01:00
void rigCommander : : commonSetup ( )
2018-06-19 12:58:52 -07:00
{
2023-05-12 00:24:01 +01:00
2021-02-10 17:32:56 +00:00
// common elements between the two constructors go here:
setCIVAddr ( civAddr ) ;
spectSeqMax = 0 ; // this is now set after rig ID determined
2021-05-30 15:08:22 -07:00
2021-02-10 17:32:56 +00:00
payloadSuffix = QByteArray ( " \xFD " ) ;
2023-05-12 00:24:01 +01:00
lookingForRig = true ;
2021-02-10 17:32:56 +00:00
foundRig = false ;
2023-05-12 00:24:01 +01:00
2023-05-15 10:53:52 +01:00
// Add the below commands so we can get a response until we have received rigCaps
2023-05-12 00:24:01 +01:00
rigCaps . commands . clear ( ) ;
rigCaps . commandsReverse . clear ( ) ;
2023-05-25 23:17:54 +01:00
rigCaps . commands . insert ( funcTransceiverId , funcType ( funcTransceiverId , QString ( " Transceiver ID " ) , QByteArrayLiteral ( " \x19 \x00 " ) , 0 , 0 , false ) ) ;
2023-05-12 00:24:01 +01:00
rigCaps . commandsReverse . insert ( QByteArrayLiteral ( " \x19 \x00 " ) , funcTransceiverId ) ;
queue = cachingQueue : : getInstance ( this ) ;
2023-06-05 09:27:37 +01:00
connect ( queue , SIGNAL ( haveCommand ( funcs , QVariant , bool ) ) , this , SLOT ( receiveCommand ( funcs , QVariant , bool ) ) ) ;
2021-02-28 21:41:27 -08:00
oldScopeMode = spectModeUnknown ;
2021-02-10 17:32:56 +00:00
pttAllowed = true ; // This is for developing, set to false for "safe" debugging. Set to true for deployment.
2023-05-12 00:24:01 +01:00
emit commReady ( ) ;
2018-06-19 12:58:52 -07:00
}
2021-05-30 15:08:22 -07:00
2018-06-19 12:58:52 -07:00
void rigCommander : : process ( )
{
2021-02-10 17:32:56 +00:00
// new thread enters here. Do nothing but do check for errors.
if ( comm ! = Q_NULLPTR & & comm - > serialError )
{
2023-01-05 19:37:53 +00:00
emit havePortError ( errorType ( rigSerialPort , QString ( " Error from commhandler. Check serial port. " ) ) ) ;
2021-02-10 17:32:56 +00:00
}
}
2023-01-05 19:37:53 +00:00
void rigCommander : : handlePortError ( errorType err )
2021-02-10 17:32:56 +00:00
{
2023-01-05 19:37:53 +00:00
qInfo ( logRig ( ) ) < < " Error using port " < < err . device < < " message: " < < err . message ;
emit havePortError ( err ) ;
2021-02-10 17:32:56 +00:00
}
2022-01-22 15:12:36 +00:00
void rigCommander : : handleStatusUpdate ( const networkStatus status )
2021-02-10 17:32:56 +00:00
{
2022-01-22 15:12:36 +00:00
emit haveStatusUpdate ( status ) ;
2021-02-10 17:32:56 +00:00
}
2022-08-23 22:24:05 -07:00
void rigCommander : : handleNetworkAudioLevels ( networkAudioLevels l )
{
emit haveNetworkAudioLevels ( l ) ;
}
2021-04-30 22:15:30 -07:00
bool rigCommander : : usingLAN ( )
{
return usingNativeLAN ;
}
2021-05-21 16:30:52 +01:00
void rigCommander : : receiveBaudRate ( quint32 baudrate ) {
2022-01-26 09:49:52 +00:00
rigCaps . baudRate = baudrate ;
2021-05-21 16:30:52 +01:00
emit haveBaudRate ( baudrate ) ;
}
2022-01-04 18:34:34 +00:00
void rigCommander : : setRTSforPTT ( bool enabled )
{
if ( ! usingNativeLAN )
{
useRTSforPTT_isSet = true ;
useRTSforPTT_manual = enabled ;
if ( comm ! = NULL )
{
rigCaps . useRTSforPTT = enabled ;
comm - > setUseRTSforPTT ( enabled ) ;
}
}
}
2021-02-10 17:32:56 +00:00
void rigCommander : : findRigs ( )
{
// This function sends data to 0x00 ("broadcast") to look for any connected rig.
lookingForRig = true ;
foundRig = false ;
QByteArray data ;
QByteArray data2 ;
//data.setRawData("\xFE\xFE\xa2", 3);
data . setRawData ( " \xFE \xFE \x00 " , 3 ) ;
2021-02-22 11:11:08 +00:00
data . append ( ( char ) compCivAddr ) ; // wfview's address, 0xE1
2021-02-10 17:32:56 +00:00
data2 . setRawData ( " \x19 \x00 " , 2 ) ; // get rig ID
data . append ( data2 ) ;
data . append ( payloadSuffix ) ;
emit dataForComm ( data ) ;
2023-05-03 19:19:58 +01:00
// HACK for testing radios that do not respond to rig ID queries:
2021-11-04 20:17:50 -07:00
//this->model = model736;
//this->determineRigCaps();
2021-02-10 17:32:56 +00:00
return ;
2018-06-19 12:58:52 -07:00
}
void rigCommander : : prepDataAndSend ( QByteArray data )
2023-05-12 00:24:01 +01:00
{
2018-06-19 12:58:52 -07:00
data . prepend ( payloadPrefix ) ;
data . append ( payloadSuffix ) ;
2021-05-15 18:53:16 +01:00
2021-03-02 22:11:01 -08:00
if ( data [ 4 ] ! = ' \x15 ' )
{
// We don't print out requests for meter levels
2023-01-21 13:38:39 -08:00
qDebug ( logRigTraffic ( ) ) < < " Final payload in rig commander to be sent to rig: " ;
printHexNow ( data , logRigTraffic ( ) ) ;
2021-03-02 22:11:01 -08:00
}
2018-06-19 12:58:52 -07:00
emit dataForComm ( data ) ;
}
2023-05-25 23:17:54 +01:00
bool rigCommander : : getCommand ( funcs func , QByteArray & payload , int value , bool sub )
2023-04-25 08:56:06 +01:00
{
2023-04-28 01:01:57 +01:00
// Value is set to INT_MIN by default as this should be outside any "real" values
2023-04-25 08:56:06 +01:00
auto it = rigCaps . commands . find ( func ) ;
if ( it ! = rigCaps . commands . end ( ) )
{
2023-04-28 01:01:57 +01:00
if ( value = = INT_MIN | | ( value > = it . value ( ) . minVal & & value < = it . value ( ) . maxVal ) )
2023-04-25 08:56:06 +01:00
{
2023-04-28 01:01:57 +01:00
if ( value = = INT_MIN )
2023-04-25 15:56:28 +01:00
qDebug ( logRig ( ) ) < < QString ( " %0 with no value (get) " ) . arg ( funcString [ func ] ) ;
else
qDebug ( logRig ( ) ) < < QString ( " %0 with value %1 (Range: %2-%3) " ) . arg ( funcString [ func ] ) . arg ( value ) . arg ( it . value ( ) . minVal ) . arg ( it . value ( ) . maxVal ) ;
2023-05-25 23:17:54 +01:00
if ( rigCaps . hasCommand29 & & it . value ( ) . cmd29 )
{
// This can use cmd29 so add sub/main to the command
payload . append ( ' \x29 ' ) ;
payload . append ( static_cast < uchar > ( sub ) ) ;
}
2023-04-25 08:56:06 +01:00
payload . append ( it . value ( ) . data ) ;
return true ;
}
2023-04-28 01:01:57 +01:00
else if ( value ! = INT_MIN )
2023-04-25 08:56:06 +01:00
{
qInfo ( logRig ( ) ) < < QString ( " Value %0 for %1 is outside of allowed range (%2-%3) " ) . arg ( value ) . arg ( funcString [ func ] ) . arg ( it . value ( ) . minVal ) . arg ( it . value ( ) . maxVal ) ;
}
}
return false ;
}
2021-04-19 22:55:39 -07:00
void rigCommander : : powerOn ( )
{
QByteArray payload ;
2022-01-04 18:34:34 +00:00
int numFE = 150 ;
2023-05-09 18:27:13 +01:00
2022-01-04 18:34:34 +00:00
switch ( this - > rigBaudRate ) {
case 57600 :
numFE = 75 ;
break ;
case 38400 :
numFE = 50 ;
break ;
case 19200 :
numFE = 25 ;
break ;
case 9600 :
numFE = 13 ;
break ;
case 4800 :
numFE = 7 ;
break ;
}
2023-05-12 00:24:01 +01:00
if ( ! usingNativeLAN | | ! rigCaps . hasLan ) {
for ( int i = 0 ; i < numFE ; i + + )
{
payload . append ( " \xFE " ) ;
}
2021-04-19 22:55:39 -07:00
}
2023-04-25 08:56:06 +01:00
unsigned char cmd = 0x01 ;
2023-05-09 18:27:13 +01:00
payload . append ( payloadPrefix ) ;
2023-05-09 17:28:55 +01:00
if ( getCommand ( funcPowerControl , payload , cmd ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( cmd ) ;
2023-05-09 18:27:13 +01:00
payload . append ( payloadSuffix ) ; // FD
2023-04-25 08:56:06 +01:00
}
else
{
2023-04-23 21:29:44 +01:00
// We may not know the command to turn the radio on so here it is:
payload . append ( " \x18 \x01 " ) ;
payload . append ( payloadSuffix ) ; // FD
}
2021-04-19 22:55:39 -07:00
qDebug ( logRig ( ) ) < < " Power ON command in rigcommander to be sent to rig: " ;
printHex ( payload ) ;
emit dataForComm ( payload ) ;
}
void rigCommander : : powerOff ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char cmd = ' \x00 ' ;
2023-05-09 17:28:55 +01:00
if ( getCommand ( funcPowerControl , payload , cmd ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( cmd ) ;
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2021-04-19 22:55:39 -07:00
}
2018-06-19 12:58:52 -07:00
void rigCommander : : enableSpectOutput ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char cmd = ' \x01 ' ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcScopeDataOutput , payload , cmd ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( cmd ) ;
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2018-06-19 12:58:52 -07:00
}
void rigCommander : : disableSpectOutput ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char cmd = ' \x00 ' ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcScopeDataOutput , payload , cmd ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( cmd ) ;
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2018-06-19 12:58:52 -07:00
}
void rigCommander : : enableSpectrumDisplay ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char cmd = ' \x01 ' ;
if ( getCommand ( funcScopeOnOff , payload , cmd ) )
{
payload . append ( cmd ) ;
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2018-06-19 12:58:52 -07:00
}
void rigCommander : : disableSpectrumDisplay ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char cmd = ' \x00 ' ;
if ( getCommand ( funcScopeOnOff , payload , cmd ) )
{
payload . append ( cmd ) ;
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2018-06-19 12:58:52 -07:00
}
2021-02-10 17:32:56 +00:00
void rigCommander : : setSpectrumBounds ( double startFreq , double endFreq , unsigned char edgeNumber )
2018-06-19 12:58:52 -07:00
{
2023-04-23 21:29:44 +01:00
unsigned char range = 1 ;
2018-06-19 12:58:52 -07:00
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeFixedEdgeFreq , payload , edgeNumber ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
// Each band should be configured with a maximum range, except for the ICR8600 which doesn't really have "bands"
for ( bandType band : rigCaps . bands )
{
if ( band . range ! = 0.0 & & startFreq > band . range )
range + + ;
}
payload . append ( range ) ;
payload . append ( edgeNumber ) ;
payload . append ( makeFreqPayload ( startFreq ) ) ;
payload . append ( makeFreqPayload ( endFreq ) ) ;
prepDataAndSend ( payload ) ;
qInfo ( logRig ( ) ) < < QString ( " Setting Fixed Range from: %0 to %1 edge %2 range %3 " ) . arg ( startFreq ) . arg ( endFreq ) . arg ( edgeNumber ) . arg ( range ) ;
}
2018-06-19 12:58:52 -07:00
}
2018-12-18 14:34:04 -08:00
void rigCommander : : getScopeMode ( )
{
// center or fixed
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char cmd = ' \x00 ' ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeMainMode , payload , cmd ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( cmd ) ;
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2018-12-18 14:34:04 -08:00
}
void rigCommander : : getScopeEdge ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char cmd = ' \x00 ' ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeMainEdge , payload , cmd ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( cmd ) ;
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2018-12-18 14:34:04 -08:00
}
2018-06-19 12:58:52 -07:00
void rigCommander : : setScopeEdge ( char edge )
{
2023-04-25 08:56:06 +01:00
// 1 2 or 3 (check command definition)
QByteArray payload ;
unsigned char vfo = ' \x00 ' ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeMainEdge , payload , edge ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( vfo ) ;
2023-04-19 14:51:23 +01:00
payload . append ( edge ) ;
prepDataAndSend ( payload ) ;
}
2018-06-19 12:58:52 -07:00
}
2018-12-18 14:34:04 -08:00
void rigCommander : : getScopeSpan ( )
2021-04-11 00:42:25 -07:00
{
getScopeSpan ( false ) ;
}
void rigCommander : : getScopeSpan ( bool isSub )
2018-12-18 14:34:04 -08:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeMainSpan , payload , static_cast < int > ( isSub ) ) )
2023-04-25 08:56:06 +01:00
{
2023-04-19 14:51:23 +01:00
payload . append ( static_cast < unsigned char > ( isSub ) ) ;
prepDataAndSend ( payload ) ;
}
2018-12-18 14:34:04 -08:00
}
2018-06-19 12:58:52 -07:00
void rigCommander : : setScopeSpan ( char span )
{
// See ICD, page 165, "19-12".
// 2.5k = 0
// 5k = 2, etc.
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char vfo = ' \x00 ' ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeMainSpan , payload , span ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( vfo ) ;
payload . append ( " \x00 " ) ; // 10Hz/1Hz
for ( auto & & s : rigCaps . scopeCenterSpans )
2023-04-19 14:51:23 +01:00
{
2023-04-23 21:29:44 +01:00
if ( s . cstype = = static_cast < centerSpansType > ( span ) )
{
double freq = double ( s . freq / 1000000.0 ) ;
payload . append ( makeFreqPayload ( freq ) ) ;
2023-04-27 19:56:25 +01:00
//qDebug(logRig()) << "Set Span for" << freq << "MHz" << "cmd:";
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
2023-04-19 14:51:23 +01:00
break ;
2023-04-23 21:29:44 +01:00
}
2018-06-19 12:58:52 -07:00
2023-04-23 21:29:44 +01:00
}
2023-04-19 14:51:23 +01:00
}
2018-06-19 12:58:52 -07:00
}
2023-05-15 13:47:45 +01:00
void rigCommander : : setspectrumMode_t ( spectrumMode_t spectMode )
2021-02-28 21:41:27 -08:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char vfo = ' \x00 ' ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeMainMode , payload , static_cast < int > ( spectMode ) ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( vfo ) ;
2023-04-25 08:56:06 +01:00
payload . append ( static_cast < unsigned char > ( spectMode ) ) ;
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-28 21:41:27 -08:00
}
2021-02-15 22:33:21 -08:00
void rigCommander : : getSpectrumRefLevel ( )
{
2023-04-19 14:51:23 +01:00
getSpectrumRefLevel ( ( unsigned char ) 0x0 ) ;
2021-02-15 22:33:21 -08:00
}
void rigCommander : : getSpectrumRefLevel ( unsigned char mainSub )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeMainRef , payload , static_cast < int > ( mainSub ) ) )
2023-04-25 08:56:06 +01:00
{
2023-04-19 14:51:23 +01:00
payload . append ( mainSub ) ;
prepDataAndSend ( payload ) ;
}
2021-02-15 22:33:21 -08:00
}
2021-02-15 21:40:31 -08:00
void rigCommander : : setSpectrumRefLevel ( int level )
{
2023-04-25 08:56:06 +01:00
// -30 to +10
2023-04-23 21:29:44 +01:00
unsigned char vfo = 0x0 ;
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeMainRef , payload , level ) )
2023-04-25 08:56:06 +01:00
{
bool isNegative = false ;
if ( level < 0 )
2023-04-19 14:51:23 +01:00
{
2023-04-25 08:56:06 +01:00
isNegative = true ;
level * = - 1 ;
2023-04-19 14:51:23 +01:00
}
2023-04-25 08:56:06 +01:00
payload . append ( vfo ) ;
payload . append ( bcdEncodeInt ( level * 10 ) ) ;
payload . append ( static_cast < unsigned char > ( isNegative ) ) ;
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 21:40:31 -08:00
}
2023-04-25 08:56:06 +01:00
// Not used
2018-12-18 14:34:04 -08:00
void rigCommander : : getSpectrumCenterMode ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeMainMode , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2018-12-18 14:34:04 -08:00
}
2023-05-15 13:47:45 +01:00
void rigCommander : : getspectrumMode_t ( )
2021-02-28 21:41:27 -08:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcScopeMainMode , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-28 21:41:27 -08:00
}
2021-08-29 11:51:53 +01:00
void rigCommander : : setFrequency ( unsigned char vfo , freqt freq )
2018-06-19 12:58:52 -07:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-15 10:53:52 +01:00
if ( vfo = = activeVFO )
2023-04-25 08:56:06 +01:00
{
2023-05-15 10:53:52 +01:00
if ( getCommand ( funcSelectedFreq , payload ) )
{
payload . append ( makeFreqPayload ( freq ) ) ;
prepDataAndSend ( payload ) ;
}
else if ( getCommand ( funcFreqSet , payload ) )
{
payload . append ( makeFreqPayload ( freq ) ) ;
prepDataAndSend ( payload ) ;
}
} else {
if ( getCommand ( funcSelectedFreq , payload ) )
{
payload . append ( makeFreqPayload ( freq ) ) ;
prepDataAndSend ( payload ) ;
}
2023-04-23 21:29:44 +01:00
}
2018-06-19 12:58:52 -07:00
}
2023-01-27 12:44:23 -08:00
void rigCommander : : selectVFO ( vfo_t vfo )
{
// Note, some radios use main/sub,
// some use A/B,
// and some appear to use both...
2023-04-25 15:56:28 +01:00
// vfoA=0, vfoB=1,vfoMain = 0xD0,vfoSub = 0xD1
funcs f = ( vfo = = vfoA ) ? funcVFOASelect : ( vfo = = vfoB ) ? funcVFOBSelect : ( vfo = = vfoMain ) ? funcVFOMainSelect : funcVFOSubSelect ;
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-25 15:56:28 +01:00
if ( getCommand ( f , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2023-01-27 12:44:23 -08:00
}
void rigCommander : : equalizeVFOsAB ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcVFOEqualAB , payload ) )
{
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2023-01-27 12:44:23 -08:00
}
void rigCommander : : equalizeVFOsMS ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcVFOEqualMS , payload ) )
{
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2023-01-27 12:44:23 -08:00
}
void rigCommander : : exchangeVFOs ( )
{
// NB: This command exchanges A-B or M-S
// depending upon the radio.
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcVFOSwapAB , payload ) )
{
prepDataAndSend ( payload ) ;
}
else if ( getCommand ( funcVFOSwapMS , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
}
2023-01-27 12:44:23 -08:00
}
2021-03-22 00:11:43 -07:00
QByteArray rigCommander : : makeFreqPayload ( freqt freq )
{
QByteArray result ;
quint64 freqInt = freq . Hz ;
unsigned char a ;
int numchars = 5 ;
for ( int i = 0 ; i < numchars ; i + + ) {
a = 0 ;
a | = ( freqInt ) % 10 ;
freqInt / = 10 ;
a | = ( ( freqInt ) % 10 ) < < 4 ;
freqInt / = 10 ;
result . append ( a ) ;
//printHex(result, false, true);
}
return result ;
}
2018-06-19 12:58:52 -07:00
QByteArray rigCommander : : makeFreqPayload ( double freq )
{
quint64 freqInt = ( quint64 ) ( freq * 1E6 ) ;
QByteArray result ;
unsigned char a ;
int numchars = 5 ;
for ( int i = 0 ; i < numchars ; i + + ) {
a = 0 ;
a | = ( freqInt ) % 10 ;
freqInt / = 10 ;
a | = ( ( freqInt ) % 10 ) < < 4 ;
freqInt / = 10 ;
result . append ( a ) ;
//printHex(result, false, true);
}
2021-05-15 18:53:16 +01:00
//qInfo(logRig()) << "encoded frequency for " << freq << " as int " << freqInt;
2018-06-19 12:58:52 -07:00
//printHex(result, false, true);
return result ;
}
2021-04-24 00:31:51 -07:00
void rigCommander : : setRitEnable ( bool ritEnabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-28 00:57:09 +01:00
if ( getCommand ( funcRitStatus , payload , static_cast < int > ( ritEnabled ) ) )
2023-04-25 08:56:06 +01:00
{
2023-04-19 14:51:23 +01:00
payload . append ( static_cast < unsigned char > ( ritEnabled ) ) ;
prepDataAndSend ( payload ) ;
}
2021-04-24 00:31:51 -07:00
}
void rigCommander : : getRitEnabled ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcRitStatus , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-04-24 00:31:51 -07:00
}
void rigCommander : : getRitValue ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcRITFreq , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-04-24 00:31:51 -07:00
}
void rigCommander : : setRitValue ( int ritValue )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcRITFreq , payload , ritValue ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
bool isNegative = false ;
2023-04-25 08:56:06 +01:00
if ( ritValue < 0 )
2023-04-23 21:29:44 +01:00
{
isNegative = true ;
ritValue * = - 1 ;
}
QByteArray freqBytes ;
freqt f ;
f . Hz = ritValue ;
freqBytes = makeFreqPayload ( f ) ;
freqBytes . truncate ( 2 ) ;
payload . append ( freqBytes ) ;
payload . append ( QByteArray ( 1 , ( char ) isNegative ) ) ;
prepDataAndSend ( payload ) ;
2021-04-24 00:31:51 -07:00
}
}
2023-05-15 13:47:45 +01:00
void rigCommander : : setMode ( modeInfo m )
2021-06-25 23:56:19 -07:00
{
2023-04-24 11:06:33 +01:00
foreach ( auto & & filter , rigCaps . filters )
2021-06-25 23:56:19 -07:00
{
2023-04-24 11:06:33 +01:00
if ( filter . num = = m . filter )
{
2023-04-25 08:56:06 +01:00
// Does this mode support this filter?
2023-04-24 11:06:33 +01:00
if ( ! ( filter . modes & ( 1 < < m . reg ) ) )
{
qInfo ( logRig ( ) ) < < " Filter " < < m . filter < < " not supported in mode " < < m . name < < " reg: " < < m . reg < < " modes: " < < QString : : number ( filter . modes , 16 ) ;
m . filter = ' \x01 ' ; // Set the default filter if not set
}
break ;
}
2021-06-25 23:56:19 -07:00
}
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-15 10:53:52 +01:00
if ( m . VFO = = activeVFO )
2023-01-25 00:15:20 -08:00
{
2023-05-15 10:53:52 +01:00
if ( getCommand ( funcSelectedMode , payload ) )
{
payload . append ( m . reg ) ;
payload . append ( static_cast < unsigned char > ( m . data ) ) ;
payload . append ( m . filter ) ;
prepDataAndSend ( payload ) ;
}
else if ( getCommand ( funcModeSet , payload ) )
{
payload . append ( m . reg ) ;
payload . append ( m . filter ) ;
prepDataAndSend ( payload ) ;
}
} else {
if ( getCommand ( funcUnselectedMode , payload ) )
{
payload . append ( m . reg ) ;
payload . append ( static_cast < unsigned char > ( m . data ) ) ;
payload . append ( m . filter ) ;
prepDataAndSend ( payload ) ;
}
2023-01-25 00:15:20 -08:00
}
2021-06-25 23:56:19 -07:00
}
2021-02-13 10:02:45 -08:00
void rigCommander : : setMode ( unsigned char mode , unsigned char modeFilter )
2018-06-19 12:58:52 -07:00
{
2023-05-15 13:47:45 +01:00
foreach ( modeInfo m , rigCaps . modes )
2023-04-24 11:06:33 +01:00
{
if ( m . reg = = mode )
{
2023-05-15 13:47:45 +01:00
modeInfo mi = modeInfo ( m ) ;
2023-04-24 11:06:33 +01:00
mi . filter = modeFilter ;
mi . VFO = selVFO_t : : activeVFO ;
setMode ( mi ) ;
break ;
}
}
2023-04-23 21:29:44 +01:00
}
2021-05-07 15:46:47 -07:00
2023-04-23 21:29:44 +01:00
void rigCommander : : setDataMode ( bool dataOn , unsigned char filter )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcDataModeWithFilter , payload , static_cast < int > ( dataOn ) ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( static_cast < unsigned char > ( dataOn ) ) ;
payload . append ( ( dataOn ) ? filter : 0x0 ) ; // if data mode off, bandwidth not defined per ICD.
2018-06-19 12:58:52 -07:00
prepDataAndSend ( payload ) ;
}
}
2023-04-23 21:29:44 +01:00
void rigCommander : : getFrequency ( )
2018-11-07 15:54:03 -08:00
{
2023-04-23 21:29:44 +01:00
getFrequency ( ( unsigned char ) 0x0 ) ;
2018-11-07 15:54:03 -08:00
}
2023-03-17 23:35:40 +00:00
void rigCommander : : getFrequency ( unsigned char vfo )
{
2023-04-23 21:29:44 +01:00
QByteArray payload ;
2023-05-15 10:53:52 +01:00
if ( vfo = = activeVFO )
2023-04-25 08:56:06 +01:00
{
2023-05-15 10:53:52 +01:00
if ( getCommand ( funcSelectedFreq , payload ) )
{
prepDataAndSend ( payload ) ;
}
else if ( getCommand ( funcFreqSet , payload ) )
{
prepDataAndSend ( payload ) ;
}
} else {
if ( getCommand ( funcSelectedFreq , payload ) )
{
prepDataAndSend ( payload ) ;
}
2023-03-17 23:35:40 +00:00
}
}
2023-04-23 21:29:44 +01:00
void rigCommander : : getMode ( )
2018-06-19 12:58:52 -07:00
{
2023-04-23 21:29:44 +01:00
getMode ( ( unsigned char ) 0x0 ) ;
2018-06-19 12:58:52 -07:00
}
2023-04-23 21:29:44 +01:00
void rigCommander : : getMode ( unsigned char vfo )
2018-06-19 12:58:52 -07:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-15 10:53:52 +01:00
if ( getCommand ( funcSelectedMode , payload ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( vfo ) ;
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2023-04-25 08:56:06 +01:00
else if ( getCommand ( funcModeSet , payload ) )
2023-04-23 21:29:44 +01:00
{
2023-04-25 08:56:06 +01:00
prepDataAndSend ( payload ) ;
2023-04-23 21:29:44 +01:00
}
2018-06-19 12:58:52 -07:00
}
void rigCommander : : getDataMode ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcDataModeWithFilter , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2018-06-19 12:58:52 -07:00
}
2023-04-28 13:44:12 +01:00
void rigCommander : : getTuningStep ( )
{
QByteArray payload ;
if ( getCommand ( funcTuningStep , payload ) )
{
prepDataAndSend ( payload ) ;
qInfo ( ) < < " Getting tuning step " ;
}
}
void rigCommander : : setTuningStep ( unsigned char step )
{
QByteArray payload ;
if ( getCommand ( funcTuningStep , payload , static_cast < int > ( step ) ) )
{
payload . append ( static_cast < unsigned char > ( step ) ) ;
prepDataAndSend ( payload ) ;
}
}
2023-01-25 00:15:20 -08:00
void rigCommander : : getSplit ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcSplitStatus , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2023-01-25 00:15:20 -08:00
}
void rigCommander : : setSplit ( bool splitEnabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcSplitStatus , payload , static_cast < int > ( splitEnabled ) ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( static_cast < unsigned char > ( splitEnabled ) ) ;
2023-04-25 15:56:28 +01:00
prepDataAndSend ( payload ) ;
2023-04-23 21:29:44 +01:00
}
2023-01-25 00:15:20 -08:00
}
2023-05-15 13:47:45 +01:00
void rigCommander : : setDuplexMode ( duplexMode_t dm )
2021-02-17 23:26:10 -08:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcSplitStatus , payload , static_cast < int > ( dm ) ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( static_cast < unsigned char > ( dm ) ) ;
2023-04-25 15:56:28 +01:00
prepDataAndSend ( payload ) ;
2023-04-23 21:29:44 +01:00
}
else
2021-02-18 21:47:19 -08:00
{
2023-04-25 08:56:06 +01:00
setSplit ( static_cast < bool > ( dm ) ) ;
2021-02-18 21:47:19 -08:00
}
2021-02-17 23:26:10 -08:00
}
void rigCommander : : getDuplexMode ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-05-24 19:50:01 +01:00
if ( getCommand ( funcSplitStatus , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
else
{
getSplit ( ) ;
}
2021-02-17 23:26:10 -08:00
}
2023-02-01 09:21:17 -08:00
void rigCommander : : setQuickSplit ( bool qsOn )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcQuickSplit , payload , static_cast < int > ( qsOn ) ) )
{
payload . append ( static_cast < unsigned char > ( qsOn ) ) ;
2023-04-25 15:56:28 +01:00
prepDataAndSend ( payload ) ;
2023-02-01 09:21:17 -08:00
}
}
2022-10-28 20:04:14 +01:00
void rigCommander : : setPassband ( quint16 pass )
{
2023-05-27 20:26:53 +01:00
Q_UNUSED ( pass )
2022-10-28 20:04:14 +01:00
}
2022-09-26 01:44:49 +01:00
void rigCommander : : getPassband ( )
{
}
2023-01-18 18:52:05 +00:00
void rigCommander : : getCwPitch ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcCwPitch , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2023-01-18 18:52:05 +00:00
}
2023-01-25 18:01:24 +00:00
void rigCommander : : setCwPitch ( unsigned char pitch )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcCwPitch , payload , pitch ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( pitch ) ) ;
prepDataAndSend ( payload ) ;
}
2023-01-25 18:01:24 +00:00
}
2023-02-14 18:47:32 +00:00
void rigCommander : : getDashRatio ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcDashRatio , payload ) )
{
2023-04-19 14:51:23 +01:00
prepDataAndSend ( payload ) ;
2023-02-14 18:47:32 +00:00
}
}
void rigCommander : : setDashRatio ( unsigned char ratio )
2023-04-25 08:56:06 +01:00
{
QByteArray payload ;
if ( getCommand ( funcDashRatio , payload , ratio ) )
{
2023-04-19 14:51:23 +01:00
payload . append ( bcdEncodeInt ( ratio ) . at ( 1 ) ) ; // Discard first byte
prepDataAndSend ( payload ) ;
2023-02-14 18:47:32 +00:00
}
}
2023-01-18 18:52:05 +00:00
void rigCommander : : getPskTone ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcPSKTone , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2023-01-18 18:52:05 +00:00
}
2023-01-25 18:01:24 +00:00
void rigCommander : : setPskTone ( unsigned char tone )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcPSKTone , payload , tone ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
2023-04-25 08:56:06 +01:00
payload . append ( bcdEncodeInt ( tone ) ) ;
2023-04-23 21:29:44 +01:00
}
2023-01-25 18:01:24 +00:00
}
2023-01-18 18:52:05 +00:00
void rigCommander : : getRttyMark ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcRTTYMarkTone , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2023-01-18 18:52:05 +00:00
}
2023-01-25 18:01:24 +00:00
void rigCommander : : setRttyMark ( unsigned char mark )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcRTTYMarkTone , payload , mark ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
2023-04-25 08:56:06 +01:00
payload . append ( bcdEncodeInt ( mark ) ) ;
2023-04-23 21:29:44 +01:00
}
2023-01-18 18:52:05 +00:00
}
2021-04-04 00:36:21 -07:00
void rigCommander : : getTransmitFrequency ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcReadTXFreq , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-04-04 00:36:21 -07:00
}
void rigCommander : : setTone ( quint16 tone )
{
2023-05-24 19:50:01 +01:00
toneInfo t ;
2023-01-27 14:05:50 -08:00
t . tone = tone ;
setTone ( t ) ;
}
2023-05-24 19:50:01 +01:00
void rigCommander : : setTone ( toneInfo t )
2023-01-27 14:05:50 -08:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcMainSubPrefix , payload ) )
2023-01-27 14:05:50 -08:00
{
2023-05-24 19:50:01 +01:00
//payload.append(static_cast<unsigned char>(t.useSecondaryVFO));
2023-04-25 08:56:06 +01:00
}
2021-04-04 23:33:56 -07:00
2023-04-29 14:55:41 +01:00
if ( getCommand ( funcToneFreq , payload , static_cast < int > ( t . tone ) ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( encodeTone ( t . tone ) ) ;
prepDataAndSend ( payload ) ;
}
2021-04-04 00:36:21 -07:00
}
2021-02-17 23:26:10 -08:00
2023-01-27 14:05:50 -08:00
void rigCommander : : setTSQL ( quint16 t )
{
2023-05-24 19:50:01 +01:00
toneInfo tn ;
2023-01-27 14:05:50 -08:00
tn . tone = t ;
setTSQL ( tn ) ;
}
2023-05-24 19:50:01 +01:00
void rigCommander : : setTSQL ( toneInfo t )
2021-04-04 00:36:21 -07:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcMainSubPrefix , payload ) )
2023-01-27 14:05:50 -08:00
{
2023-05-24 19:50:01 +01:00
//payload.append(static_cast<unsigned char>(t.useSecondaryVFO));
2023-04-25 08:56:06 +01:00
}
2023-04-29 14:55:41 +01:00
if ( getCommand ( funcTSQLFreq , payload , static_cast < int > ( t . tone ) ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( encodeTone ( t . tone ) ) ;
prepDataAndSend ( payload ) ;
2023-01-27 14:05:50 -08:00
}
2021-04-04 00:36:21 -07:00
}
void rigCommander : : setDTCS ( quint16 dcscode , bool tinv , bool rinv )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-29 14:55:41 +01:00
if ( getCommand ( funcDTCSCode , payload , static_cast < int > ( dcscode ) ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( encodeTone ( dcscode , tinv , rinv ) ) ;
prepDataAndSend ( payload ) ;
}
2021-04-04 23:33:56 -07:00
}
QByteArray rigCommander : : encodeTone ( quint16 tone )
{
return encodeTone ( tone , false , false ) ;
}
QByteArray rigCommander : : encodeTone ( quint16 tone , bool tinv , bool rinv )
{
// This function is fine to use for DTCS and TONE
QByteArray enct ;
unsigned char inv = 0 ;
inv = inv | ( unsigned char ) rinv ;
inv = inv | ( ( unsigned char ) tinv ) < < 4 ;
enct . append ( inv ) ;
unsigned char hundreds = tone / 1000 ;
unsigned char tens = ( tone - ( hundreds * 1000 ) ) / 100 ;
unsigned char ones = ( tone - ( hundreds * 1000 ) - ( tens * 100 ) ) / 10 ;
unsigned char dec = ( tone - ( hundreds * 1000 ) - ( tens * 100 ) - ( ones * 10 ) ) ;
enct . append ( tens | ( hundreds < < 4 ) ) ;
enct . append ( dec | ( ones < < 4 ) ) ;
return enct ;
}
2023-05-15 10:53:52 +01:00
toneInfo rigCommander : : decodeTone ( QByteArray eTone )
2021-04-04 23:33:56 -07:00
{
// index: 00 01 02 03 04
// CTCSS: 1B 01 00 12 73 = PL 127.3, decode as 1273
// D(T)CS: 1B 01 TR 01 23 = T/R Invert bits + DCS code 123
2023-05-15 10:53:52 +01:00
toneInfo t ;
2021-06-01 00:25:20 +01:00
if ( eTone . length ( ) < 5 ) {
2023-05-15 10:53:52 +01:00
return t ;
2021-06-01 00:25:20 +01:00
}
2021-04-04 23:33:56 -07:00
if ( ( eTone . at ( 2 ) & 0x01 ) = = 0x01 )
2023-05-15 10:53:52 +01:00
t . tinv = true ;
2021-04-04 23:33:56 -07:00
if ( ( eTone . at ( 2 ) & 0x10 ) = = 0x10 )
2023-05-15 10:53:52 +01:00
t . rinv = true ;
2021-04-04 23:33:56 -07:00
2023-05-15 10:53:52 +01:00
t . tone + = ( eTone . at ( 4 ) & 0x0f ) ;
t . tone + = ( ( eTone . at ( 4 ) & 0xf0 ) > > 4 ) * 10 ;
t . tone + = ( eTone . at ( 3 ) & 0x0f ) * 100 ;
t . tone + = ( ( eTone . at ( 3 ) & 0xf0 ) > > 4 ) * 1000 ;
2021-04-04 23:33:56 -07:00
2023-05-15 10:53:52 +01:00
return t ;
2021-04-04 00:36:21 -07:00
}
void rigCommander : : getTone ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-29 14:55:41 +01:00
if ( getCommand ( funcToneFreq , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-04-04 00:36:21 -07:00
}
void rigCommander : : getTSQL ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-29 14:55:41 +01:00
if ( getCommand ( funcTSQLFreq , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-04-04 00:36:21 -07:00
}
void rigCommander : : getDTCS ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-29 14:55:41 +01:00
if ( getCommand ( funcDTCSCode , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-04-04 00:36:21 -07:00
}
void rigCommander : : getRptAccessMode ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcToneSquelchType , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-04-04 00:36:21 -07:00
}
2023-05-15 13:47:45 +01:00
void rigCommander : : setRptAccessMode ( rptAccessTxRx_t ratr )
2023-01-27 14:05:50 -08:00
{
2023-05-15 13:47:45 +01:00
rptrAccessData rd ;
2023-01-27 14:05:50 -08:00
rd . accessMode = ratr ;
setRptAccessMode ( rd ) ;
}
2023-05-15 13:47:45 +01:00
void rigCommander : : setRptAccessMode ( rptrAccessData rd )
2021-04-04 00:36:21 -07:00
{
2023-01-31 21:52:24 -08:00
// NB: This function is the only recommended
// function to be used for toggling tone and tone squelch.
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcMainSubPrefix , payload ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( rd . useSecondaryVFO ) ) ;
2023-04-25 08:56:06 +01:00
}
2023-04-23 21:29:44 +01:00
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcToneSquelchType , payload ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( ( unsigned char ) rd . accessMode ) ;
prepDataAndSend ( payload ) ;
}
else
2023-01-31 14:03:51 -08:00
{
// These radios either don't support DCS or
// we just haven't added DCS yet.
switch ( rd . accessMode )
{
case ratrNN :
2023-04-25 08:56:06 +01:00
{
2023-01-31 14:03:51 -08:00
// No tone at all
2023-01-31 21:52:24 -08:00
if ( rd . turnOffTone )
{
2023-04-27 16:39:51 +01:00
if ( getCommand ( funcRepeaterTone , payload ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( ' \x00 ' ) ;
2023-04-25 08:56:06 +01:00
prepDataAndSend ( payload ) ;
}
}
else if ( rd . turnOffTSQL )
2023-01-31 21:52:24 -08:00
{
2023-04-27 16:39:51 +01:00
if ( getCommand ( funcRepeaterTSQL , payload ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( ' \x00 ' ) ;
2023-04-25 08:56:06 +01:00
prepDataAndSend ( payload ) ;
}
2023-01-31 21:52:24 -08:00
}
2023-01-31 14:03:51 -08:00
break ;
2023-04-25 08:56:06 +01:00
}
2023-01-31 14:03:51 -08:00
case ratrTN :
2023-04-25 08:56:06 +01:00
{
2023-04-27 16:39:51 +01:00
if ( getCommand ( funcRepeaterTone , payload ) )
2023-04-23 21:29:44 +01:00
{
2023-04-25 08:56:06 +01:00
payload . append ( ' \x01 ' ) ;
prepDataAndSend ( payload ) ;
}
2023-01-31 14:03:51 -08:00
break ;
2023-04-25 08:56:06 +01:00
}
case ratrTT :
2023-01-31 14:03:51 -08:00
case ratrNT :
2023-04-25 08:56:06 +01:00
{
2023-04-27 16:39:51 +01:00
if ( getCommand ( funcRepeaterTSQL , payload ) )
2023-04-23 21:29:44 +01:00
{
2023-04-25 08:56:06 +01:00
payload . append ( ' \x01 ' ) ;
prepDataAndSend ( payload ) ;
}
2023-01-31 14:03:51 -08:00
break ;
2023-04-25 08:56:06 +01:00
}
2023-01-31 14:03:51 -08:00
default :
qWarning ( logRig ( ) ) < < " Cannot set tone mode " < < ( unsigned char ) rd . accessMode < < " on rig model " < < rigCaps . modelName ;
return ;
}
}
2021-04-04 00:36:21 -07:00
}
2023-01-27 21:42:57 -08:00
void rigCommander : : setRptDuplexOffset ( freqt f )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcSendFreqOffset , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( makeFreqPayload ( f ) . mid ( 1 , 3 ) ) ;
2023-04-25 08:56:06 +01:00
prepDataAndSend ( payload ) ;
}
2023-01-27 21:42:57 -08:00
}
void rigCommander : : getRptDuplexOffset ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcReadFreqOffset , payload ) )
2023-04-25 08:56:06 +01:00
{
prepDataAndSend ( payload ) ;
}
2023-01-27 21:42:57 -08:00
}
2023-05-02 21:18:41 +01:00
void rigCommander : : setMemoryMode ( )
{
QByteArray payload ;
if ( getCommand ( funcMemoryMode , payload ) )
{
prepDataAndSend ( payload ) ;
}
}
2023-05-01 21:56:52 +01:00
2023-05-02 21:18:41 +01:00
void rigCommander : : getMemory ( quint32 mem )
2023-05-01 21:56:52 +01:00
{
QByteArray payload ;
2023-05-06 12:36:05 +01:00
2023-05-02 21:18:41 +01:00
if ( getCommand ( funcMemoryContents , payload , mem & 0xffff ) )
2023-05-01 21:56:52 +01:00
{
2023-05-06 12:36:05 +01:00
// Format is different for all radios!
foreach ( auto parse , rigCaps . memParser ) {
switch ( parse . spec )
{
case ' a ' :
if ( parse . len = = 1 ) {
payload . append ( quint8 ( mem > > 16 ) & 0xff ) ;
}
else if ( parse . len = = 2 )
{
payload . append ( bcdEncodeInt ( mem > > 16 & 0xffff ) ) ;
}
break ;
default :
break ;
}
2023-05-02 21:18:41 +01:00
}
payload . append ( bcdEncodeInt ( mem & 0xffff ) ) ;
2023-05-01 21:56:52 +01:00
prepDataAndSend ( payload ) ;
}
}
2023-05-04 21:55:40 +01:00
void rigCommander : : getSatMemory ( quint32 mem )
{
QByteArray payload ;
if ( getCommand ( funcSatelliteMemory , payload , mem & 0xffff ) )
{
payload . append ( bcdEncodeInt ( mem & 0xffff ) ) ;
prepDataAndSend ( payload ) ;
}
}
2023-05-09 17:03:03 +01:00
2023-05-15 10:53:52 +01:00
QByteArray rigCommander : : setMemory ( memoryType mem )
2023-05-01 21:56:52 +01:00
{
2023-05-09 17:03:03 +01:00
bool finished = false ;
2023-05-01 21:56:52 +01:00
QByteArray payload ;
char nul = 0x0 ;
2023-05-12 00:24:01 +01:00
uchar ffchar = 0xff ;
2023-05-04 21:55:40 +01:00
QVector < memParserFormat > parser ;
2023-05-15 10:53:52 +01:00
if ( mem . sat )
2023-05-01 21:56:52 +01:00
{
2023-05-04 21:55:40 +01:00
parser = rigCaps . satParser ;
}
2023-05-15 10:53:52 +01:00
else
2023-05-04 21:55:40 +01:00
{
parser = rigCaps . memParser ;
}
// Format is different for all radios!
foreach ( auto parse , parser ) {
switch ( parse . spec )
{
case ' a ' :
2023-05-06 12:36:05 +01:00
if ( parse . len = = 1 ) {
payload . append ( mem . group ) ;
}
else if ( parse . len = = 2 )
{
payload . append ( bcdEncodeInt ( mem . group ) ) ;
}
2023-05-04 21:55:40 +01:00
break ;
case ' b ' :
payload . append ( bcdEncodeInt ( mem . channel ) ) ;
break ;
case ' c ' :
2023-05-09 17:03:03 +01:00
// Are we deleting the memory?
if ( mem . del ) {
payload . append ( ffchar ) ;
finished = true ;
break ;
} else {
payload . append ( mem . scan ) ;
}
2023-05-04 21:55:40 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' d ' : // combined split and scan
payload . append ( quint8 ( ( mem . split < < 4 & 0xf0 ) | ( mem . scan & 0x0f ) ) ) ;
break ;
case ' e ' :
payload . append ( mem . vfo ) ;
2023-05-08 13:34:41 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' E ' :
payload . append ( mem . vfoB ) ;
2023-05-08 13:34:41 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' f ' :
2023-05-09 17:03:03 +01:00
if ( mem . del ) {
payload . append ( ffchar ) ;
finished = true ;
break ;
} else {
payload . append ( makeFreqPayload ( mem . frequency ) ) ;
}
2023-05-04 21:55:40 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' F ' :
2023-05-04 21:55:40 +01:00
payload . append ( makeFreqPayload ( mem . frequencyB ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' g ' :
payload . append ( mem . mode ) ;
2023-05-04 21:55:40 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' G ' :
payload . append ( mem . modeB ) ;
2023-05-04 21:55:40 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' h ' :
2023-05-04 21:55:40 +01:00
payload . append ( mem . filter ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' H ' :
2023-05-04 21:55:40 +01:00
payload . append ( mem . filterB ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' i ' : // single datamode
2023-05-04 21:55:40 +01:00
payload . append ( mem . datamode ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' I ' :
2023-05-04 21:55:40 +01:00
payload . append ( mem . datamodeB ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' j ' : // combined duplex and tonemode
2023-05-04 21:55:40 +01:00
payload . append ( ( mem . duplex < < 4 ) | mem . tonemode ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' J ' : // combined duplex and tonemode
2023-05-06 12:36:05 +01:00
payload . append ( ( mem . duplexB < < 4 ) | mem . tonemodeB ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' k ' : // combined datamode and tonemode
2023-05-04 21:55:40 +01:00
payload . append ( ( mem . datamode < < 4 & 0xf0 ) | ( mem . tonemode & 0x0f ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' K ' : // combined datamode and tonemode
payload . append ( ( mem . datamodeB < < 4 & 0xf0 ) | ( mem . tonemodeB & 0x0f ) ) ;
break ;
case ' l ' : // tonemode
2023-05-04 21:55:40 +01:00
payload . append ( mem . tonemode ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' L ' :
2023-05-04 21:55:40 +01:00
payload . append ( mem . tonemodeB ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' m ' :
2023-05-04 21:55:40 +01:00
payload . append ( mem . dsql < < 4 ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' M ' :
2023-05-04 21:55:40 +01:00
payload . append ( mem . dsqlB < < 4 ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' n ' :
2023-05-04 21:55:40 +01:00
payload . append ( nul ) ;
payload . append ( bcdEncodeInt ( mem . tone ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' N ' :
2023-05-04 21:55:40 +01:00
payload . append ( nul ) ;
payload . append ( bcdEncodeInt ( mem . toneB ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' o ' :
2023-05-04 21:55:40 +01:00
payload . append ( nul ) ;
payload . append ( bcdEncodeInt ( mem . tsql ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' O ' :
2023-05-04 21:55:40 +01:00
payload . append ( nul ) ;
payload . append ( bcdEncodeInt ( mem . tsqlB ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' p ' :
2023-05-04 21:55:40 +01:00
payload . append ( ( mem . dtcsp < < 3 & 0x10 ) | ( mem . dtcsp & 0x01 ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' P ' :
2023-05-04 21:55:40 +01:00
payload . append ( ( mem . dtcspB < < 3 & 0x10 ) | ( mem . dtcspB & 0x01 ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' q ' :
2023-05-04 21:55:40 +01:00
payload . append ( bcdEncodeInt ( mem . dtcs ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' Q ' :
2023-05-04 21:55:40 +01:00
payload . append ( bcdEncodeInt ( mem . dtcsB ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' r ' :
2023-05-04 21:55:40 +01:00
payload . append ( mem . dvsql ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' R ' :
2023-05-04 21:55:40 +01:00
payload . append ( mem . dvsqlB ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' s ' :
2023-05-04 21:55:40 +01:00
payload . append ( makeFreqPayload ( mem . duplexOffset ) . mid ( 1 , 3 ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' S ' :
2023-05-06 12:36:05 +01:00
payload . append ( makeFreqPayload ( mem . duplexOffsetB ) . mid ( 1 , 3 ) ) ;
break ;
2023-05-08 13:26:45 +01:00
case ' t ' :
2023-05-09 17:03:03 +01:00
payload . append ( QByteArray ( mem . UR ) . leftJustified ( parse . len , ' ' , true ) ) ;
2023-05-04 21:55:40 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' T ' :
2023-05-09 17:03:03 +01:00
payload . append ( QByteArray ( mem . URB ) . leftJustified ( parse . len , ' ' , true ) ) ;
2023-05-04 21:55:40 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' u ' :
2023-05-09 17:03:03 +01:00
payload . append ( QByteArray ( mem . R1 ) . leftJustified ( parse . len , ' ' , true ) ) ;
2023-05-04 21:55:40 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' U ' :
2023-05-09 17:03:03 +01:00
payload . append ( QByteArray ( mem . R1B ) . leftJustified ( parse . len , ' ' , true ) ) ;
2023-05-04 21:55:40 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' v ' :
2023-05-09 17:03:03 +01:00
payload . append ( QByteArray ( mem . R2 ) . leftJustified ( parse . len , ' ' , true ) ) ;
2023-05-04 21:55:40 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' V ' :
2023-05-09 17:03:03 +01:00
payload . append ( QByteArray ( mem . R2B ) . leftJustified ( parse . len , ' ' , true ) ) ;
2023-05-04 21:55:40 +01:00
break ;
2023-05-08 13:26:45 +01:00
case ' z ' :
2023-05-09 17:03:03 +01:00
payload . append ( QByteArray ( mem . name ) . leftJustified ( parse . len , ' ' , true ) ) ;
2023-05-04 21:55:40 +01:00
break ;
default :
break ;
2023-05-02 21:18:41 +01:00
}
2023-05-09 17:03:03 +01:00
if ( finished )
break ;
2023-05-01 21:56:52 +01:00
}
2023-05-15 10:53:52 +01:00
return payload ;
2023-05-01 21:56:52 +01:00
}
2023-05-02 21:18:41 +01:00
void rigCommander : : clearMemory ( quint32 mem )
2023-05-01 21:56:52 +01:00
{
QByteArray payload ;
unsigned char cmd = ' \xff ' ;
2023-05-06 12:36:05 +01:00
qInfo ( logRig ( ) ) < < " Attempting to delete memory " < < ( mem & 0xffff ) < < " from group " < < quint32 ( mem > > 16 & 0xffff ) ;
2023-05-02 21:18:41 +01:00
if ( getCommand ( funcMemoryContents , payload , mem & 0xffff ) )
2023-05-01 21:56:52 +01:00
{
2023-05-06 12:36:05 +01:00
// Format is different for all radios!
foreach ( auto parse , rigCaps . memParser ) {
switch ( parse . spec )
{
case ' a ' :
if ( parse . len = = 1 )
{
payload . append ( quint8 ( mem > > 16 ) & 0xff ) ;
}
else if ( parse . len = = 2 )
{
payload . append ( bcdEncodeInt ( mem > > 16 & 0xffff ) ) ;
}
break ;
default :
break ;
}
2023-05-02 21:18:41 +01:00
}
2023-05-06 12:36:05 +01:00
payload . append ( bcdEncodeInt ( mem & 0xffff ) ) ;
2023-05-01 21:56:52 +01:00
payload . append ( cmd ) ;
prepDataAndSend ( payload ) ;
}
2023-05-06 12:36:05 +01:00
2023-05-01 21:56:52 +01:00
}
2023-05-02 21:18:41 +01:00
void rigCommander : : recallMemory ( quint32 mem )
2023-05-01 21:56:52 +01:00
{
QByteArray payload ;
2023-05-06 12:36:05 +01:00
qInfo ( logRig ( ) ) < < " Attempting to recall memory " < < ( mem & 0xffff ) < < " from group " < < quint32 ( mem > > 16 & 0xffff ) ;
2023-05-08 13:26:45 +01:00
if ( getCommand ( funcMemoryGroup , payload , quint32 ( mem > > 16 & 0xffff ) ) )
2023-05-06 12:36:05 +01:00
{
// Format is different for all radios!
foreach ( auto parse , rigCaps . memParser ) {
switch ( parse . spec )
{
case ' a ' :
if ( parse . len = = 1 )
{
payload . append ( quint8 ( mem > > 16 ) & 0xff ) ;
}
else if ( parse . len = = 2 )
{
payload . append ( bcdEncodeInt ( mem > > 16 & 0xffff ) ) ;
}
break ;
default :
break ;
}
}
prepDataAndSend ( payload ) ;
}
payload . clear ( ) ;
2023-05-02 21:18:41 +01:00
if ( getCommand ( funcMemoryMode , payload , mem & 0xffff ) )
2023-05-01 21:56:52 +01:00
{
2023-05-02 21:18:41 +01:00
payload . append ( bcdEncodeInt ( mem & 0xffff ) ) ;
2023-05-01 21:56:52 +01:00
prepDataAndSend ( payload ) ;
}
2023-05-06 12:36:05 +01:00
2023-05-01 21:56:52 +01:00
}
2021-04-04 00:36:21 -07:00
void rigCommander : : setIPP ( bool enabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcIPPlus , payload , static_cast < int > ( enabled ) ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
2023-04-25 08:56:06 +01:00
prepDataAndSend ( payload ) ;
}
2021-04-04 00:36:21 -07:00
}
void rigCommander : : getIPP ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcIPPlus , payload ) )
2023-04-25 08:56:06 +01:00
{
prepDataAndSend ( payload ) ;
}
2021-04-04 00:36:21 -07:00
}
void rigCommander : : setSatelliteMode ( bool enabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcSatelliteMode , payload , static_cast < int > ( enabled ) ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
2023-04-25 08:56:06 +01:00
prepDataAndSend ( payload ) ;
}
2021-04-04 00:36:21 -07:00
}
void rigCommander : : getSatelliteMode ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcSatelliteMode , payload ) )
{
prepDataAndSend ( payload ) ;
}
2021-04-04 00:36:21 -07:00
}
2021-02-17 23:41:01 -08:00
2018-11-07 15:54:03 -08:00
void rigCommander : : getPTT ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcTransceiverStatus , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2018-11-07 15:54:03 -08:00
}
2018-11-16 14:08:21 -08:00
void rigCommander : : getBandStackReg ( char band , char regCode )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcBandStackReg , payload , band ) )
{
2023-05-09 12:11:38 +01:00
payload . append ( band ) ;
2023-04-23 21:29:44 +01:00
payload . append ( regCode ) ; // [01...03]. 01 = latest, 03 = oldest
prepDataAndSend ( payload ) ;
}
2018-11-16 14:08:21 -08:00
}
2018-11-07 15:54:03 -08:00
void rigCommander : : setPTT ( bool pttOn )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( pttAllowed & & getCommand ( funcTransceiverStatus , payload , static_cast < int > ( pttOn ) ) )
2018-11-07 15:54:03 -08:00
{
2023-04-25 08:56:06 +01:00
payload . append ( static_cast < unsigned char > ( pttOn ) ) ;
prepDataAndSend ( payload ) ;
2018-11-07 15:54:03 -08:00
}
}
2023-01-20 22:11:30 -08:00
void rigCommander : : sendCW ( QString textToSend )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( pttAllowed & & getCommand ( funcSendCW , payload , textToSend . length ( ) ) )
{
2023-04-23 21:29:44 +01:00
QByteArray textData = textToSend . toLocal8Bit ( ) ;
unsigned char p = 0 ;
bool printout = false ;
for ( int c = 0 ; c < textData . length ( ) ; c + + )
2023-01-20 22:11:30 -08:00
{
2023-04-23 21:29:44 +01:00
p = textData . at ( c ) ;
if ( ( ( p > = 0x30 ) & & ( p < = 0x39 ) ) | |
( ( p > = 0x41 ) & & ( p < = 0x5A ) ) | |
( ( p > = 0x61 ) & & ( p < = 0x7A ) ) | |
( p = = 0x2F ) | | ( p = = 0x3F ) | | ( p = = 0x2E ) | |
( p = = 0x2D ) | | ( p = = 0x2C ) | | ( p = = 0x3A ) | |
( p = = 0x27 ) | | ( p = = 0x28 ) | | ( p = = 0x29 ) | |
( p = = 0x3D ) | | ( p = = 0x2B ) | | ( p = = 0x22 ) | |
( p = = 0x40 ) | | ( p = = 0x20 ) )
{
// Allowed character, continue
} else {
qWarning ( logRig ( ) ) < < " Invalid character detected in CW message at position " < < c < < " , the character is " < < textToSend . at ( c ) ;
printout = true ;
textData [ c ] = 0x3F ; // "?"
}
2023-01-20 22:11:30 -08:00
}
2023-04-23 21:29:44 +01:00
if ( printout )
printHex ( textData ) ;
2023-01-20 22:11:30 -08:00
payload . append ( textData ) ;
prepDataAndSend ( payload ) ;
}
}
void rigCommander : : sendStopCW ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcSendCW , payload ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( " \xFF " ) ;
prepDataAndSend ( payload ) ;
}
2023-01-20 22:11:30 -08:00
}
2018-06-19 12:58:52 -07:00
void rigCommander : : setCIVAddr ( unsigned char civAddr )
{
2021-05-30 15:08:22 -07:00
// Note: This sets the radio's CIV address
2018-11-16 14:08:21 -08:00
// the computer's CIV address is defined in the header file.
2021-05-30 15:08:22 -07:00
2018-06-19 12:58:52 -07:00
this - > civAddr = civAddr ;
2021-05-30 15:08:22 -07:00
payloadPrefix = QByteArray ( " \xFE \xFE " ) ;
payloadPrefix . append ( civAddr ) ;
payloadPrefix . append ( ( char ) compCivAddr ) ;
2018-06-19 12:58:52 -07:00
}
2021-02-28 20:10:07 +00:00
void rigCommander : : handleNewData ( const QByteArray & data )
{
2021-02-18 09:14:41 +00:00
emit haveDataForServer ( data ) ;
2018-06-19 12:58:52 -07:00
parseData ( data ) ;
}
2021-03-01 19:53:12 +00:00
void rigCommander : : receiveAudioData ( const audioPacket & data )
2021-02-28 20:10:07 +00:00
{
emit haveAudioData ( data ) ;
}
2018-06-22 16:31:52 -07:00
void rigCommander : : parseData ( QByteArray dataInput )
2018-06-19 12:58:52 -07:00
{
2018-06-22 16:31:52 -07:00
// TODO: Clean this up.
// It finally works very nicely, needs to be streamlined.
//
2018-06-19 12:58:52 -07:00
2018-06-22 16:31:52 -07:00
int index = 0 ;
volatile int count = 0 ; // debug purposes
2018-06-19 12:58:52 -07:00
2018-06-22 16:31:52 -07:00
// use this:
QList < QByteArray > dataList = dataInput . split ( ' \xFD ' ) ;
QByteArray data ;
2021-05-15 18:53:16 +01:00
// qInfo(logRig()) << "data list has this many elements: " << dataList.size();
2018-06-22 16:31:52 -07:00
if ( dataList . last ( ) . isEmpty ( ) )
{
dataList . removeLast ( ) ; // if the original ended in FD, then there is a blank entry at the end.
}
// Only thing is, each frame is missing '\xFD' at the end. So append! Keeps the frames intact.
for ( index = 0 ; index < dataList . count ( ) ; index + + )
{
data = dataList [ index ] ;
data . append ( ' \xFD ' ) ; // because we expect it to be there.
// foreach(listitem)
// listitem.append('\xFD');
// continue parsing...
2018-06-19 12:58:52 -07:00
2018-06-22 16:31:52 -07:00
count + + ;
// Data echo'd back from the rig start with this:
// fe fe 94 e0 ...... fd
2018-06-19 12:58:52 -07:00
2018-06-22 16:31:52 -07:00
// Data from the rig that is not an echo start with this:
// fe fe e0 94 ...... fd (for example, a reply to a query)
// Data from the rig that was not asked for is sent to controller 0x00:
// fe fe 00 94 ...... fd (for example, user rotates the tune control or changes the mode)
2021-05-15 18:53:16 +01:00
//qInfo(logRig()) << "Data received: ";
2018-06-22 16:31:52 -07:00
//printHex(data, false, true);
if ( data . length ( ) < 4 )
2018-06-19 12:58:52 -07:00
{
2018-06-22 16:31:52 -07:00
if ( data . length ( ) )
{
// Finally this almost never happens
2021-05-15 18:53:16 +01:00
// qInfo(logRig()) << "Data length too short: " << data.length() << " bytes. Data:";
2018-11-29 14:32:59 -08:00
//printHex(data, false, true);
2018-06-22 16:31:52 -07:00
}
// no
//return;
// maybe:
// continue;
2018-06-19 12:58:52 -07:00
}
2018-06-22 16:31:52 -07:00
if ( ! data . startsWith ( " \xFE \xFE " ) )
2018-06-19 12:58:52 -07:00
{
2021-05-15 18:53:16 +01:00
// qInfo(logRig()) << "Warning: Invalid data received, did not start with FE FE.";
2018-06-22 16:31:52 -07:00
// find 94 e0 and shift over,
// or look inside for a second FE FE
// Often a local echo will miss a few bytes at the beginning.
if ( data . startsWith ( ' \xFE ' ) )
{
data . prepend ( ' \xFE ' ) ;
2021-05-15 18:53:16 +01:00
// qInfo(logRig()) << "Warning: Working with prepended data stream.";
2018-06-22 16:31:52 -07:00
parseData ( payloadIn ) ;
return ;
} else {
2021-05-15 18:53:16 +01:00
//qInfo(logRig()) << "Error: Could not reconstruct corrupted data: ";
2018-11-29 13:57:15 -08:00
//printHex(data, false, true);
2018-06-22 16:31:52 -07:00
// data.right(data.length() - data.find('\xFE\xFE'));
// if found do not return and keep going.
return ;
}
2018-06-19 12:58:52 -07:00
}
2018-06-22 16:31:52 -07:00
if ( ( unsigned char ) data [ 02 ] = = civAddr )
{
// data is or begins with an echoback from what we sent
// find the first 'fd' and cut it. Then continue.
//payloadIn = data.right(data.length() - data.indexOf('\xfd')-1);
2021-05-15 18:53:16 +01:00
// qInfo(logRig()) << "[FOUND] Trimmed off echo:";
2018-06-22 16:31:52 -07:00
//printHex(payloadIn, false, true);
//parseData(payloadIn);
//return;
}
2018-06-19 12:58:52 -07:00
2021-02-10 17:32:56 +00:00
incomingCIVAddr = data [ 03 ] ; // track the CIV of the sender.
2018-06-22 16:31:52 -07:00
switch ( data [ 02 ] )
{
// case civAddr: // can't have a variable here :-(
// // data is or begins with an echoback from what we sent
// // find the first 'fd' and cut it. Then continue.
// payloadIn = data.right(data.length() - data.indexOf('\xfd')-1);
2021-05-15 18:53:16 +01:00
// //qInfo(logRig()) << "Trimmed off echo:";
2018-06-22 16:31:52 -07:00
// //printHex(payloadIn, false, true);
// parseData(payloadIn);
// break;
2018-11-16 14:08:21 -08:00
// case '\xE0':
2019-01-10 12:31:04 -08:00
case ( char ) 0xE0 :
2018-11-16 14:08:21 -08:00
case ( char ) compCivAddr :
2018-06-22 16:31:52 -07:00
// data is a reply to some query we sent
// extract the payload out and parse.
// payload = getpayload(data); // or something
// parse (payload); // recursive ok?
payloadIn = data . right ( data . length ( ) - 4 ) ;
2021-06-15 10:28:20 -07:00
if ( payloadIn . contains ( " \xFE " ) )
{
//qDebug(logRig()) << "Corrupted data contains FE within message body: ";
//printHex(payloadIn);
break ;
}
2018-06-22 16:31:52 -07:00
parseCommand ( ) ;
break ;
case ' \x00 ' :
// data send initiated by the rig due to user control
// extract the payload out and parse.
2021-02-10 17:32:56 +00:00
if ( ( unsigned char ) data [ 03 ] = = compCivAddr )
{
// This is an echo of our own broadcast request.
// The data are "to 00" and "from E1"
// Don't use it!
2021-06-15 10:28:20 -07:00
qDebug ( logRig ( ) ) < < " Caught it! Found the echo'd broadcast request from us! Rig has not responded to broadcast query yet. " ;
2021-02-10 17:32:56 +00:00
} else {
2021-06-15 10:28:20 -07:00
payloadIn = data . right ( data . length ( ) - 4 ) ; // Removes FE FE E0 94 part
if ( payloadIn . contains ( " \xFE " ) )
{
//qDebug(logRig()) << "Corrupted data contains FE within message body: ";
//printHex(payloadIn);
break ;
}
2021-02-10 17:32:56 +00:00
parseCommand ( ) ;
}
2018-06-22 16:31:52 -07:00
break ;
default :
// could be for other equipment on the CIV network.
// just drop for now.
2018-11-19 23:42:34 -08:00
// relaySendOutData(data);
2018-06-22 16:31:52 -07:00
break ;
}
}
/*
if ( dataList . length ( ) > 1 )
2018-06-19 12:58:52 -07:00
{
2021-05-15 18:53:16 +01:00
qInfo ( logRig ( ) ) < < " Recovered " < < count < < " frames from single data with size " < < dataList . count ( ) ;
2018-06-19 12:58:52 -07:00
}
2018-06-22 16:31:52 -07:00
*/
2018-06-19 12:58:52 -07:00
}
void rigCommander : : parseCommand ( )
{
2021-04-11 00:42:25 -07:00
2023-04-24 08:37:10 +01:00
# ifdef DEBUG_PARSE
2023-04-23 21:29:44 +01:00
QElapsedTimer performanceTimer ;
performanceTimer . start ( ) ;
2023-04-24 08:37:10 +01:00
# endif
2018-11-16 14:08:21 -08:00
2023-04-23 21:29:44 +01:00
funcs func = funcNone ;
2023-05-25 23:17:54 +01:00
bool sub = false ;
2023-05-26 19:11:36 +01:00
2023-05-25 23:17:54 +01:00
if ( rigCaps . hasCommand29 & & payloadIn [ 0 ] = = ' \x29 ' )
{
sub = static_cast < bool > ( payloadIn [ 1 ] ) ;
2023-06-05 09:27:37 +01:00
payloadIn . remove ( 0 , 2 ) ;
2023-05-25 23:17:54 +01:00
}
2018-06-19 12:58:52 -07:00
2023-05-06 12:36:05 +01:00
// As some commands bave both single and multi-byte options, start at 4 characters and work down to 1.
// This is quite wasteful as many commands are single-byte, but I can't think of an easier way?
for ( int i = 4 ; i > 0 ; i - - )
2023-04-23 21:29:44 +01:00
{
auto it = rigCaps . commandsReverse . find ( payloadIn . left ( i ) ) ;
if ( it ! = rigCaps . commandsReverse . end ( ) )
{
func = it . value ( ) ;
2018-06-19 12:58:52 -07:00
break ;
2023-04-23 21:29:44 +01:00
}
}
2023-04-24 08:37:10 +01:00
# ifdef DEBUG_PARSE
2023-04-23 21:29:44 +01:00
int currentParse = performanceTimer . nsecsElapsed ( ) ;
2023-04-24 08:37:10 +01:00
# endif
2023-04-23 21:29:44 +01:00
if ( ! rigCaps . commands . contains ( func ) ) {
2023-05-26 19:11:36 +01:00
// Don't warn if we haven't received rigCaps yet
if ( haveRigCaps )
qInfo ( logRig ( ) ) < < " Unsupported command received from rig " < < payloadIn . toHex ( ) . mid ( 0 , 10 ) < < " Check rig file " ;
2023-04-23 21:29:44 +01:00
return ;
}
2023-05-15 10:53:52 +01:00
freqt test ;
2023-05-03 19:08:20 +01:00
QVector < memParserFormat > memParser ;
2023-05-15 10:53:52 +01:00
QVariant value ;
2023-04-23 21:29:44 +01:00
switch ( func )
{
case funcFreqGet :
2023-05-24 19:50:01 +01:00
case funcFreqTR :
2023-04-26 18:41:38 +01:00
case funcReadTXFreq :
2023-05-15 10:53:52 +01:00
{
value . setValue ( parseFrequency ( ) ) ;
2023-03-17 23:35:40 +00:00
break ;
2023-05-15 10:53:52 +01:00
}
2023-04-27 16:39:51 +01:00
case funcVFODualWatch :
// Not currently used, but will report the current dual-watch status
break ;
2023-05-15 10:53:52 +01:00
case funcUnselectedFreq :
2023-06-05 09:27:37 +01:00
sub = true ;
case funcSelectedFreq :
2023-05-15 10:53:52 +01:00
{
value . setValue ( parseFrequency ( payloadIn , 5 ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
}
2023-04-23 21:29:44 +01:00
case funcModeGet :
case funcModeTR :
2023-05-08 13:26:45 +01:00
{
2023-05-15 13:47:45 +01:00
modeInfo m ;
2023-05-15 10:53:52 +01:00
m = parseMode ( payloadIn [ 1 ] , m . filter ) ;
2023-05-08 13:26:45 +01:00
if ( payloadIn [ 2 ] ! = ' \xFD ' )
{
2023-05-15 10:53:52 +01:00
m . filter = payloadIn [ 2 ] ;
2023-05-08 13:26:45 +01:00
} else {
2023-05-15 10:53:52 +01:00
m . filter = 0 ;
2023-05-08 13:26:45 +01:00
}
2023-05-15 10:53:52 +01:00
value . setValue ( m ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-08 13:26:45 +01:00
}
2023-05-15 10:53:52 +01:00
case funcUnselectedMode :
2023-06-05 09:27:37 +01:00
sub = true ;
case funcSelectedMode :
2023-05-08 13:26:45 +01:00
{
2023-05-15 13:47:45 +01:00
modeInfo m ;
2023-05-08 13:26:45 +01:00
// New format payload with mode+datamode+filter
2023-05-15 10:53:52 +01:00
m = parseMode ( uchar ( payloadIn [ 2 ] ) , uchar ( payloadIn [ 4 ] ) ) ;
m . data = bool ( payloadIn [ 3 ] ) ;
m . VFO = selVFO_t ( payloadIn [ 1 ] & 0x01 ) ;
value . setValue ( m ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-08 13:26:45 +01:00
}
2023-05-08 13:34:41 +01:00
# if defined __GNUC__
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
# endif
2023-05-03 19:08:20 +01:00
case funcSatelliteMemory :
memParser = rigCaps . satParser ;
2023-04-27 16:39:51 +01:00
case funcMemoryContents :
2023-05-01 21:56:52 +01:00
{
2023-05-04 21:55:40 +01:00
memoryType mem ;
2023-05-03 19:08:20 +01:00
if ( memParser . isEmpty ( ) ) {
memParser = rigCaps . memParser ;
2023-05-04 21:55:40 +01:00
mem . sat = false ;
} else {
mem . sat = true ;
2023-05-03 19:08:20 +01:00
}
2023-05-15 10:53:52 +01:00
if ( parseMemory ( & memParser , & mem ) ) {
value . setValue ( mem ) ;
2023-05-03 13:38:06 +01:00
}
2023-05-15 10:53:52 +01:00
break ;
2023-05-01 21:56:52 +01:00
}
2023-05-08 13:34:41 +01:00
# if defined __GNUC__
# pragma GCC diagnostic pop
# endif
2023-04-27 16:39:51 +01:00
case funcMemoryClear :
case funcMemoryKeyer :
case funcMemoryToVFO :
case funcMemoryWrite :
break ;
case funcScanning :
break ;
2023-04-26 18:41:38 +01:00
case funcReadFreqOffset :
2023-05-15 10:53:52 +01:00
value . setValue ( parseFrequencyRptOffset ( payloadIn ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
// These return a single byte that we convert to a uchar (0-99)
2023-04-27 16:39:51 +01:00
case funcTuningStep :
2023-04-23 21:29:44 +01:00
case funcAttenuator :
2023-05-24 19:50:01 +01:00
// Return a duplexMode_t for split or duplex (same function)
case funcSplitStatus :
2023-05-25 23:43:45 +01:00
value . setValue ( static_cast < duplexMode_t > ( uchar ( payloadIn [ 1 ] ) ) ) ;
2023-05-24 19:50:01 +01:00
break ;
2023-04-23 21:29:44 +01:00
case funcAntenna :
2023-05-15 10:53:52 +01:00
{
antennaInfo ant ;
ant . antenna = static_cast < uchar > ( payloadIn [ 1 ] ) ;
ant . rx = static_cast < bool > ( payloadIn [ 2 ] ) ;
value . setValue ( ant ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-04-27 16:39:51 +01:00
// Register 13 (speech) has no get values
2023-04-23 21:29:44 +01:00
// Register 14 (levels) starts here:
2023-05-15 10:53:52 +01:00
}
case funcAfGain :
2023-04-23 21:29:44 +01:00
if ( udp = = Q_NULLPTR ) {
2023-05-15 10:53:52 +01:00
value . setValue ( bcdHexToUChar ( payloadIn [ 2 ] , payloadIn [ 3 ] ) ) ;
2023-05-24 19:50:01 +01:00
} else {
value . setValue ( localVolume ) ;
2023-04-23 21:29:44 +01:00
}
break ;
2023-05-15 10:53:52 +01:00
// The following group are 2 bytes converted to uchar (0-255)
case funcAGCTime :
2023-04-23 21:29:44 +01:00
case funcRfGain :
2023-04-26 18:41:38 +01:00
case funcSquelch :
2023-04-27 16:39:51 +01:00
case funcAPFLevel :
case funcNRLevel :
2023-04-23 21:29:44 +01:00
case funcPBTInner :
case funcPBTOuter :
case funcIFShift :
case funcCwPitch :
2023-04-26 18:41:38 +01:00
case funcRFPower :
2023-04-23 21:29:44 +01:00
case funcMicGain :
case funcKeySpeed :
2023-04-27 16:39:51 +01:00
case funcNotchFilter :
2023-04-26 18:41:38 +01:00
case funcCompressorLevel :
2023-04-27 16:39:51 +01:00
case funcBreakInDelay :
2023-04-23 21:29:44 +01:00
case funcNBLevel :
2023-04-27 16:39:51 +01:00
case funcDigiSelShift :
case funcDriveGain :
2023-04-23 21:29:44 +01:00
case funcMonitorGain :
case funcVoxGain :
case funcAntiVoxGain :
// 0x15 Meters
case funcSMeter :
case funcCenterMeter :
case funcPowerMeter :
case funcSWRMeter :
case funcALCMeter :
case funcCompMeter :
case funcVdMeter :
case funcIdMeter :
2023-05-15 10:53:52 +01:00
value . setValue ( bcdHexToUChar ( payloadIn [ 2 ] , payloadIn [ 3 ] ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-27 20:26:53 +01:00
// These are 2 byte commands that return a single byte (0-99) from position 2
case funcBreakIn : // This is 0,1 or 2
2023-04-23 21:29:44 +01:00
case funcPreamp :
2023-05-27 20:26:53 +01:00
case funcManualNotchWidth :
case funcSSBTXBandwidth :
case funcDSPIFFilter :
value . setValue ( uchar ( payloadIn [ 2 ] ) ) ;
break ;
// The following group ALL return bool
2023-04-26 18:41:38 +01:00
case funcNoiseBlanker :
2023-04-27 16:39:51 +01:00
case funcAudioPeakFilter :
2023-04-26 18:41:38 +01:00
case funcNoiseReduction :
2023-04-23 21:29:44 +01:00
case funcAutoNotch :
2023-04-26 18:41:38 +01:00
case funcRepeaterTone :
case funcRepeaterTSQL :
2023-04-27 16:39:51 +01:00
case funcRepeaterDTCS :
case funcRepeaterCSQL :
2023-04-23 21:29:44 +01:00
case funcCompressor :
case funcMonitor :
case funcVox :
case funcManualNotch :
2023-04-27 16:39:51 +01:00
case funcDigiSel :
case funcTwinPeakFilter :
2023-04-23 21:29:44 +01:00
case funcDialLock :
2023-05-15 10:53:52 +01:00
case funcOverflowStatus :
case funcSMeterSqlStatus :
case funcVariousSql :
2023-04-27 16:39:51 +01:00
case funcRXAntenna :
2023-05-15 10:53:52 +01:00
value . setValue ( static_cast < bool > ( payloadIn [ 2 ] ) ) ;
2023-04-27 16:39:51 +01:00
break ;
case funcMainSubTracking :
2023-04-29 14:35:55 +01:00
case funcToneSquelchType :
2023-05-15 13:47:45 +01:00
emit haveRptAccessMode ( ( rptAccessTxRx_t ) payloadIn . at ( 2 ) ) ;
2023-04-29 14:35:55 +01:00
break ;
2023-04-27 16:39:51 +01:00
case funcIPPlus :
break ;
// 0x17 is CW send and 0x18 is power control (no reply)
2023-05-12 00:24:01 +01:00
// 0x19 it automatically added.
2023-04-23 21:29:44 +01:00
case funcTransceiverId :
2023-05-15 10:53:52 +01:00
value . setValue ( static_cast < uchar > ( payloadIn [ 2 ] ) ) ;
2023-05-24 19:50:01 +01:00
if ( rigList . contains ( uchar ( payloadIn [ 2 ] ) ) )
{
this - > model = rigList . find ( uchar ( payloadIn [ 2 ] ) ) . key ( ) ;
}
//model = determineRadioModel(payloadIn[2]); // verify this is the model not the CIV
2023-04-23 21:29:44 +01:00
rigCaps . modelID = payloadIn [ 2 ] ;
determineRigCaps ( ) ;
2023-05-12 00:24:01 +01:00
qInfo ( logRig ( ) ) < < " Have rig ID: " < < QString : : number ( rigCaps . modelID , 16 ) ;
2023-04-23 21:29:44 +01:00
break ;
// 0x1a
case funcBandStackReg :
2023-05-26 18:38:40 +01:00
{
bandStackType bsr ;
bsr . band = payloadIn [ 2 ] ;
bsr . regCode = payloadIn [ 3 ] ;
bsr . freq = parseFrequency ( payloadIn , 7 ) ;
// The Band Stacking command returns the regCode in the position that VFO is expected.
// As BSR is always on the active VFO, just set that.
bsr . freq . VFO = selVFO_t : : activeVFO ;
bsr . data = ( payloadIn [ 11 ] & 0x10 ) > > 4 ; // not sure...
bsr . mode = payloadIn [ 9 ] ;
bsr . filter = payloadIn [ 10 ] ;
value . setValue ( bsr ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-26 18:38:40 +01:00
}
2023-04-26 18:41:38 +01:00
case funcFilterWidth :
2023-04-23 21:29:44 +01:00
{
quint16 calc ;
quint8 pass = bcdHexToUChar ( ( quint8 ) payloadIn [ 2 ] ) ;
2023-06-05 09:27:37 +01:00
modeInfo m ;
if ( sub )
m = queue - > getCache ( funcUnselectedMode ) . value . value < modeInfo > ( ) ;
else
m = queue - > getCache ( funcSelectedMode ) . value . value < modeInfo > ( ) ;
2023-05-27 20:26:53 +01:00
if ( m . mk = = modeAM )
{
2023-04-23 21:29:44 +01:00
calc = 200 + ( pass * 200 ) ;
}
else if ( pass < = 10 )
{
calc = 50 + ( pass * 50 ) ;
}
else {
calc = 600 + ( ( pass - 10 ) * 100 ) ;
}
2023-05-15 10:53:52 +01:00
value . setValue ( calc ) ;
2023-04-23 21:29:44 +01:00
break ;
}
2023-04-26 18:41:38 +01:00
case funcDataModeWithFilter :
2023-05-15 10:53:52 +01:00
{
2023-05-15 13:47:45 +01:00
modeInfo m ;
2023-05-15 10:53:52 +01:00
m . data = static_cast < uchar > ( payloadIn [ 2 ] ) ;
if ( payloadIn [ 3 ] ! = ' \xfd ' )
m . filter = static_cast < uchar > ( payloadIn [ 3 ] ) ;
2023-05-15 13:47:45 +01:00
value . setValue ( static_cast < modeInfo > ( m ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
}
2023-04-26 18:41:38 +01:00
case funcAFMute :
2023-05-27 20:26:53 +01:00
// TODO add AF Mute
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
// 0x1a 0x05 various registers below are 2 byte (0-255) as uchar
2023-04-26 18:41:38 +01:00
case funcREFAdjust :
case funcREFAdjustFine :
2023-05-15 10:53:52 +01:00
case funcACCAModLevel :
case funcACCBModLevel :
2023-04-26 18:41:38 +01:00
case funcUSBModLevel :
case funcLANModLevel :
2023-05-15 10:53:52 +01:00
case funcSPDIFModLevel :
value . setValue ( bcdHexToUChar ( payloadIn [ 4 ] , payloadIn [ 5 ] ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
// Singla byte returned as uchar (0-99)
2023-04-26 18:41:38 +01:00
case funcDATAOffMod :
case funcDATA1Mod :
case funcDATA2Mod :
case funcDATA3Mod :
2023-05-15 10:53:52 +01:00
{
foreach ( auto r , rigCaps . inputs )
{
if ( r . reg = = bcdHexToUChar ( payloadIn [ 4 ] ) )
{
value . setValue ( rigInput ( r ) ) ;
break ;
}
}
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
}
2023-04-24 11:06:33 +01:00
case funcDashRatio :
2023-05-15 10:53:52 +01:00
value . setValue ( bcdHexToUChar ( payloadIn [ 4 ] ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
// 0x1b register (tones)
case funcToneFreq :
2023-04-26 18:41:38 +01:00
case funcTSQLFreq :
2023-04-29 14:35:55 +01:00
case funcDTCSCode :
case funcCSQLCode :
2023-05-15 10:53:52 +01:00
value . setValue ( decodeTone ( payloadIn ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
// 0x1c register (bool)
case funcRitStatus :
2023-04-26 18:41:38 +01:00
case funcTransceiverStatus :
2023-05-15 10:53:52 +01:00
value . setValue ( static_cast < bool > ( payloadIn [ 2 ] ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
// tuner is 0-2
2023-04-26 18:41:38 +01:00
case funcTunerStatus :
2023-05-15 10:53:52 +01:00
value . setValue ( bcdHexToUChar ( payloadIn [ 2 ] ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-04-27 16:39:51 +01:00
// 0x21 RIT:
case funcRITFreq :
{
2023-05-15 10:53:52 +01:00
short ritHz = 0 ;
2023-04-27 16:39:51 +01:00
freqt f ;
QByteArray longfreq ;
longfreq = payloadIn . mid ( 2 , 2 ) ;
longfreq . append ( QByteArray ( 3 , ' \x00 ' ) ) ;
f = parseFrequency ( longfreq , 3 ) ;
if ( payloadIn . length ( ) < 5 )
break ;
ritHz = f . Hz * ( ( payloadIn . at ( 4 ) = = ' \x01 ' ) ? - 1 : 1 ) ;
2023-05-15 10:53:52 +01:00
value . setValue ( ritHz ) ;
2023-05-24 19:50:01 +01:00
qInfo ( ) < < " Have RIT " < < ritHz ;
2023-04-27 16:39:51 +01:00
break ;
}
2023-04-23 21:29:44 +01:00
// 0x27
2023-06-01 17:57:44 +01:00
case funcScopeSubWaveData :
2023-06-05 09:27:37 +01:00
case funcScopeMainWaveData :
2023-05-15 10:53:52 +01:00
{
scopeData d ;
if ( parseSpectrum ( d ) )
value . setValue ( d ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
}
2023-04-23 21:29:44 +01:00
case funcScopeOnOff :
// confirming scope is on
2023-04-26 18:41:38 +01:00
case funcScopeDataOutput :
2023-04-23 21:29:44 +01:00
// confirming output enabled/disabled of wf data.
case funcScopeMainSub :
// This tells us whether we are receiving main or sub data
case funcScopeSingleDual :
// This tells us whether we are receiving single or dual scopes
2023-06-01 17:57:44 +01:00
value . setValue ( static_cast < bool > ( payloadIn [ 2 ] ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-06-05 09:27:37 +01:00
case funcScopeSubMode :
sub = true ;
2023-05-24 19:50:01 +01:00
case funcScopeMainMode :
2023-04-23 21:29:44 +01:00
// fixed or center
// [1] 0x14
// [2] 0x00
// [3] 0x00 (center), 0x01 (fixed), 0x02, 0x03
2023-05-15 13:47:45 +01:00
value . setValue ( static_cast < spectrumMode_t > ( uchar ( payloadIn [ 3 ] ) ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-06-05 09:27:37 +01:00
case funcScopeSubSpan :
2023-05-24 19:50:01 +01:00
case funcScopeMainSpan :
2023-05-15 10:53:52 +01:00
{
freqt f = parseFrequency ( payloadIn , 6 ) ;
2023-05-24 19:50:01 +01:00
foreach ( auto s , rigCaps . scopeCenterSpans )
{
if ( s . freq = = f . Hz )
{
value . setValue ( s ) ;
}
}
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
}
2023-06-05 09:27:37 +01:00
case funcScopeSubEdge :
2023-05-24 19:50:01 +01:00
case funcScopeMainEdge :
2023-04-23 21:29:44 +01:00
// read edge mode center in edge mode
// [1] 0x16
// [2] 0x01, 0x02, 0x03: Edge 1,2,3
2023-05-15 10:53:52 +01:00
value . setValue ( bcdHexToUChar ( payloadIn [ 2 ] ) ) ;
//emit haveScopeEdge((char)payloadIn[2]);
2023-04-23 21:29:44 +01:00
break ;
2023-06-05 09:27:37 +01:00
case funcScopeSubHold :
2023-05-24 19:50:01 +01:00
case funcScopeMainHold :
2023-04-23 21:29:44 +01:00
// Hold status (only 9700?)
2023-05-15 10:53:52 +01:00
value . setValue ( static_cast < bool > ( payloadIn [ 2 ] ) ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-06-05 09:27:37 +01:00
case funcScopeSubRef :
2023-05-24 19:50:01 +01:00
case funcScopeMainRef :
2023-05-15 10:53:52 +01:00
{
2023-04-23 21:29:44 +01:00
// scope reference level
// [1] 0x19
// [2] 0x00
// [3] 10dB digit, 1dB digit
// [4] 0.1dB digit, 0
// [5] 0x00 = +, 0x01 = -
2023-05-15 10:53:52 +01:00
unsigned char negative = payloadIn [ 5 ] ;
short ref = bcdHexToUInt ( payloadIn [ 3 ] , payloadIn [ 4 ] ) ;
ref = ref / 10 ;
if ( negative ) {
ref * = ( - 1 * negative ) ;
}
value . setValue ( ref ) ;
2023-04-23 21:29:44 +01:00
break ;
2023-05-15 10:53:52 +01:00
}
2023-06-05 09:27:37 +01:00
case funcScopeSubSpeed :
2023-05-24 19:50:01 +01:00
case funcScopeMainSpeed :
2023-06-05 09:27:37 +01:00
break ;
case funcScopeSubVBW :
2023-05-24 19:50:01 +01:00
case funcScopeMainVBW :
2023-06-05 09:27:37 +01:00
break ;
case funcScopeSubRBW :
2023-05-24 19:50:01 +01:00
case funcScopeMainRBW :
2023-04-23 21:29:44 +01:00
break ;
2023-06-05 09:27:37 +01:00
case funcScopeFixedEdgeFreq :
case funcScopeDuringTX :
case funcScopeCenterType :
break ;
2023-04-23 21:29:44 +01:00
// 0x28
case funcVoiceTX :
break ;
2023-04-27 16:39:51 +01:00
//0x29 - Prefix certain commands with this to get/set certain values without changing current VFO
// If we use it for get commands, need to parse the \x29\x<VFO> first.
2023-04-26 18:41:38 +01:00
case funcMainSubPrefix :
2023-04-23 21:29:44 +01:00
break ;
case funcFB :
break ;
case funcFA :
qInfo ( logRig ( ) ) < < " Error (FA) received from rig. " ;
printHex ( payloadIn , false , true ) ;
break ;
default :
2023-05-26 19:11:36 +01:00
qWarning ( logRig ( ) ) < < " Unhandled command received from rig " < < payloadIn . toHex ( ) . mid ( 0 , 10 ) < < " Contact support! " ;
2023-04-23 21:29:44 +01:00
break ;
}
2023-05-24 19:50:01 +01:00
if ( func ! = funcScopeMainWaveData & & func ! = funcScopeSubWaveData & & payloadIn [ 00 ] ! = ' \x15 ' )
2023-04-23 21:29:44 +01:00
{
// We do not log spectrum and meter data,
// as they tend to clog up any useful logging.
qDebug ( logRigTraffic ( ) ) < < " Received from radio: " ;
printHexNow ( payloadIn , logRigTraffic ( ) ) ;
}
2021-05-15 18:53:16 +01:00
2023-04-24 08:37:10 +01:00
# ifdef DEBUG_PARSE
2023-04-23 21:29:44 +01:00
averageParseTime + = currentParse ;
if ( lowParse > currentParse )
lowParse = currentParse ;
else if ( highParse < currentParse )
highParse = currentParse ;
numParseSamples + + ;
if ( lastParseReport . msecsTo ( QTime : : currentTime ( ) ) > = 10000 )
{
qInfo ( logRig ( ) ) < < QString ( " 10 second average command parse time %0 ns (low=%1, high=%2, num=%3: " ) . arg ( averageParseTime / numParseSamples ) . arg ( lowParse ) . arg ( highParse ) . arg ( numParseSamples ) ;
averageParseTime = 0 ;
numParseSamples = 0 ;
lowParse = 9999 ;
highParse = 0 ;
lastParseReport = QTime : : currentTime ( ) ;
}
2023-04-24 08:37:10 +01:00
# endif
2023-05-15 10:53:52 +01:00
if ( value . isValid ( ) & & queue ! = Q_NULLPTR ) {
2023-05-25 23:17:54 +01:00
queue - > receiveValue ( func , value , sub ) ;
2023-05-15 10:53:52 +01:00
}
}
bool rigCommander : : parseMemory ( QVector < memParserFormat > * memParser , memoryType * mem )
{
// Parse the memory entry into a memoryType, set some defaults so we don't get an unitialized warning.
mem - > frequency . Hz = 0 ;
mem - > frequency . VFO = activeVFO ;
mem - > frequency . MHzDouble = 0.0 ;
mem - > frequencyB = mem - > frequency ;
mem - > duplexOffset = mem - > frequency ;
mem - > duplexOffsetB = mem - > frequency ;
mem - > scan = 0xfe ;
memset ( mem - > UR , 0x0 , sizeof ( mem - > UR ) ) ;
memset ( mem - > URB , 0x0 , sizeof ( mem - > UR ) ) ;
memset ( mem - > R1 , 0x0 , sizeof ( mem - > R1 ) ) ;
memset ( mem - > R1B , 0x0 , sizeof ( mem - > R1B ) ) ;
memset ( mem - > R2 , 0x0 , sizeof ( mem - > R2 ) ) ;
memset ( mem - > R2B , 0x0 , sizeof ( mem - > R2B ) ) ;
memset ( mem - > name , 0x0 , sizeof ( mem - > name ) ) ;
foreach ( auto parse , * memParser ) {
// non-existant memory is short so send what we have so far.
if ( payloadIn . size ( ) < ( parse . pos + 1 + parse . len ) ) {
return true ;
}
QByteArray data = payloadIn . mid ( parse . pos + 1 , parse . len ) ;
switch ( parse . spec )
{
case ' a ' :
if ( parse . len = = 1 ) {
mem - > group = bcdHexToUChar ( data [ 0 ] ) ;
}
else
{
mem - > group = bcdHexToUChar ( data [ 0 ] , data [ 1 ] ) ;
}
break ;
case ' b ' :
mem - > channel = bcdHexToUChar ( data [ 0 ] , data [ 1 ] ) ;
break ;
case ' c ' :
mem - > scan = data [ 0 ] ;
break ;
case ' d ' : // combined split and scan
mem - > split = quint8 ( data [ 0 ] > > 4 & 0x0f ) ;
mem - > scan = quint8 ( data [ 0 ] & 0x0f ) ;
break ;
case ' e ' :
mem - > vfo = data [ 0 ] ;
break ;
case ' E ' :
mem - > vfoB = data [ 0 ] ;
break ;
case ' f ' :
mem - > frequency . Hz = parseFreqDataToInt ( data ) ;
break ;
case ' F ' :
mem - > frequencyB . Hz = parseFreqDataToInt ( data ) ;
break ;
case ' g ' :
mem - > mode = data [ 0 ] ;
break ;
case ' G ' :
mem - > modeB = data [ 0 ] ;
break ;
case ' h ' :
mem - > filter = data [ 0 ] ;
break ;
case ' H ' :
mem - > filterB = data [ 0 ] ;
break ;
case ' i ' : // single datamode
mem - > datamode = data [ 0 ] ;
break ;
case ' I ' : // single datamode
mem - > datamodeB = data [ 0 ] ;
break ;
case ' j ' : // combined duplex and tonemode
2023-05-15 13:47:45 +01:00
mem - > duplex = duplexMode_t ( quint8 ( data [ 0 ] > > 4 & 0x0f ) ) ;
2023-05-15 10:53:52 +01:00
mem - > tonemode = quint8 ( quint8 ( data [ 0 ] & 0x0f ) ) ;
break ;
case ' J ' : // combined duplex and tonemodeB
2023-05-15 13:47:45 +01:00
mem - > duplexB = duplexMode_t ( ( data [ 0 ] > > 4 & 0x0f ) ) ;
2023-05-15 10:53:52 +01:00
mem - > tonemodeB = data [ 0 ] & 0x0f ;
break ;
case ' k ' : // combined datamode and tonemode
mem - > datamode = ( quint8 ( data [ 0 ] > > 4 & 0x0f ) ) ;
mem - > tonemode = data [ 0 ] & 0x0f ;
break ;
case ' K ' : // combined datamode and tonemode
mem - > datamodeB = ( quint8 ( data [ 0 ] > > 4 & 0x0f ) ) ;
mem - > tonemodeB = data [ 0 ] & 0x0f ;
break ;
case ' l ' : // tonemode
mem - > tonemode = data [ 0 ] & 0x0f ;
break ;
case ' L ' : // tonemode
mem - > tonemodeB = data [ 0 ] & 0x0f ;
break ;
case ' m ' :
mem - > dsql = ( quint8 ( data [ 0 ] > > 4 & 0x0f ) ) ;
break ;
case ' M ' :
mem - > dsqlB = ( quint8 ( data [ 0 ] > > 4 & 0x0f ) ) ;
break ;
case ' n ' :
mem - > tone = bcdHexToUInt ( data [ 1 ] , data [ 2 ] ) ; // First byte is not used
break ;
case ' N ' :
mem - > toneB = bcdHexToUInt ( data [ 1 ] , data [ 2 ] ) ; // First byte is not used
break ;
case ' o ' :
mem - > tsql = bcdHexToUInt ( data [ 1 ] , data [ 2 ] ) ; // First byte is not used
break ;
case ' O ' :
mem - > tsqlB = bcdHexToUInt ( data [ 1 ] , data [ 2 ] ) ; // First byte is not used
break ;
case ' p ' :
mem - > dtcsp = ( quint8 ( data [ 0 ] > > 3 & 0x02 ) | quint8 ( data [ 0 ] & 0x01 ) ) ;
break ;
case ' P ' :
mem - > dtcspB = ( quint8 ( data [ 0 ] > > 3 & 0x10 ) | quint8 ( data [ 0 ] & 0x01 ) ) ;
break ;
case ' q ' :
mem - > dtcs = bcdHexToUInt ( data [ 0 ] , data [ 1 ] ) ;
break ;
case ' Q ' :
mem - > dtcsB = bcdHexToUInt ( data [ 0 ] , data [ 1 ] ) ;
break ;
case ' r ' :
mem - > dvsql = bcdHexToUInt ( data [ 0 ] , data [ 1 ] ) ;
break ;
case ' R ' :
mem - > dvsqlB = bcdHexToUInt ( data [ 0 ] , data [ 1 ] ) ;
break ;
case ' s ' :
mem - > duplexOffset . Hz = parseFreqDataToInt ( data ) ;
break ;
case ' S ' :
mem - > duplexOffsetB . Hz = parseFreqDataToInt ( data ) ;
break ;
case ' t ' :
memcpy ( mem - > UR , data , sizeof ( mem - > UR ) ) ;
break ;
case ' T ' :
memcpy ( mem - > URB , data , sizeof ( mem - > UR ) ) ;
break ;
case ' u ' :
memcpy ( mem - > R1 , data , sizeof ( mem - > R1 ) ) ;
break ;
case ' U ' :
memcpy ( mem - > R1B , data , sizeof ( mem - > R1 ) ) ;
break ;
case ' v ' :
memcpy ( mem - > R2 , data , sizeof ( mem - > R2 ) ) ;
break ;
case ' V ' :
memcpy ( mem - > R2B , data , sizeof ( mem - > R2 ) ) ;
break ;
case ' z ' :
if ( mem - > scan = = 0xfe )
mem - > scan = 0 ;
memcpy ( mem - > name , data , sizeof ( mem - > name ) ) ;
break ;
default :
qInfo ( ) < < " Parser didn't match! " < < " spec: " < < parse . spec < < " pos: " < < parse . pos < < " len " < < parse . len ;
break ;
}
}
return true ;
2018-06-19 12:58:52 -07:00
}
2018-11-16 14:08:21 -08:00
void rigCommander : : parseLevels ( )
{
2021-02-15 15:17:48 -08:00
2018-11-16 14:08:21 -08:00
}
2021-11-05 10:09:31 -07:00
void rigCommander : : setIFShift ( unsigned char level )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcIFShift , payload , level ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( level ) ) ;
prepDataAndSend ( payload ) ;
}
2021-11-05 10:09:31 -07:00
}
2023-05-15 10:53:52 +01:00
void rigCommander : : setPBTInner ( unsigned char level )
2021-11-05 10:09:31 -07:00
{
2023-05-27 20:26:53 +01:00
Q_UNUSED ( level )
2021-11-05 10:09:31 -07:00
}
2023-05-15 10:53:52 +01:00
void rigCommander : : setPBTOuter ( unsigned char level )
2021-11-05 10:09:31 -07:00
{
2023-05-27 20:26:53 +01:00
Q_UNUSED ( level )
2021-11-05 10:09:31 -07:00
}
2021-02-15 20:32:14 -08:00
void rigCommander : : setTxPower ( unsigned char power )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcRFPower , payload , power ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( power ) ) ;
prepDataAndSend ( payload ) ;
}
2021-02-15 20:32:14 -08:00
}
void rigCommander : : setMicGain ( unsigned char gain )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcMicGain , payload , gain ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( gain ) ) ;
prepDataAndSend ( payload ) ;
}
2021-02-15 20:32:14 -08:00
}
2021-02-17 23:26:10 -08:00
void rigCommander : : getModInput ( bool dataOn )
2021-02-17 00:00:28 -08:00
{
2023-04-23 21:29:44 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
funcs f = ( dataOn ) ? funcDATA1Mod : funcDATAOffMod ;
2021-02-17 23:26:10 -08:00
2023-04-25 08:56:06 +01:00
if ( getCommand ( f , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2021-02-17 23:26:10 -08:00
}
2023-04-28 00:31:41 +01:00
void rigCommander : : setModInput ( inputTypes input , bool dataOn )
2021-02-17 23:26:10 -08:00
{
// The input enum is as follows:
// inputMic=0,
// inputACC=1,
// inputUSB=3,
// inputLAN=5,
// inputACCA,
// inputACCB};
2021-02-17 00:00:28 -08:00
2023-05-15 10:53:52 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
funcs f = ( dataOn ) ? funcDATA1Mod : funcDATAOffMod ;
2021-02-17 00:00:28 -08:00
2023-04-28 00:31:41 +01:00
if ( getCommand ( f , payload , input ) )
2023-04-23 21:29:44 +01:00
{
2023-04-28 00:31:41 +01:00
payload . append ( input ) ;
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-17 00:00:28 -08:00
2023-04-25 08:56:06 +01:00
/*
2021-02-17 00:00:28 -08:00
switch ( rigCaps . model )
{
case model9700 :
payload . setRawData ( " \x1A \x05 \x01 \x15 " , 4 ) ;
payload . append ( ( unsigned char ) input ) ;
break ;
case model7610 :
payload . setRawData ( " \x1A \x05 \x00 \x91 " , 4 ) ;
payload . append ( ( unsigned char ) input ) ;
break ;
case model7300 :
2021-02-17 23:26:10 -08:00
payload . setRawData ( " \x1A \x05 \x00 \x66 " , 4 ) ;
2021-02-17 00:00:28 -08:00
payload . append ( ( unsigned char ) input ) ;
break ;
case model7850 :
payload . setRawData ( " \x1A \x05 \x00 \x63 " , 4 ) ;
switch ( input )
{
case inputMic :
inAsByte . setRawData ( " \x00 " , 1 ) ;
break ;
case inputACCA :
inAsByte . setRawData ( " \x01 " , 1 ) ;
break ;
case inputACCB :
inAsByte . setRawData ( " \x02 " , 1 ) ;
break ;
case inputUSB :
inAsByte . setRawData ( " \x08 " , 1 ) ;
break ;
case inputLAN :
inAsByte . setRawData ( " \x09 " , 1 ) ;
break ;
default :
return ;
}
payload . append ( inAsByte ) ;
break ;
case model705 :
payload . setRawData ( " \x1A \x05 \x01 \x18 " , 4 ) ;
switch ( input )
{
case inputMic :
inAsByte . setRawData ( " \x00 " , 1 ) ;
break ;
case inputUSB :
inAsByte . setRawData ( " \x01 " , 1 ) ;
break ;
case inputLAN : // WLAN
inAsByte . setRawData ( " \x03 " , 1 ) ;
break ;
default :
return ;
}
payload . append ( inAsByte ) ;
break ;
2021-02-17 23:26:10 -08:00
case model7700 :
payload . setRawData ( " \x1A \x05 \x00 \x32 " , 4 ) ;
if ( input = = inputLAN )
{
// NOTE: CIV manual says data may range from 0 to 3
// But data 0x04 does correspond to LAN.
payload . append ( " \x04 " ) ;
} else {
payload . append ( ( unsigned char ) input ) ;
}
break ;
case model7600 :
payload . setRawData ( " \x1A \x05 \x00 \x30 " , 4 ) ;
payload . append ( ( unsigned char ) input ) ;
break ;
case model7100 :
payload . setRawData ( " \x1A \x05 \x00 \x90 " , 4 ) ;
payload . append ( ( unsigned char ) input ) ;
break ;
2021-05-16 00:07:24 -07:00
case model7200 :
payload . setRawData ( " \x1A \x03 \x23 " , 3 ) ;
switch ( input )
{
case inputMic :
payload . setRawData ( " \x00 " , 1 ) ;
break ;
case inputUSB :
payload . setRawData ( " \x03 " , 1 ) ;
break ;
case inputACC :
payload . setRawData ( " \x01 " , 1 ) ;
break ;
default :
return ;
}
2021-02-17 00:00:28 -08:00
default :
break ;
}
2021-02-17 23:26:10 -08:00
if ( dataOn )
{
2021-05-16 00:07:24 -07:00
if ( rigCaps . model = = model7200 )
{
payload [ 2 ] = payload [ 2 ] + 1 ;
} else {
payload [ 3 ] = payload [ 3 ] + 1 ;
}
2021-02-17 23:26:10 -08:00
}
2021-02-17 00:00:28 -08:00
2021-02-17 23:26:10 -08:00
if ( isQuery )
{
payload . truncate ( 4 ) ;
}
2021-02-17 00:00:28 -08:00
2021-02-17 23:26:10 -08:00
prepDataAndSend ( payload ) ;
2023-04-23 21:29:44 +01:00
*/
2021-02-17 00:00:28 -08:00
}
2023-04-28 00:31:41 +01:00
void rigCommander : : setModInputLevel ( inputTypes input , unsigned char level )
2021-02-20 00:05:23 -08:00
{
2023-04-28 00:31:41 +01:00
switch ( input )
2021-02-20 00:05:23 -08:00
{
case inputMic :
setMicGain ( level ) ;
break ;
case inputACCA :
setACCGain ( level , 0 ) ;
break ;
case inputACCB :
setACCGain ( level , 1 ) ;
break ;
case inputUSB :
setUSBGain ( level ) ;
break ;
case inputLAN :
setLANGain ( level ) ;
break ;
default :
break ;
}
}
2022-01-04 18:34:34 +00:00
void rigCommander : : setAfMute ( bool gainOn )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcAFMute , payload , gainOn ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( static_cast < unsigned char > ( gainOn ) ) ;
prepDataAndSend ( payload ) ;
2023-04-23 21:29:44 +01:00
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : setDialLock ( bool lockOn )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcDialLock , payload , lockOn ) )
{
payload . append ( static_cast < unsigned char > ( lockOn ) ) ;
prepDataAndSend ( payload ) ;
2023-04-23 21:29:44 +01:00
}
2022-01-04 18:34:34 +00:00
}
2023-04-28 00:31:41 +01:00
void rigCommander : : getModInputLevel ( inputTypes input )
2021-02-20 00:05:23 -08:00
{
2023-04-28 00:31:41 +01:00
switch ( input )
2021-02-20 00:05:23 -08:00
{
case inputMic :
getMicGain ( ) ;
break ;
case inputACCA :
getACCGain ( 0 ) ;
break ;
case inputACCB :
getACCGain ( 1 ) ;
break ;
case inputUSB :
getUSBGain ( ) ;
break ;
case inputLAN :
getLANGain ( ) ;
break ;
default :
break ;
}
}
2022-01-04 18:34:34 +00:00
void rigCommander : : getAfMute ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcAFMute , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : getDialLock ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcDialLock , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
2023-04-23 21:29:44 +01:00
QByteArray rigCommander : : getUSBAddr ( ) // Not Used
2021-02-15 23:52:14 -08:00
{
QByteArray payload ;
switch ( rigCaps . model )
{
2021-02-17 00:00:28 -08:00
case model705 :
payload . setRawData ( " \x1A \x05 \x01 \x16 " , 4 ) ;
break ;
2021-02-15 23:52:14 -08:00
case model9700 :
payload . setRawData ( " \x1A \x05 \x01 \x13 " , 4 ) ;
break ;
2021-05-16 00:07:24 -07:00
case model7200 :
payload . setRawData ( " \x1A \x03 \x25 " , 3 ) ;
break ;
2021-02-15 23:52:14 -08:00
case model7100 :
case model7610 :
payload . setRawData ( " \x1A \x05 \x00 \x89 " , 4 ) ;
break ;
case model7300 :
payload . setRawData ( " \x1A \x05 \x00 \x65 " , 4 ) ;
break ;
case model7850 :
payload . setRawData ( " \x1A \x05 \x00 \x61 " , 4 ) ;
break ;
case model7600 :
payload . setRawData ( " \x1A \x05 \x00 \x29 " , 4 ) ;
break ;
default :
2021-02-17 00:00:28 -08:00
break ;
2021-02-15 23:52:14 -08:00
}
2021-02-17 00:00:28 -08:00
return payload ;
}
2021-02-17 23:26:10 -08:00
void rigCommander : : getUSBGain ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcUSBModLevel , payload ) )
2023-04-25 08:56:06 +01:00
{
prepDataAndSend ( payload ) ;
2023-04-23 21:29:44 +01:00
}
2021-02-17 23:26:10 -08:00
}
2021-02-17 00:00:28 -08:00
void rigCommander : : setUSBGain ( unsigned char gain )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcUSBModLevel , payload , gain ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( bcdEncodeInt ( gain ) ) ;
prepDataAndSend ( payload ) ;
2023-04-23 21:29:44 +01:00
}
2021-02-15 23:52:14 -08:00
}
2023-04-23 21:29:44 +01:00
QByteArray rigCommander : : getLANAddr ( ) // Not Used
2021-02-15 23:52:14 -08:00
{
2021-02-17 00:00:28 -08:00
QByteArray payload ;
switch ( rigCaps . model )
{
case model705 :
payload . setRawData ( " \x1A \x05 \x01 \x17 " , 4 ) ;
break ;
case model9700 :
payload . setRawData ( " \x1A \x05 \x01 \x14 " , 4 ) ;
break ;
case model7610 :
payload . setRawData ( " \x1A \x05 \x00 \x90 " , 4 ) ;
break ;
case model7850 :
payload . setRawData ( " \x1A \x05 \x00 \x62 " , 4 ) ;
break ;
2021-05-31 14:01:13 -07:00
case model7700 :
payload . setRawData ( " \x1A \x05 \x01 \x92 " , 4 ) ;
break ;
2021-02-17 00:00:28 -08:00
default :
break ;
}
return payload ;
}
2021-02-15 23:52:14 -08:00
2021-02-17 23:26:10 -08:00
void rigCommander : : getLANGain ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcLANModLevel , payload ) )
2023-04-25 08:56:06 +01:00
{
prepDataAndSend ( payload ) ;
2023-04-23 21:29:44 +01:00
}
2021-02-17 23:26:10 -08:00
}
2021-02-15 23:52:14 -08:00
2021-02-17 00:00:28 -08:00
void rigCommander : : setLANGain ( unsigned char gain )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcLANModLevel , payload , gain ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( bcdEncodeInt ( gain ) ) ;
prepDataAndSend ( payload ) ;
2023-04-23 21:29:44 +01:00
}
2021-02-15 23:52:14 -08:00
}
2023-04-23 21:29:44 +01:00
QByteArray rigCommander : : getACCAddr ( unsigned char ab ) // Not Used
2021-02-17 00:00:28 -08:00
{
QByteArray payload ;
// Note: the manual for the IC-7600 does not call out a
// register to adjust the ACC gain.
2021-02-20 00:05:23 -08:00
// 7850: ACC-A = 0, ACC-B = 1
2021-02-17 00:00:28 -08:00
switch ( rigCaps . model )
{
case model9700 :
payload . setRawData ( " \x1A \x05 \x01 \x12 " , 4 ) ;
break ;
case model7100 :
payload . setRawData ( " \x1A \x05 \x00 \x87 " , 4 ) ;
break ;
case model7610 :
payload . setRawData ( " \x1A \x05 \x00 \x88 " , 4 ) ;
break ;
case model7300 :
payload . setRawData ( " \x1A \x05 \x00 \x64 " , 4 ) ;
break ;
case model7850 :
// Note: 0x58 = ACC-A, 0x59 = ACC-B
2021-02-20 00:05:23 -08:00
if ( ab = = 0 )
{
// A
payload . setRawData ( " \x1A \x05 \x00 \x58 " , 4 ) ;
} else {
// B
payload . setRawData ( " \x1A \x05 \x00 \x59 " , 4 ) ;
}
2021-02-17 00:00:28 -08:00
break ;
2021-05-31 14:01:13 -07:00
case model7700 :
payload . setRawData ( " \x1A \x05 \x00 \x30 " , 4 ) ;
break ;
2021-02-17 00:00:28 -08:00
default :
break ;
}
return payload ;
}
2021-02-17 23:26:10 -08:00
void rigCommander : : getACCGain ( )
{
2023-04-23 21:29:44 +01:00
getACCGain ( ( unsigned char ) 0x0 ) ;
2021-02-17 23:26:10 -08:00
}
2021-02-20 00:05:23 -08:00
void rigCommander : : getACCGain ( unsigned char ab )
{
2023-05-15 10:53:52 +01:00
funcs f = ( ab = = 0 ) ? funcACCAModLevel : funcACCBModLevel ;
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( f , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-20 00:05:23 -08:00
}
2021-02-15 23:52:14 -08:00
void rigCommander : : setACCGain ( unsigned char gain )
{
2023-04-23 21:29:44 +01:00
setACCGain ( gain , ( unsigned char ) 0x0 ) ;
2021-02-20 00:05:23 -08:00
}
void rigCommander : : setACCGain ( unsigned char gain , unsigned char ab )
{
2023-05-15 10:53:52 +01:00
funcs f = ( ab = = 0 ) ? funcACCAModLevel : funcACCBModLevel ;
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( f , payload , gain ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( gain ) ) ;
prepDataAndSend ( payload ) ;
}
2021-02-15 23:52:14 -08:00
}
2021-02-15 20:32:14 -08:00
void rigCommander : : setCompLevel ( unsigned char compLevel )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcCompressorLevel , payload , compLevel ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( compLevel ) ) ;
prepDataAndSend ( payload ) ;
}
2021-02-15 20:32:14 -08:00
}
2023-03-28 21:58:46 +01:00
void rigCommander : : setMonitorGain ( unsigned char monitorLevel )
2021-02-15 20:32:14 -08:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcMonitorGain , payload , monitorLevel ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( monitorLevel ) ) ;
prepDataAndSend ( payload ) ;
}
2021-02-15 20:32:14 -08:00
}
void rigCommander : : setVoxGain ( unsigned char gain )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcVoxGain , payload , gain ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( gain ) ) ;
prepDataAndSend ( payload ) ;
}
2021-02-15 20:32:14 -08:00
}
void rigCommander : : setAntiVoxGain ( unsigned char gain )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcAntiVoxGain , payload , gain ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( gain ) ) ;
prepDataAndSend ( payload ) ;
}
2021-02-15 20:32:14 -08:00
}
2023-03-28 21:58:46 +01:00
void rigCommander : : setNBLevel ( unsigned char level )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcNBLevel , payload , level ) )
{
2023-03-28 21:58:46 +01:00
payload . append ( bcdEncodeInt ( level ) ) ;
prepDataAndSend ( payload ) ;
}
}
void rigCommander : : setNRLevel ( unsigned char level )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcNRLevel , payload , level ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( level ) ) ;
prepDataAndSend ( payload ) ;
}
2023-03-28 21:58:46 +01:00
}
2021-02-15 20:32:14 -08:00
2018-11-16 14:08:21 -08:00
void rigCommander : : getRfGain ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcRfGain , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2018-11-16 14:08:21 -08:00
}
2018-11-16 22:19:44 -08:00
void rigCommander : : getAfGain ( )
{
2023-04-25 08:56:06 +01:00
if ( udp = = Q_NULLPTR )
{
QByteArray payload ;
if ( getCommand ( funcAfGain , payload ) )
{
prepDataAndSend ( payload ) ;
}
2023-04-09 23:53:51 +01:00
}
else {
emit haveAfGain ( localVolume ) ;
}
2018-11-16 22:19:44 -08:00
}
2021-11-05 10:09:31 -07:00
void rigCommander : : getIFShift ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcIFShift , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-11-05 10:09:31 -07:00
}
2023-05-15 10:53:52 +01:00
void rigCommander : : getPBTInner ( )
2021-11-05 10:09:31 -07:00
{
2023-05-27 20:26:53 +01:00
2021-11-05 10:09:31 -07:00
}
2023-05-15 10:53:52 +01:00
void rigCommander : : getPBTOuter ( )
2021-11-05 10:09:31 -07:00
{
}
2018-11-18 00:01:20 -08:00
void rigCommander : : getSql ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcSquelch , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2018-11-18 00:01:20 -08:00
}
2021-02-15 15:17:48 -08:00
void rigCommander : : getTxLevel ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcRFPower , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
void rigCommander : : getMicGain ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcMicGain , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
void rigCommander : : getCompLevel ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcCompressorLevel , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
2023-03-28 21:58:46 +01:00
void rigCommander : : getMonitorGain ( )
2021-02-15 15:17:48 -08:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcMonitorGain , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
void rigCommander : : getVoxGain ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcVoxGain , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
void rigCommander : : getAntiVoxGain ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcAntiVoxGain , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
2023-03-28 21:58:46 +01:00
void rigCommander : : getNBLevel ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcNBLevel , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
2023-03-28 21:58:46 +01:00
}
}
void rigCommander : : getNRLevel ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcNRLevel , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2023-03-28 21:58:46 +01:00
}
2021-02-15 15:17:48 -08:00
void rigCommander : : getLevels ( )
{
// Function to grab all levels
2021-02-15 17:15:28 -08:00
getRfGain ( ) ; //0x02
getAfGain ( ) ; // 0x01
getSql ( ) ; // 0x03
getTxLevel ( ) ; // 0x0A
getMicGain ( ) ; // 0x0B
getCompLevel ( ) ; // 0x0E
2023-03-28 21:58:46 +01:00
// getMonitorGain(); // 0x15
2021-02-15 17:15:28 -08:00
// getVoxGain(); // 0x16
// getAntiVoxGain(); // 0x17
2021-02-15 15:17:48 -08:00
}
2023-05-15 13:47:45 +01:00
void rigCommander : : getMeters ( meter_t meter )
2021-02-15 15:17:48 -08:00
{
2021-02-25 23:57:37 -08:00
switch ( meter )
2021-02-15 15:17:48 -08:00
{
2021-02-25 23:57:37 -08:00
case meterS :
getSMeter ( ) ;
break ;
2021-07-18 14:27:21 -07:00
case meterCenter :
getCenterMeter ( ) ;
break ;
2021-02-25 23:57:37 -08:00
case meterSWR :
getSWRMeter ( ) ;
break ;
case meterPower :
getRFPowerMeter ( ) ;
break ;
case meterALC :
getALCMeter ( ) ;
break ;
case meterComp :
getCompReductionMeter ( ) ;
break ;
case meterVoltage :
getVdMeter ( ) ;
break ;
case meterCurrent :
getIDMeter ( ) ;
break ;
default :
break ;
2021-02-15 15:17:48 -08:00
}
}
void rigCommander : : getSMeter ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcSMeter , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
2021-07-18 14:27:21 -07:00
void rigCommander : : getCenterMeter ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcCenterMeter , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-07-18 14:27:21 -07:00
}
2021-02-15 15:17:48 -08:00
void rigCommander : : getRFPowerMeter ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcCenterMeter , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
void rigCommander : : getSWRMeter ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcSWRMeter , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
void rigCommander : : getALCMeter ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcALCMeter , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
void rigCommander : : getCompReductionMeter ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcCompMeter , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
void rigCommander : : getVdMeter ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcVdMeter , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
void rigCommander : : getIDMeter ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcIdMeter , payload ) )
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-15 15:17:48 -08:00
}
2021-02-10 21:22:38 -08:00
void rigCommander : : setSquelch ( unsigned char level )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcSquelch , payload , level ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( level ) ) ;
prepDataAndSend ( payload ) ;
}
2021-02-10 21:22:38 -08:00
}
2018-11-16 22:19:44 -08:00
void rigCommander : : setRfGain ( unsigned char level )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcRfGain , payload , level ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( level ) ) ;
prepDataAndSend ( payload ) ;
}
2018-11-16 22:19:44 -08:00
}
void rigCommander : : setAfGain ( unsigned char level )
{
2023-04-23 21:29:44 +01:00
if ( udp = = Q_NULLPTR )
2023-04-25 08:56:06 +01:00
{
QByteArray payload ;
if ( getCommand ( funcAfGain , payload , level ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( bcdEncodeInt ( level ) ) ;
prepDataAndSend ( payload ) ;
}
2021-03-22 18:53:34 +00:00
}
else {
emit haveSetVolume ( level ) ;
2022-01-04 18:34:34 +00:00
localVolume = level ;
2021-03-22 18:53:34 +00:00
}
2018-11-16 22:19:44 -08:00
}
2021-02-11 00:33:25 -08:00
void rigCommander : : setRefAdjustCourse ( unsigned char level )
{
// 1A 05 00 72 0000-0255
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcREFAdjust , payload , level ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( bcdEncodeInt ( level ) ) ;
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-11 00:33:25 -08:00
}
void rigCommander : : setRefAdjustFine ( unsigned char level )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcREFAdjustFine , payload , level ) )
2023-04-25 08:56:06 +01:00
{
payload . append ( bcdEncodeInt ( level ) ) ;
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-11 00:33:25 -08:00
}
2021-07-09 12:02:50 -07:00
void rigCommander : : setTime ( timekind t )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcTime , payload ) )
{
2023-04-23 21:29:44 +01:00
payload . append ( convertNumberToHex ( t . hours ) ) ;
payload . append ( convertNumberToHex ( t . minutes ) ) ;
prepDataAndSend ( payload ) ;
2023-04-27 19:56:25 +01:00
qInfo ( logRig ( ) ) < < QString ( " Setting Time: %0:%1 " ) . arg ( t . hours ) . arg ( t . minutes ) ;
2023-04-23 21:29:44 +01:00
}
/*
2021-07-09 12:02:50 -07:00
QByteArray payload ;
switch ( rigCaps . model )
{
case model705 :
payload . setRawData ( " \x1A \x05 \x01 \x66 " , 4 ) ;
break ;
case model7300 :
payload . setRawData ( " \x1A \x05 \x00 \x95 " , 4 ) ;
break ;
case model7610 :
payload . setRawData ( " \x1A \x05 \x01 \x59 " , 4 ) ;
break ;
case model7700 :
payload . setRawData ( " \x1A \x05 \x00 \x59 " , 4 ) ;
break ;
case model7850 :
payload . setRawData ( " \x1A \x05 \x00 \x96 " , 4 ) ;
break ;
case model9700 :
payload . setRawData ( " \x1A \x05 \x01 \x80 " , 4 ) ;
break ;
case modelR8600 :
payload . setRawData ( " \x1A \x05 \x01 \x32 " , 4 ) ;
break ;
default :
return ;
break ;
}
2023-04-23 21:29:44 +01:00
*/
2021-07-09 12:02:50 -07:00
}
void rigCommander : : setDate ( datekind d )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcDate , payload ) )
{
2023-04-23 21:29:44 +01:00
// YYYYMMDD
payload . append ( convertNumberToHex ( d . year / 100 ) ) ; // 20
payload . append ( convertNumberToHex ( d . year - 100 * ( d . year / 100 ) ) ) ; // 21
payload . append ( convertNumberToHex ( d . month ) ) ;
payload . append ( convertNumberToHex ( d . day ) ) ;
prepDataAndSend ( payload ) ;
2023-04-27 19:56:25 +01:00
qInfo ( logRig ( ) ) < < QString ( " Setting Date: %0-%1-%2 " ) . arg ( d . year ) . arg ( d . month ) . arg ( d . day ) ;
2023-04-23 21:29:44 +01:00
}
/*
2021-07-09 12:02:50 -07:00
switch ( rigCaps . model )
{
case model705 :
payload . setRawData ( " \x1A \x05 \x01 \x65 " , 4 ) ;
break ;
case model7300 :
payload . setRawData ( " \x1A \x05 \x00 \x94 " , 4 ) ;
break ;
case model7610 :
payload . setRawData ( " \x1A \x05 \x01 \x58 " , 4 ) ;
break ;
case model7700 :
payload . setRawData ( " \x1A \x05 \x00 \x58 " , 4 ) ;
break ;
case model7850 :
payload . setRawData ( " \x1A \x05 \x00 \x95 " , 4 ) ;
break ;
case model9700 :
payload . setRawData ( " \x1A \x05 \x01 \x79 " , 4 ) ;
break ;
case modelR8600 :
payload . setRawData ( " \x1A \x05 \x01 \x31 " , 4 ) ;
break ;
default :
return ;
break ;
}
2023-04-23 21:29:44 +01:00
*/
2021-07-09 12:02:50 -07:00
}
void rigCommander : : setUTCOffset ( timekind t )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcUTCOffset , payload ) )
{
// YYYYMMDD
2023-04-23 21:29:44 +01:00
payload . append ( convertNumberToHex ( t . minutes ) ) ;
2023-04-24 08:37:10 +01:00
payload . append ( static_cast < unsigned char > ( t . isMinus ) ) ;
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
2023-04-27 19:56:25 +01:00
qInfo ( logRig ( ) ) < < QString ( " Setting UTC Offset: %0%1:%2 " ) . arg ( ( t . isMinus ) ? " - " : " + " ) . arg ( t . hours ) . arg ( t . minutes ) ;
2023-04-23 21:29:44 +01:00
}
2021-07-09 12:02:50 -07:00
2023-04-23 21:29:44 +01:00
/*
2021-07-09 12:02:50 -07:00
switch ( rigCaps . model )
{
case model705 :
payload . setRawData ( " \x1A \x05 \x01 \x70 " , 4 ) ;
break ;
case model7300 :
payload . setRawData ( " \x1A \x05 \x00 \x96 " , 4 ) ;
break ;
case model7610 :
payload . setRawData ( " \x1A \x05 \x01 \x62 " , 4 ) ;
break ;
case model7700 :
payload . setRawData ( " \x1A \x05 \x00 \x61 " , 4 ) ;
break ;
case model7850 :
// Clock 1:
payload . setRawData ( " \x1A \x05 \x00 \x99 " , 4 ) ;
break ;
case model9700 :
payload . setRawData ( " \x1A \x05 \x01 \x84 " , 4 ) ;
break ;
case modelR8600 :
payload . setRawData ( " \x1A \x05 \x01 \x35 " , 4 ) ;
break ;
default :
return ;
break ;
}
2023-04-23 21:29:44 +01:00
*/
2021-07-09 12:02:50 -07:00
}
unsigned char rigCommander : : convertNumberToHex ( unsigned char num )
{
// Two digit only
if ( num > 99 )
{
qInfo ( logRig ( ) ) < < " Invalid numeric conversion from num " < < num < < " to hex. " ;
return 0xFA ;
}
unsigned char result = 0 ;
result = ( num / 10 ) < < 4 ;
result | = ( num - 10 * ( num / 10 ) ) ;
2023-04-27 19:56:25 +01:00
//qDebug(logRig()) << "Converting number: " << num << " to hex: " + QString("0x%1").arg(result, 2, 16, QChar('0');
2021-07-09 12:02:50 -07:00
return result ;
}
2021-02-11 00:33:25 -08:00
void rigCommander : : getRefAdjustCourse ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcREFAdjust , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-11 00:33:25 -08:00
}
void rigCommander : : getRefAdjustFine ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcREFAdjustFine , payload ) )
2023-04-25 08:56:06 +01:00
{
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2021-02-11 00:33:25 -08:00
}
2018-11-07 15:54:03 -08:00
void rigCommander : : parseRegisters1C ( )
{
// PTT lives here
2018-11-16 23:13:59 -08:00
// Not sure if 02 is the right place to switch.
// TODO: test this function
2018-12-20 10:56:54 -08:00
switch ( payloadIn [ 01 ] )
2018-11-07 15:54:03 -08:00
{
case ' \x00 ' :
parsePTT ( ) ;
break ;
2018-11-16 23:13:59 -08:00
case ' \x01 ' :
2018-12-20 11:22:52 -08:00
// ATU status (on/off/tuning)
2018-11-16 23:13:59 -08:00
parseATU ( ) ;
break ;
2018-11-07 15:54:03 -08:00
default :
break ;
}
}
2021-04-25 00:23:52 -07:00
void rigCommander : : parseRegister21 ( )
{
}
2018-11-16 23:13:59 -08:00
void rigCommander : : parseATU ( )
{
2023-05-27 20:26:53 +01:00
2018-11-16 23:13:59 -08:00
}
2018-11-07 15:54:03 -08:00
void rigCommander : : parsePTT ( )
{
}
2018-06-25 00:34:33 -07:00
void rigCommander : : parseRegisters1A ( )
{
}
2021-04-04 23:33:56 -07:00
void rigCommander : : parseRegister1B ( )
{
}
2021-04-10 22:48:32 -07:00
void rigCommander : : parseRegister16 ( )
2021-04-04 23:46:44 -07:00
{
}
2018-11-16 14:08:21 -08:00
void rigCommander : : parseBandStackReg ( )
{
2021-05-15 18:53:16 +01:00
//qInfo(logRig()) << "Band stacking register response received: ";
2021-05-07 15:46:47 -07:00
//printHex(payloadIn, false, true);
2021-05-07 14:52:19 -07:00
2018-11-16 14:08:21 -08:00
// Reference output, 20 meters, regCode 01 (latest):
// "INDEX: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 "
// "DATA: 1a 01 05 01 60 03 23 14 00 00 03 10 00 08 85 00 08 85 fd "
2021-05-07 14:52:19 -07:00
2021-05-15 10:10:08 -07:00
char band = payloadIn [ 2 ] ;
char regCode = payloadIn [ 3 ] ;
2021-03-22 00:11:43 -07:00
freqt freqs = parseFrequency ( payloadIn , 7 ) ;
2021-05-07 14:52:19 -07:00
//float freq = (float)freqs.MHzDouble;
2021-03-22 00:11:43 -07:00
2023-03-21 15:37:57 +00:00
// The Band Stacking command returns the regCode in the position that VFO is expected.
// As BSR is always on the active VFO, just set that.
freqs . VFO = selVFO_t : : activeVFO ;
2018-11-16 14:08:21 -08:00
bool dataOn = ( payloadIn [ 11 ] & 0x10 ) > > 4 ; // not sure...
char mode = payloadIn [ 9 ] ;
2021-05-07 14:52:19 -07:00
char filter = payloadIn [ 10 ] ;
2018-11-16 14:08:21 -08:00
// 09, 10 mode
// 11 digit RH: data mode on (1) or off (0)
// 11 digit LH: CTCSS 0 = off, 1 = TONE, 2 = TSQL
// 12, 13 : tone freq setting
// 14, 15 tone squelch freq setting
// if more, memory name (label) ascii
2021-05-15 18:53:16 +01:00
qInfo ( logRig ( ) ) < < " BSR in rigCommander: band: " < < QString ( " %1 " ) . arg ( band ) < < " regCode: " < < ( QString ) regCode < < " freq Hz: " < < freqs . Hz < < " , mode: " < < ( unsigned int ) mode < < " , filter: " < < ( unsigned int ) filter < < " data: " < < dataOn ;
//qInfo(logRig()) << "mode: " << (QString)mode << " dataOn: " << dataOn;
//qInfo(logRig()) << "Freq Hz: " << freqs.Hz;
2021-05-07 14:52:19 -07:00
emit haveBandStackReg ( freqs , mode , filter , dataOn ) ;
2018-11-16 14:08:21 -08:00
}
2018-06-25 00:34:33 -07:00
void rigCommander : : parseDetailedRegisters1A05 ( )
{
// It seems a lot of misc stuff is under this command and subcommand.
2021-02-11 00:33:25 -08:00
// 1A 05 ...
// 00 01 02 03 04 ...
// 02 and 03 make up a BCD'd number:
// 0001, 0002, 0003, ... 0101, 0102, 0103...
2021-02-17 23:26:10 -08:00
// 04 is a typical single byte response
// 04 05 is a typical 0-255 response
// This file processes the registers which are radically different in each model.
// It is a work in progress.
// TODO: inputMod source and gain for models: 7700, and 7600
2021-02-20 00:05:23 -08:00
int level = ( 100 * bcdHexToUChar ( payloadIn [ 4 ] ) ) + bcdHexToUChar ( payloadIn [ 5 ] ) ;
2021-02-17 23:26:10 -08:00
2021-02-19 00:14:40 -08:00
int subcmd = bcdHexToUChar ( payloadIn [ 3 ] ) + ( 100 * bcdHexToUChar ( payloadIn [ 2 ] ) ) ;
2021-02-11 00:33:25 -08:00
2023-04-28 00:31:41 +01:00
inputTypes input = ( inputTypes ) bcdHexToUChar ( payloadIn [ 4 ] ) ;
2021-02-17 23:26:10 -08:00
int inputRaw = bcdHexToUChar ( payloadIn [ 4 ] ) ;
switch ( rigCaps . model )
2021-02-11 00:33:25 -08:00
{
2021-02-17 23:26:10 -08:00
case model9700 :
switch ( subcmd )
{
2021-02-19 00:14:40 -08:00
2021-02-17 23:26:10 -08:00
case 72 :
// course reference
emit haveRefAdjustCourse ( bcdHexToUChar ( payloadIn [ 5 ] ) + ( 100 * bcdHexToUChar ( payloadIn [ 4 ] ) ) ) ;
break ;
case 73 :
// fine reference
emit haveRefAdjustFine ( bcdHexToUChar ( payloadIn [ 5 ] ) + ( 100 * bcdHexToUChar ( payloadIn [ 4 ] ) ) ) ;
break ;
case 112 :
2021-02-20 00:05:23 -08:00
emit haveACCGain ( level , 5 ) ;
2021-02-17 23:26:10 -08:00
break ;
case 113 :
emit haveUSBGain ( level ) ;
break ;
case 114 :
emit haveLANGain ( level ) ;
break ;
case 115 :
emit haveModInput ( input , false ) ;
break ;
case 116 :
emit haveModInput ( input , true ) ;
break ;
default :
break ;
}
2021-05-21 15:26:40 -07:00
break ;
2021-02-17 23:26:10 -08:00
case model7850 :
switch ( subcmd )
{
case 63 :
switch ( inputRaw )
{
case 0 :
input = inputMic ;
break ;
case 1 :
input = inputACCA ;
break ;
case 2 :
input = inputACCB ;
break ;
case 8 :
input = inputUSB ;
break ;
case 9 :
input = inputLAN ;
break ;
default :
input = inputUnknown ;
break ;
}
emit haveModInput ( input , false ) ;
break ;
case 64 :
switch ( inputRaw )
{
case 0 :
input = inputMic ;
break ;
case 1 :
input = inputACCA ;
break ;
case 2 :
input = inputACCB ;
break ;
case 8 :
input = inputUSB ;
break ;
case 9 :
input = inputLAN ;
break ;
default :
input = inputUnknown ;
break ;
}
emit haveModInput ( input , true ) ;
break ;
case 58 :
emit haveACCGain ( level , 0 ) ;
break ;
case 59 :
emit haveACCGain ( level , 1 ) ;
break ;
case 61 :
emit haveUSBGain ( level ) ;
break ;
case 62 :
emit haveLANGain ( level ) ;
break ;
2021-04-23 23:24:34 -07:00
default :
break ;
2021-02-17 23:26:10 -08:00
}
2021-05-21 15:26:40 -07:00
break ;
2021-02-17 23:26:10 -08:00
case model7610 :
switch ( subcmd )
{
case 91 :
emit haveModInput ( input , false ) ;
break ;
case 92 :
emit haveModInput ( input , true ) ;
break ;
case 88 :
2021-02-20 00:05:23 -08:00
emit haveACCGain ( level , 5 ) ;
2021-02-17 23:26:10 -08:00
break ;
case 89 :
emit haveUSBGain ( level ) ;
break ;
case 90 :
emit haveLANGain ( level ) ;
break ;
2023-02-14 18:47:32 +00:00
case 228 :
emit haveDashRatio ( inputRaw ) ;
2021-02-17 23:26:10 -08:00
default :
break ;
}
return ;
case model7600 :
switch ( subcmd )
{
case 30 :
emit haveModInput ( input , false ) ;
break ;
case 31 :
emit haveModInput ( input , true ) ;
break ;
case 29 :
emit haveUSBGain ( level ) ;
break ;
default :
break ;
}
return ;
case model7300 :
switch ( subcmd )
{
case 64 :
2021-02-20 00:05:23 -08:00
emit haveACCGain ( level , 5 ) ;
2021-02-17 23:26:10 -08:00
break ;
case 65 :
emit haveUSBGain ( level ) ;
break ;
case 66 :
emit haveModInput ( input , false ) ;
break ;
case 67 :
emit haveModInput ( input , true ) ;
break ;
default :
break ;
}
return ;
case model7100 :
switch ( subcmd )
{
case 87 :
2021-02-20 00:05:23 -08:00
emit haveACCGain ( level , 5 ) ;
2021-02-17 23:26:10 -08:00
break ;
case 89 :
emit haveUSBGain ( level ) ;
break ;
case 90 :
emit haveModInput ( input , false ) ;
break ;
case 91 :
emit haveModInput ( input , true ) ;
break ;
2021-04-23 23:24:34 -07:00
default :
break ;
2021-02-17 23:26:10 -08:00
}
2021-05-21 15:26:40 -07:00
break ;
2021-02-17 23:26:10 -08:00
case model705 :
switch ( subcmd )
{
case 116 :
emit haveUSBGain ( level ) ;
break ;
case 117 :
emit haveLANGain ( level ) ;
break ;
case 118 :
switch ( inputRaw )
{
case 0 :
input = inputMic ;
break ;
case 1 :
input = inputUSB ;
break ;
case 3 :
input = inputLAN ;
break ;
default :
input = inputUnknown ;
break ;
}
emit haveModInput ( input , false ) ;
break ;
case 119 :
switch ( inputRaw )
{
case 0 :
input = inputMic ;
break ;
case 1 :
input = inputUSB ;
break ;
case 3 :
input = inputLAN ;
break ;
default :
input = inputUnknown ;
break ;
}
emit haveModInput ( input , true ) ;
break ;
2021-05-08 13:33:05 -07:00
default :
break ;
2021-02-17 23:26:10 -08:00
}
2021-02-11 00:33:25 -08:00
break ;
2021-02-17 23:26:10 -08:00
2021-02-11 00:33:25 -08:00
default :
break ;
}
2018-06-25 00:34:33 -07:00
}
2018-12-18 14:34:04 -08:00
void rigCommander : : parseWFData ( )
{
}
2021-05-21 23:46:15 -07:00
2023-05-15 13:51:04 +01:00
modeInfo rigCommander : : createMode ( rigMode_t m , unsigned char reg , QString name , bool bw )
2021-05-21 23:46:15 -07:00
{
2023-05-15 13:47:45 +01:00
modeInfo mode ;
2021-05-21 23:46:15 -07:00
mode . mk = m ;
mode . reg = reg ;
mode . name = name ;
2023-04-24 11:23:51 +01:00
mode . bw = bw ;
2021-05-21 23:46:15 -07:00
return mode ;
}
2021-06-18 22:45:12 -07:00
centerSpanData rigCommander : : createScopeCenter ( centerSpansType s , QString name )
{
centerSpanData csd ;
csd . cstype = s ;
csd . name = name ;
return csd ;
}
2021-02-10 17:32:56 +00:00
void rigCommander : : determineRigCaps ( )
{
2023-04-23 21:29:44 +01:00
// First clear all of the current settings
rigCaps . preamps . clear ( ) ;
rigCaps . attenuators . clear ( ) ;
rigCaps . inputs . clear ( ) ;
rigCaps . scopeCenterSpans . clear ( ) ;
rigCaps . bands . clear ( ) ;
rigCaps . modes . clear ( ) ;
rigCaps . commands . clear ( ) ;
rigCaps . commandsReverse . clear ( ) ;
rigCaps . antennas . clear ( ) ;
rigCaps . filters . clear ( ) ;
2023-04-28 13:44:12 +01:00
rigCaps . steps . clear ( ) ;
2023-05-03 13:38:06 +01:00
rigCaps . memParser . clear ( ) ;
2023-05-04 21:55:40 +01:00
rigCaps . satParser . clear ( ) ;
2023-04-23 21:29:44 +01:00
// modelID should already be set!
while ( ! rigList . contains ( rigCaps . modelID ) )
{
if ( ! rigCaps . modelID ) {
qWarning ( logRig ( ) ) < < " No default rig definition found, cannot continue (sorry!) " ;
return ;
}
// Unknown rig, load default
qInfo ( logRig ( ) ) < < QString ( " No rig definition found for CI-V address: 0x%0, using defaults (some functions may not be available) " ) . arg ( rigCaps . modelID , 2 , 16 ) ;
rigCaps . modelID = 0 ;
}
rigCaps . filename = rigList . find ( rigCaps . modelID ) . value ( ) ;
QSettings * settings = new QSettings ( rigCaps . filename , QSettings : : Format : : IniFormat ) ;
if ( ! settings - > childGroups ( ) . contains ( " Rig " ) )
{
qWarning ( logRig ( ) ) < < rigCaps . filename < < " Cannot be loaded! " ;
return ;
}
settings - > beginGroup ( " Rig " ) ;
// Populate rigcaps
rigCaps . modelName = settings - > value ( " Model " , " " ) . toString ( ) ;
qInfo ( logRig ( ) ) < < QString ( " Loading Rig: %0 from %1 " ) . arg ( rigCaps . modelName , rigCaps . filename ) ;
rigCaps . spectSeqMax = settings - > value ( " SpectrumSeqMax " , 0 ) . toUInt ( ) ;
rigCaps . spectAmpMax = settings - > value ( " SpectrumAmpMax " , 0 ) . toUInt ( ) ;
rigCaps . spectLenMax = settings - > value ( " SpectrumLenMax " , 0 ) . toUInt ( ) ;
rigCaps . hasSpectrum = settings - > value ( " HasSpectrum " , false ) . toBool ( ) ;
rigCaps . hasLan = settings - > value ( " HasLAN " , false ) . toBool ( ) ;
rigCaps . hasEthernet = settings - > value ( " HasEthernet " , false ) . toBool ( ) ;
rigCaps . hasWiFi = settings - > value ( " HasWiFi " , false ) . toBool ( ) ;
rigCaps . hasQuickSplitCommand = settings - > value ( " HasQuickSplit " , false ) . toBool ( ) ;
rigCaps . hasDD = settings - > value ( " HasDD " , false ) . toBool ( ) ;
rigCaps . hasDV = settings - > value ( " HasDV " , false ) . toBool ( ) ;
rigCaps . hasTransmit = settings - > value ( " HasTransmit " , false ) . toBool ( ) ;
rigCaps . hasFDcomms = settings - > value ( " HasFDComms " , false ) . toBool ( ) ;
2023-05-25 23:17:54 +01:00
rigCaps . hasCommand29 = settings - > value ( " HasCommand29 " , false ) . toBool ( ) ;
2023-04-23 21:29:44 +01:00
rigCaps . useRTSforPTT = settings - > value ( " UseRTSforPTT " , false ) . toBool ( ) ;
2023-05-01 21:56:52 +01:00
rigCaps . memGroups = settings - > value ( " MemGroups " , 0 ) . toUInt ( ) ;
rigCaps . memories = settings - > value ( " Memories " , 0 ) . toUInt ( ) ;
2023-05-06 12:36:05 +01:00
rigCaps . memStart = settings - > value ( " MemStart " , 1 ) . toUInt ( ) ;
2023-05-03 13:38:06 +01:00
rigCaps . memFormat = settings - > value ( " MemFormat " , " " ) . toString ( ) ;
2023-05-04 21:55:40 +01:00
rigCaps . satMemories = settings - > value ( " SatMemories " , 0 ) . toUInt ( ) ;
2023-05-03 19:08:20 +01:00
rigCaps . satFormat = settings - > value ( " SatFormat " , " " ) . toString ( ) ;
2023-04-23 21:29:44 +01:00
2023-05-08 13:26:45 +01:00
// If rig doesn't have FD comms, tell the commhandler early.
emit setHalfDuplex ( ! rigCaps . hasFDcomms ) ;
2023-04-23 21:29:44 +01:00
// Temporary QList to hold the function string lookup // I would still like to find a better way of doing this!
QHash < QString , funcs > funcsLookup ;
for ( int i = 0 ; i < NUMFUNCS ; i + + )
{
funcsLookup . insert ( funcString [ i ] . toUpper ( ) , funcs ( i ) ) ;
}
2021-04-26 18:24:28 -07:00
2023-04-23 21:29:44 +01:00
int numCommands = settings - > beginReadArray ( " Commands " ) ;
if ( numCommands = = 0 ) {
settings - > endArray ( ) ;
}
else {
for ( int c = 0 ; c < numCommands ; c + + )
{
settings - > setArrayIndex ( c ) ;
if ( funcsLookup . contains ( settings - > value ( " Type " , " **** " ) . toString ( ) . toUpper ( ) ) )
{
funcs func = funcsLookup . find ( settings - > value ( " Type " , " " ) . toString ( ) . toUpper ( ) ) . value ( ) ;
2023-05-12 00:24:01 +01:00
rigCaps . commands . insert ( func , funcType ( func , funcString [ int ( func ) ] ,
2023-05-25 23:17:54 +01:00
QByteArray : : fromHex ( settings - > value ( " String " , " " ) . toString ( ) . toUtf8 ( ) ) ,
settings - > value ( " Min " , 0 ) . toString ( ) . toInt ( ) , settings - > value ( " Max " , 0 ) . toString ( ) . toInt ( ) ,
settings - > value ( " Command29 " , false ) . toBool ( ) ) ) ;
2021-05-21 23:46:15 -07:00
2023-05-12 00:24:01 +01:00
rigCaps . commandsReverse . insert ( QByteArray : : fromHex ( settings - > value ( " String " , " " ) . toString ( ) . toUtf8 ( ) ) , func ) ;
2023-04-23 21:29:44 +01:00
} else {
2023-05-25 23:17:54 +01:00
qWarning ( logRig ( ) ) < < " **** Function " < < settings - > value ( " Type " , " " ) . toString ( ) < < " Not Found, rig file may be out of date? " ;
2023-04-23 21:29:44 +01:00
}
}
settings - > endArray ( ) ;
}
2021-05-21 23:46:15 -07:00
2023-04-23 21:29:44 +01:00
int numModes = settings - > beginReadArray ( " Modes " ) ;
if ( numModes = = 0 ) {
settings - > endArray ( ) ;
}
else {
for ( int c = 0 ; c < numModes ; c + + )
{
settings - > setArrayIndex ( c ) ;
2023-05-15 13:51:04 +01:00
rigCaps . modes . push_back ( modeInfo ( rigMode_t ( settings - > value ( " Num " , 0 ) . toUInt ( ) ) ,
2023-05-15 10:53:52 +01:00
settings - > value ( " Reg " , 0 ) . toString ( ) . toUInt ( nullptr , 16 ) , settings - > value ( " Name " , " " ) . toString ( ) , settings - > value ( " BW " , 0 ) . toBool ( ) ) ) ;
2023-04-23 21:29:44 +01:00
}
settings - > endArray ( ) ;
}
2021-02-10 17:32:56 +00:00
2023-04-23 21:29:44 +01:00
int numSpans = settings - > beginReadArray ( " Spans " ) ;
if ( numSpans = = 0 ) {
settings - > endArray ( ) ;
}
else {
for ( int c = 0 ; c < numSpans ; c + + )
{
settings - > setArrayIndex ( c ) ;
2023-05-15 10:53:52 +01:00
rigCaps . scopeCenterSpans . push_back ( centerSpanData ( centerSpansType ( settings - > value ( " Num " , 0 ) . toUInt ( ) ) ,
settings - > value ( " Name " , " " ) . toString ( ) , settings - > value ( " Freq " , 0 ) . toUInt ( ) ) ) ;
2023-04-23 21:29:44 +01:00
}
settings - > endArray ( ) ;
}
2021-02-10 17:32:56 +00:00
2023-04-23 21:29:44 +01:00
int numInputs = settings - > beginReadArray ( " Inputs " ) ;
if ( numInputs = = 0 ) {
settings - > endArray ( ) ;
}
else {
for ( int c = 0 ; c < numInputs ; c + + )
{
settings - > setArrayIndex ( c ) ;
2023-05-15 10:53:52 +01:00
rigCaps . inputs . append ( rigInput ( inputTypes ( settings - > value ( " Num " , 0 ) . toUInt ( ) ) ,
settings - > value ( " Reg " , 0 ) . toString ( ) . toUInt ( nullptr , 16 ) , settings - > value ( " Name " , " " ) . toString ( ) ) ) ;
2023-04-28 13:44:12 +01:00
}
settings - > endArray ( ) ;
}
int numSteps = settings - > beginReadArray ( " Tuning Steps " ) ;
if ( numSteps = = 0 ) {
settings - > endArray ( ) ;
}
else {
for ( int c = 0 ; c < numSteps ; c + + )
{
settings - > setArrayIndex ( c ) ;
2023-05-15 10:53:52 +01:00
rigCaps . steps . push_back ( stepType ( settings - > value ( " Num " , 0 ) . toString ( ) . toUInt ( ) ,
settings - > value ( " Name " , " " ) . toString ( ) , settings - > value ( " Hz " , 0ULL ) . toULongLong ( ) ) ) ;
2023-04-23 21:29:44 +01:00
}
settings - > endArray ( ) ;
}
2021-02-11 09:09:45 -08:00
2023-04-23 21:29:44 +01:00
int numPreamps = settings - > beginReadArray ( " Preamps " ) ;
if ( numPreamps = = 0 ) {
settings - > endArray ( ) ;
}
else {
for ( int c = 0 ; c < numPreamps ; c + + )
{
settings - > setArrayIndex ( c ) ;
2023-05-09 12:11:38 +01:00
rigCaps . preamps . push_back ( genericType ( settings - > value ( " Num " , 0 ) . toString ( ) . toUInt ( ) , settings - > value ( " Name " , 0 ) . toString ( ) ) ) ;
2023-04-23 21:29:44 +01:00
}
settings - > endArray ( ) ;
}
2021-04-04 23:33:56 -07:00
2023-04-23 21:29:44 +01:00
int numAntennas = settings - > beginReadArray ( " Antennas " ) ;
if ( numAntennas = = 0 ) {
settings - > endArray ( ) ;
}
else {
for ( int c = 0 ; c < numAntennas ; c + + )
{
settings - > setArrayIndex ( c ) ;
2023-05-09 12:11:38 +01:00
rigCaps . antennas . push_back ( genericType ( settings - > value ( " Num " , 0 ) . toString ( ) . toUInt ( ) , settings - > value ( " Name " , 0 ) . toString ( ) ) ) ;
2023-04-23 21:29:44 +01:00
}
settings - > endArray ( ) ;
}
2021-11-05 10:09:31 -07:00
2023-04-23 21:29:44 +01:00
int numAttenuators = settings - > beginReadArray ( " Attenuators " ) ;
if ( numAttenuators = = 0 ) {
settings - > endArray ( ) ;
}
else {
for ( int c = 0 ; c < numAttenuators ; c + + )
{
settings - > setArrayIndex ( c ) ;
2023-05-09 12:11:38 +01:00
rigCaps . attenuators . push_back ( ( unsigned char ) settings - > value ( " dB " , 0 ) . toUInt ( ) ) ;
2023-04-23 21:29:44 +01:00
}
settings - > endArray ( ) ;
}
2021-06-18 22:45:12 -07:00
2023-04-23 21:29:44 +01:00
int numFilters = settings - > beginReadArray ( " Filters " ) ;
if ( numFilters = = 0 ) {
settings - > endArray ( ) ;
}
else {
for ( int c = 0 ; c < numFilters ; c + + )
{
settings - > setArrayIndex ( c ) ;
2023-05-09 12:11:38 +01:00
rigCaps . filters . push_back ( filterType ( settings - > value ( " Num " , 0 ) . toString ( ) . toUInt ( ) , settings - > value ( " Name " , " " ) . toString ( ) , settings - > value ( " Modes " , 0 ) . toUInt ( ) ) ) ;
2023-04-23 21:29:44 +01:00
}
settings - > endArray ( ) ;
}
2021-02-13 10:02:45 -08:00
2023-04-23 21:29:44 +01:00
int numBands = settings - > beginReadArray ( " Bands " ) ;
if ( numBands = = 0 ) {
settings - > endArray ( ) ;
}
else {
for ( int c = 0 ; c < numBands ; c + + )
{
settings - > setArrayIndex ( c ) ;
availableBands band = availableBands ( settings - > value ( " Num " , 0 ) . toInt ( ) ) ;
quint64 start = settings - > value ( " Start " , 0ULL ) . toULongLong ( ) ;
quint64 end = settings - > value ( " End " , 0ULL ) . toULongLong ( ) ;
2023-05-27 20:26:53 +01:00
uchar bsr = static_cast < uchar > ( settings - > value ( " BSR " , 0 ) . toInt ( ) ) ;
2023-04-23 21:29:44 +01:00
double range = settings - > value ( " Range " , 0.0 ) . toDouble ( ) ;
2023-05-06 12:36:05 +01:00
int memGroup = settings - > value ( " MemoryGroup " , - 1 ) . toInt ( ) ;
2023-04-23 21:29:44 +01:00
2023-05-27 20:26:53 +01:00
rigCaps . bands . push_back ( bandType ( band , bsr , start , end , range , memGroup ) ) ;
2023-04-23 21:29:44 +01:00
rigCaps . bsr [ band ] = bsr ;
2023-05-09 12:11:38 +01:00
qInfo ( logRig ( ) ) < < " Adding Band " < < band < < " Start " < < start < < " End " < < end < < " BSR " < < QString : : number ( bsr , 16 ) ;
2023-04-23 21:29:44 +01:00
}
settings - > endArray ( ) ;
}
2023-04-19 14:51:23 +01:00
2023-04-23 21:29:44 +01:00
settings - > endGroup ( ) ;
delete settings ;
2023-04-19 14:51:23 +01:00
2023-05-03 13:38:06 +01:00
2023-05-03 19:08:20 +01:00
// Setup memory formats.
2023-05-04 21:55:40 +01:00
static QRegularExpression memFmtEx ( " %(?<flags>[-+#0]) ? ( ? < pos > \ \ d + | \ \ * ) ? ( ? : \ \ . ( ? < width > \ \ d + | \ \ * ) ) ? ( ? < spec > [ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ] ) " ) ;
2023-05-03 13:38:06 +01:00
QRegularExpressionMatchIterator i = memFmtEx . globalMatch ( rigCaps . memFormat ) ;
while ( i . hasNext ( ) ) {
QRegularExpressionMatch qmatch = i . next ( ) ;
2023-05-03 19:20:32 +01:00
# if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
2023-05-03 13:38:06 +01:00
if ( qmatch . hasCaptured ( " spec " ) & & qmatch . hasCaptured ( " pos " ) & & qmatch . hasCaptured ( " width " ) ) {
2023-05-03 19:20:32 +01:00
# endif
2023-05-03 13:38:06 +01:00
rigCaps . memParser . append ( memParserFormat ( qmatch . captured ( " spec " ) . at ( 0 ) . toLatin1 ( ) , qmatch . captured ( " pos " ) . toInt ( ) , qmatch . captured ( " width " ) . toInt ( ) ) ) ;
2023-05-03 19:08:20 +01:00
}
2023-05-03 19:20:32 +01:00
# if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
2023-05-03 19:08:20 +01:00
}
2023-05-03 19:20:32 +01:00
# endif
2023-05-04 21:55:40 +01:00
2023-05-03 19:08:20 +01:00
QRegularExpressionMatchIterator i2 = memFmtEx . globalMatch ( rigCaps . satFormat ) ;
while ( i2 . hasNext ( ) ) {
QRegularExpressionMatch qmatch = i2 . next ( ) ;
2023-05-04 21:55:40 +01:00
# if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
2023-05-03 19:08:20 +01:00
if ( qmatch . hasCaptured ( " spec " ) & & qmatch . hasCaptured ( " pos " ) & & qmatch . hasCaptured ( " width " ) ) {
2023-05-04 21:55:40 +01:00
# endif
2023-05-03 19:08:20 +01:00
rigCaps . satParser . append ( memParserFormat ( qmatch . captured ( " spec " ) . at ( 0 ) . toLatin1 ( ) , qmatch . captured ( " pos " ) . toInt ( ) , qmatch . captured ( " width " ) . toInt ( ) ) ) ;
2023-05-04 21:55:40 +01:00
# if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
2023-05-03 13:38:06 +01:00
}
2023-05-04 21:55:40 +01:00
# endif
2023-05-03 13:38:06 +01:00
}
2023-04-23 21:29:44 +01:00
/*
2021-02-10 17:32:56 +00:00
switch ( model ) {
case model7300 :
rigCaps . modelName = QString ( " IC-7300 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3073 ;
2021-02-10 17:32:56 +00:00
rigCaps . hasSpectrum = true ;
rigCaps . spectSeqMax = 11 ;
rigCaps . spectAmpMax = 160 ;
rigCaps . spectLenMax = 475 ;
2021-02-19 00:14:40 -08:00
rigCaps . inputs . append ( inputUSB ) ;
rigCaps . inputs . append ( inputACC ) ;
2021-02-10 17:32:56 +00:00
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-02-12 22:42:34 -08:00
rigCaps . hasATU = true ;
2021-04-04 23:33:56 -07:00
rigCaps . hasCTCSS = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-04-07 23:35:24 -07:00
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
2021-04-08 00:05:40 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
2023-04-23 21:29:44 +01:00
// rigCaps.bands = standardHF;
// rigCaps.bands.insert(rigCaps.bands.end(), { bandDef4m, bandDef630m, bandDef2200m, bandDefGen });
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x71 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x30 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x71"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x00\x30"));
//rigCaps.commands.insert(funcDashRatio,QByteArrayLiteral("\x1a\x05\x01\x61"));
2021-02-10 17:32:56 +00:00
break ;
2021-02-12 11:52:16 -08:00
case modelR8600 :
rigCaps . modelName = QString ( " IC-R8600 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3079 ;
2021-02-12 11:52:16 -08:00
rigCaps . hasSpectrum = true ;
rigCaps . spectSeqMax = 11 ;
rigCaps . spectAmpMax = 160 ;
rigCaps . spectLenMax = 475 ;
2021-02-19 00:14:40 -08:00
rigCaps . inputs . clear ( ) ;
2021-02-12 11:52:16 -08:00
rigCaps . hasLan = true ;
rigCaps . hasEthernet = true ;
rigCaps . hasWiFi = false ;
rigCaps . hasTransmit = false ;
2021-06-20 13:34:32 -07:00
rigCaps . hasPTTCommand = false ;
2021-04-04 23:33:56 -07:00
rigCaps . hasCTCSS = true ;
rigCaps . hasDTCS = true ;
2021-05-01 00:54:42 -07:00
rigCaps . hasDV = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-04-07 23:35:24 -07:00
rigCaps . attenuators . push_back ( ' \x10 ' ) ;
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
rigCaps . attenuators . push_back ( ' \x30 ' ) ;
2021-04-08 00:05:40 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
2021-04-09 15:57:16 -07:00
rigCaps . hasAntennaSel = true ;
2021-05-04 18:42:14 +02:00
rigCaps . antennas = { 0x00 , 0x01 , 0x02 } ;
2023-04-23 21:29:44 +01:00
// rigCaps.bands = standardHF;
// rigCaps.bands.insert(rigCaps.bands.end(), standardVU.begin(), standardVU.end());
// rigCaps.bands.insert(rigCaps.bands.end(), { bandDef23cm, bandDef4m, bandDef630m, bandDef2200m, bandDefGen });
// rigCaps.modes = commonModes;
2021-05-21 23:46:15 -07:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , {
createMode ( modeWFM , 0x06 , " WFM " ) , createMode ( modeS_AMD , 0x11 , " S-AM (D) " ) ,
createMode ( modeS_AML , 0x14 , " S-AM(L) " ) , createMode ( modeS_AMU , 0x15 , " S-AM(U) " ) ,
createMode ( modeP25 , 0x16 , " P25 " ) , createMode ( modedPMR , 0x18 , " dPMR " ) ,
createMode ( modeNXDN_VN , 0x19 , " NXDN-VN " ) , createMode ( modeNXDN_N , 0x20 , " NXDN-N " ) ,
createMode ( modeDCR , 0x21 , " DCR " ) } ) ;
2021-06-18 22:45:12 -07:00
rigCaps . scopeCenterSpans . insert ( rigCaps . scopeCenterSpans . end ( ) , { createScopeCenter ( cs1M , " ±1M " ) , createScopeCenter ( cs2p5M , " ±2.5M " ) } ) ;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x92 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ; // not documented very well
rigCaps . hasVFOAB = true ; // so we just do both...
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x92"));
2021-02-12 11:52:16 -08:00
break ;
2021-02-10 17:32:56 +00:00
case model9700 :
rigCaps . modelName = QString ( " IC-9700 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3081 ;
2021-02-10 17:32:56 +00:00
rigCaps . hasSpectrum = true ;
rigCaps . spectSeqMax = 11 ;
rigCaps . spectAmpMax = 160 ;
rigCaps . spectLenMax = 475 ;
2021-02-19 00:14:40 -08:00
rigCaps . inputs . append ( inputLAN ) ;
rigCaps . inputs . append ( inputUSB ) ;
rigCaps . inputs . append ( inputACC ) ;
2021-02-10 17:32:56 +00:00
rigCaps . hasLan = true ;
rigCaps . hasEthernet = true ;
rigCaps . hasWiFi = false ;
2021-02-11 09:09:45 -08:00
rigCaps . hasDD = true ;
rigCaps . hasDV = true ;
2021-04-04 23:33:56 -07:00
rigCaps . hasCTCSS = true ;
rigCaps . hasDTCS = true ;
2023-01-27 21:42:57 -08:00
rigCaps . hasRepeaterModes = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-04-07 23:35:24 -07:00
rigCaps . attenuators . push_back ( ' \x10 ' ) ;
2021-04-08 00:05:40 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardVU;
//rigCaps.bands.push_back(bandDef23cm);
2021-04-26 18:24:28 -07:00
rigCaps . bsr [ band23cm ] = 0x03 ;
rigCaps . bsr [ band70cm ] = 0x02 ;
rigCaps . bsr [ band2m ] = 0x01 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-05-21 23:46:15 -07:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , { createMode ( modeDV , 0x17 , " DV " ) ,
createMode ( modeDD , 0x22 , " DD " ) } ) ;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x01 \x27 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = true ;
2023-01-31 18:00:12 -08:00
rigCaps . hasAdvancedRptrToneCmds = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x43 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x01\x27"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x00\x43"));
//rigCaps.commands.insert(funcDashRatio,QByteArrayLiteral("\x1a\x05\x02\x24"));
2021-02-10 17:32:56 +00:00
break ;
2023-04-17 11:19:00 +01:00
case model905 :
rigCaps . modelName = QString ( " IC-905 " ) ;
rigCaps . rigctlModel = 0 ;
rigCaps . hasSpectrum = true ;
rigCaps . spectSeqMax = 11 ;
rigCaps . spectAmpMax = 160 ;
rigCaps . spectLenMax = 475 ;
rigCaps . inputs . append ( inputLAN ) ;
rigCaps . inputs . append ( inputUSB ) ;
rigCaps . hasLan = true ;
rigCaps . hasEthernet = true ;
rigCaps . hasWiFi = false ;
rigCaps . hasDD = true ;
rigCaps . hasDV = true ;
rigCaps . hasCTCSS = true ;
rigCaps . hasDTCS = true ;
rigCaps . hasRepeaterModes = true ;
rigCaps . hasTBPF = true ;
rigCaps . attenuators . push_back ( ' \x10 ' ) ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardVU;
//rigCaps.bands.push_back(bandDef23cm);
//rigCaps.bands.push_back(bandDef13cm);
//rigCaps.bands.push_back(bandDef6cm);
// rigCaps.bands.push_back(bandDef3cm);
2023-04-17 11:19:00 +01:00
rigCaps . bsr [ band2m ] = 0x01 ;
rigCaps . bsr [ band70cm ] = 0x02 ;
rigCaps . bsr [ band23cm ] = 0x03 ;
rigCaps . bsr [ band13cm ] = 0x04 ;
rigCaps . bsr [ band6cm ] = 0x05 ;
rigCaps . bsr [ band3cm ] = 0x06 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2023-04-17 11:19:00 +01:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , { createMode ( modeDV , 0x17 , " DV " ) ,
createMode ( modeDD , 0x22 , " DD " ) ,
createMode ( modeATV , 0x23 , " ATV " )
} ) ;
rigCaps . scopeCenterSpans . insert ( rigCaps . scopeCenterSpans . end ( ) , { createScopeCenter ( cs1M , " ±1M " ) ,
createScopeCenter ( cs2p5M , " ±2.5M " ) ,
createScopeCenter ( cs5M , " ±5M " ) ,
createScopeCenter ( cs10M , " ±10M " ) ,
createScopeCenter ( cs25M , " ±25M " ) } ) ;
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x01 \x42 " ) ;
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
rigCaps . hasAdvancedRptrToneCmds = true ;
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x46 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x01\x42"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x00\x46"));
//rigCaps.commands.insert(funcDashRatio,QByteArrayLiteral("\x1a\x05\x02\x36"));
2023-04-17 11:19:00 +01:00
break ;
2021-05-08 13:45:52 -07:00
case model910h :
rigCaps . modelName = QString ( " IC-910H " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3044 ;
2021-05-08 13:45:52 -07:00
rigCaps . hasSpectrum = false ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = false ;
2021-05-08 13:45:52 -07:00
rigCaps . hasDD = false ;
rigCaps . hasDV = false ;
rigCaps . hasCTCSS = true ;
rigCaps . hasDTCS = true ;
2023-01-27 21:42:57 -08:00
rigCaps . hasRepeaterModes = true ;
2021-05-08 13:45:52 -07:00
rigCaps . hasATU = false ;
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) , { ' \x10 ' , ' \x20 ' , ' \x30 ' } ) ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardVU;
//rigCaps.bands.push_back(bandDef23cm);
2021-05-08 13:45:52 -07:00
rigCaps . bsr [ band23cm ] = 0x03 ;
rigCaps . bsr [ band70cm ] = 0x02 ;
rigCaps . bsr [ band2m ] = 0x01 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x58 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x58"));
2021-05-08 13:45:52 -07:00
break ;
2021-07-09 15:15:04 -07:00
case model7600 :
rigCaps . modelName = QString ( " IC-7600 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3063 ;
2021-07-09 15:15:04 -07:00
rigCaps . hasSpectrum = false ;
rigCaps . inputs . append ( inputACC ) ;
rigCaps . inputs . append ( inputUSB ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
rigCaps . hasFDcomms = false ;
rigCaps . hasATU = true ;
rigCaps . hasCTCSS = false ;
rigCaps . hasDTCS = false ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-07-09 15:15:04 -07:00
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) , { 0x00 , 0x06 , 0x12 , 0x18 } ) ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
rigCaps . antennas = { 0x00 , 0x01 } ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardHF;
//rigCaps.bands.push_back(bandDefGen);
2021-07-09 15:15:04 -07:00
rigCaps . bsr [ bandGen ] = 0x11 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2022-09-26 21:22:02 +01:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , { createMode ( modePSK , 0x12 , " PSK " ) ,
createMode ( modePSK_R , 0x13 , " PSK-R " ) } ) ;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x97 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = false ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x64 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x97"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x00\x64"));
2021-07-09 15:15:04 -07:00
break ;
2021-02-10 17:32:56 +00:00
case model7610 :
rigCaps . modelName = QString ( " IC-7610 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3078 ;
2021-02-10 17:32:56 +00:00
rigCaps . hasSpectrum = true ;
rigCaps . spectSeqMax = 15 ;
rigCaps . spectAmpMax = 200 ;
rigCaps . spectLenMax = 689 ;
2021-02-19 00:14:40 -08:00
rigCaps . inputs . append ( inputLAN ) ;
rigCaps . inputs . append ( inputUSB ) ;
rigCaps . inputs . append ( inputACC ) ;
2021-02-10 17:32:56 +00:00
rigCaps . hasLan = true ;
rigCaps . hasEthernet = true ;
rigCaps . hasWiFi = false ;
2021-04-04 23:33:56 -07:00
rigCaps . hasCTCSS = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-04-07 23:35:24 -07:00
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) ,
{ ' \x03 ' , ' \x06 ' , ' \x09 ' , ' \x12 ' , \
' \x15 ' , ' \x18 ' , ' \x21 ' , ' \x24 ' , \
' \x27 ' , ' \x30 ' , ' \x33 ' , ' \x36 ' ,
' \x39 ' , ' \x42 ' , ' \x45 ' } ) ;
2021-04-08 00:05:40 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
2021-04-09 15:57:16 -07:00
rigCaps . hasAntennaSel = true ;
2021-05-04 18:42:14 +02:00
rigCaps . antennas = { 0x00 , 0x01 } ;
2021-04-11 16:38:58 +00:00
rigCaps . hasATU = true ;
2021-04-26 18:24:28 -07:00
rigCaps . bands = standardHF ;
2022-10-29 15:12:30 +01:00
rigCaps . bands . insert ( rigCaps . bands . end ( ) , { bandDef630m , bandDef2200m , bandDefGen } ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2022-09-26 21:22:02 +01:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , { createMode ( modePSK , 0x12 , " PSK " ) ,
createMode ( modePSK_R , 0x13 , " PSK-R " ) } ) ;
2021-07-16 17:08:55 +01:00
rigCaps . hasRXAntenna = true ;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x01 \x12 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasSpecifyMainSubCmd = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x33 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = false ;
2023-05-03 19:19:58 +01:00
break ;
2021-02-10 17:32:56 +00:00
case model7850 :
rigCaps . modelName = QString ( " IC-785x " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3075 ;
2021-02-10 17:32:56 +00:00
rigCaps . hasSpectrum = true ;
rigCaps . spectSeqMax = 15 ;
rigCaps . spectAmpMax = 136 ;
rigCaps . spectLenMax = 689 ;
2021-02-19 00:14:40 -08:00
rigCaps . inputs . append ( inputLAN ) ;
rigCaps . inputs . append ( inputUSB ) ;
rigCaps . inputs . append ( inputACCA ) ;
rigCaps . inputs . append ( inputACCB ) ;
2021-02-10 17:32:56 +00:00
rigCaps . hasLan = true ;
rigCaps . hasEthernet = true ;
rigCaps . hasWiFi = false ;
2021-02-12 22:42:34 -08:00
rigCaps . hasATU = true ;
2021-04-04 23:33:56 -07:00
rigCaps . hasCTCSS = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-04-07 23:35:24 -07:00
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) ,
{ ' \x03 ' , ' \x06 ' , ' \x09 ' ,
' \x12 ' , ' \x15 ' , ' \x18 ' , ' \x21 ' } ) ;
2021-04-08 00:05:40 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
2021-04-09 15:57:16 -07:00
rigCaps . hasAntennaSel = true ;
2021-05-04 18:42:14 +02:00
rigCaps . antennas = { 0x00 , 0x01 , 0x02 , 0x03 } ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardHF;
//rigCaps.bands.insert(rigCaps.bands.end(), { bandDef630m, bandDef2200m, bandDefGen });
//rigCaps.modes = commonModes;
2021-05-21 23:46:15 -07:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , { createMode ( modePSK , 0x12 , " PSK " ) ,
createMode ( modePSK_R , 0x13 , " PSK-R " ) } ) ;
2021-07-16 17:08:55 +01:00
rigCaps . hasRXAntenna = true ;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x01 \x55 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasSpecifyMainSubCmd = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x01 \x13 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = false ;
2021-02-10 17:32:56 +00:00
break ;
case model705 :
rigCaps . modelName = QString ( " IC-705 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3085 ;
2021-02-10 17:32:56 +00:00
rigCaps . hasSpectrum = true ;
rigCaps . spectSeqMax = 11 ;
rigCaps . spectAmpMax = 160 ;
rigCaps . spectLenMax = 475 ;
2021-02-19 00:14:40 -08:00
rigCaps . inputs . append ( inputLAN ) ;
rigCaps . inputs . append ( inputUSB ) ;
2021-02-10 17:32:56 +00:00
rigCaps . hasLan = true ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = true ;
2021-02-11 09:09:45 -08:00
rigCaps . hasDD = true ;
rigCaps . hasDV = true ;
2021-02-12 22:42:34 -08:00
rigCaps . hasATU = true ;
2021-04-04 23:33:56 -07:00
rigCaps . hasCTCSS = true ;
rigCaps . hasDTCS = true ;
2023-01-27 21:42:57 -08:00
rigCaps . hasRepeaterModes = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-04-08 00:05:40 -07:00
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) , { ' \x10 ' , ' \x20 ' } ) ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardHF;
//rigCaps.bands.insert(rigCaps.bands.end(), standardVU.begin(), standardVU.end());
//rigCaps.bands.insert(rigCaps.bands.end(), { bandDefAir, bandDefGen, bandDefWFM, bandDef630m, bandDef2200m });
2021-04-26 18:24:28 -07:00
rigCaps . bsr [ band70cm ] = 0x14 ;
rigCaps . bsr [ band2m ] = 0x13 ;
rigCaps . bsr [ bandAir ] = 0x12 ;
rigCaps . bsr [ bandWFM ] = 0x11 ;
rigCaps . bsr [ bandGen ] = 0x15 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-05-21 23:46:15 -07:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , { createMode ( modeWFM , 0x06 , " WFM " ) ,
createMode ( modeDV , 0x17 , " DV " ) } ) ;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x01 \x31 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x45 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x01\x31"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x00\x45"));
//rigCaps.commands.insert(funcDashRatio,QByteArrayLiteral("\x1A\x05\x02\x52"));
2021-02-10 17:32:56 +00:00
break ;
2021-05-14 19:04:47 -07:00
case model7000 :
rigCaps . modelName = QString ( " IC-7000 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3060 ;
2021-05-14 19:04:47 -07:00
rigCaps . hasSpectrum = false ;
rigCaps . inputs . append ( inputACC ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = false ;
2021-05-14 19:04:47 -07:00
rigCaps . hasATU = true ;
rigCaps . hasCTCSS = true ;
rigCaps . hasDTCS = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-05-16 19:45:26 -07:00
rigCaps . attenuators . push_back ( ' \x12 ' ) ;
2021-05-14 19:04:47 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardHF;
//rigCaps.bands.insert(rigCaps.bands.end(), standardVU.begin(), standardVU.end());
//rigCaps.bands.push_back(bandDefGen);
2021-05-14 19:04:47 -07:00
rigCaps . bsr [ band2m ] = 0x11 ;
rigCaps . bsr [ band70cm ] = 0x12 ;
rigCaps . bsr [ bandGen ] = 0x13 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x92 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x52 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
// rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x92"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x00\x52"));
2021-05-14 19:04:47 -07:00
break ;
2021-05-14 23:58:22 -07:00
case model7410 :
rigCaps . modelName = QString ( " IC-7410 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3067 ;
2021-05-14 23:58:22 -07:00
rigCaps . hasSpectrum = false ;
rigCaps . inputs . append ( inputACC ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = true ;
2021-05-14 23:58:22 -07:00
rigCaps . hasATU = true ;
rigCaps . hasCTCSS = true ;
rigCaps . hasDTCS = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-07-26 09:03:09 -07:00
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
2021-05-14 23:58:22 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
rigCaps . antennas = { 0x00 , 0x01 } ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardHF;
//rigCaps.bands.push_back(bandDefGen);
2021-05-14 23:58:22 -07:00
rigCaps . bsr [ bandGen ] = 0x11 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x40 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x11 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x40"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x00\x11"));
2021-05-14 23:58:22 -07:00
break ;
2021-02-19 00:14:40 -08:00
case model7100 :
rigCaps . modelName = QString ( " IC-7100 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3070 ;
2021-02-19 00:14:40 -08:00
rigCaps . hasSpectrum = false ;
rigCaps . inputs . append ( inputUSB ) ;
rigCaps . inputs . append ( inputACC ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = false ;
2021-02-19 00:14:40 -08:00
rigCaps . hasATU = true ;
2021-04-04 23:33:56 -07:00
rigCaps . hasCTCSS = true ;
rigCaps . hasDTCS = true ;
2023-01-27 21:42:57 -08:00
rigCaps . hasRepeaterModes = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-04-07 23:35:24 -07:00
rigCaps . attenuators . push_back ( ' \x12 ' ) ;
2021-04-08 00:05:40 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardHF;
//rigCaps.bands.insert(rigCaps.bands.end(), standardVU.begin(), standardVU.end());
//rigCaps.bands.insert(rigCaps.bands.end(), { bandDef4m, bandDefGen});
2021-04-26 18:24:28 -07:00
rigCaps . bsr [ band2m ] = 0x11 ;
rigCaps . bsr [ band70cm ] = 0x12 ;
rigCaps . bsr [ bandGen ] = 0x13 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-05-21 23:46:15 -07:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , { createMode ( modeWFM , 0x06 , " WFM " ) ,
createMode ( modeDV , 0x17 , " DV " ) } ) ;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x95 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x15 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
// rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x95"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x00\x15"));
//rigCaps.commands.insert(funcDashRatio,QByteArrayLiteral("\x1A\x05\x01\x35"));
2023-04-19 14:51:23 +01:00
2021-02-19 00:14:40 -08:00
break ;
2021-05-16 00:07:24 -07:00
case model7200 :
rigCaps . modelName = QString ( " IC-7200 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3061 ;
2021-05-16 00:07:24 -07:00
rigCaps . hasSpectrum = false ;
rigCaps . inputs . append ( inputUSB ) ;
rigCaps . inputs . append ( inputACC ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = false ;
2021-05-16 00:07:24 -07:00
rigCaps . hasATU = true ;
rigCaps . hasCTCSS = true ;
rigCaps . hasDTCS = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-05-16 00:07:24 -07:00
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardHF;
//rigCaps.bands.push_back(bandDefGen);
2021-05-16 00:07:24 -07:00
rigCaps . bsr [ bandGen ] = 0x11 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x03 \x48 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x03 \x18 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x03\x48"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x03\x18"));
2021-08-29 00:16:31 +01:00
break ;
2021-05-31 14:01:13 -07:00
case model7700 :
rigCaps . modelName = QString ( " IC-7700 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3062 ;
2021-05-31 14:01:13 -07:00
rigCaps . hasSpectrum = false ;
rigCaps . inputs . append ( inputLAN ) ;
//rigCaps.inputs.append(inputSPDIF);
rigCaps . inputs . append ( inputACC ) ;
rigCaps . hasLan = true ;
rigCaps . hasEthernet = true ;
rigCaps . hasWiFi = false ;
rigCaps . hasCTCSS = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-05-31 14:01:13 -07:00
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) ,
{ ' \x06 ' , ' \x12 ' , ' \x18 ' } ) ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
rigCaps . hasAntennaSel = true ;
rigCaps . antennas = { 0x00 , 0x01 , 0x02 , 0x03 } ; // not sure if 0x03 works
rigCaps . hasATU = true ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardHF;
//rigCaps.bands.insert(rigCaps.bands.end(), { bandDefGen, bandDef630m, bandDef2200m });
//rigCaps.modes = commonModes;
2021-05-31 14:01:13 -07:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , { createMode ( modePSK , 0x12 , " PSK " ) ,
createMode ( modePSK_R , 0x13 , " PSK-R " ) } ) ;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x95 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x67 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x95"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x00\x67"));
//rigCaps.commands.insert(funcDashRatio,QByteArrayLiteral("\x1A\x05\x01\x34"));
2021-05-16 00:07:24 -07:00
break ;
2022-11-23 20:44:32 -08:00
case model703 :
rigCaps . modelName = QString ( " IC-703 " ) ;
rigCaps . rigctlModel = 3055 ;
rigCaps . hasSpectrum = false ;
rigCaps . inputs . clear ( ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
rigCaps . hasFDcomms = false ;
rigCaps . hasATU = true ;
rigCaps . hasPTTCommand = false ;
rigCaps . useRTSforPTT = true ;
rigCaps . hasDataModes = false ;
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardHF;
//rigCaps.bands.insert(rigCaps.bands.end(), standardVU.begin(), standardVU.end());
//rigCaps.bands.push_back(bandDefGen);
//rigCaps.modes = commonModes;
2022-11-23 20:44:32 -08:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , createMode ( modeWFM , 0x06 , " WFM " ) ) ;
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x00 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x00"));
//rigCaps.commands.insert(funcFreqGet,QByteArrayLiteral("\x00"));
//rigCaps.commands.insert(funcFreqSet,QByteArrayLiteral("\x03"));
//rigCaps.commands.insert(funcModeGet,QByteArrayLiteral("\x01"));
//rigCaps.commands.insert(funcModeSet,QByteArrayLiteral("\x06"));
2023-04-19 14:51:23 +01:00
2022-11-23 20:44:32 -08:00
break ;
2021-02-13 10:02:45 -08:00
case model706 :
rigCaps . modelName = QString ( " IC-706 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3009 ;
2021-02-13 10:02:45 -08:00
rigCaps . hasSpectrum = false ;
2021-02-19 00:14:40 -08:00
rigCaps . inputs . clear ( ) ;
2021-02-13 10:02:45 -08:00
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = false ;
2021-02-13 10:02:45 -08:00
rigCaps . hasATU = true ;
2021-06-20 13:34:32 -07:00
rigCaps . hasPTTCommand = false ;
2021-11-05 23:21:36 -07:00
rigCaps . useRTSforPTT = true ;
2021-06-20 13:34:32 -07:00
rigCaps . hasDataModes = false ;
2021-04-07 23:35:24 -07:00
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.bands = standardHF;
//rigCaps.bands.insert(rigCaps.bands.end(), standardVU.begin(), standardVU.end());
//rigCaps.bands.push_back(bandDefGen);
//rigCaps.modes = commonModes;
2021-05-21 23:46:15 -07:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , createMode ( modeWFM , 0x06 , " WFM " ) ) ;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x00 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x00"));
//rigCaps.commands.insert(funcFreqGet,QByteArrayLiteral("\x00"));
//rigCaps.commands.insert(funcFreqSet,QByteArrayLiteral("\x03"));
//rigCaps.commands.insert(funcModeGet,QByteArrayLiteral("\x01"));
//rigCaps.commands.insert(funcModeSet,QByteArrayLiteral("\x06"));
2021-02-13 10:02:45 -08:00
break ;
2021-06-08 14:42:19 -07:00
case model718 :
rigCaps . modelName = QString ( " IC-718 " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3013 ;
2021-06-08 14:42:19 -07:00
rigCaps . hasSpectrum = false ;
rigCaps . inputs . clear ( ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = false ;
2021-06-08 14:42:19 -07:00
rigCaps . hasATU = false ;
2021-06-20 13:34:32 -07:00
rigCaps . hasPTTCommand = false ;
2021-11-05 23:21:36 -07:00
rigCaps . useRTSforPTT = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasIFShift = true ;
2021-06-20 13:34:32 -07:00
rigCaps . hasDataModes = false ;
2021-06-08 14:42:19 -07:00
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
2022-10-29 15:12:30 +01:00
rigCaps . bands = { bandDef10m , bandDef10m , bandDef12m ,
bandDef15m , bandDef17m , bandDef20m , bandDef30m ,
bandDef40m , bandDef60m , bandDef80m , bandDef160m , bandDefGen } ;
2021-06-08 14:42:19 -07:00
rigCaps . modes = { createMode ( modeLSB , 0x00 , " LSB " ) , createMode ( modeUSB , 0x01 , " USB " ) ,
createMode ( modeAM , 0x02 , " AM " ) ,
createMode ( modeCW , 0x03 , " CW " ) , createMode ( modeCW_R , 0x07 , " CW-R " ) ,
createMode ( modeRTTY , 0x04 , " RTTY " ) , createMode ( modeRTTY_R , 0x08 , " RTTY-R " )
} ;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x00 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x00"));
//rigCaps.commands.insert(funcFreqGet,QByteArrayLiteral("\x00"));
//rigCaps.commands.insert(funcFreqSet,QByteArrayLiteral("\x03"));
//rigCaps.commands.insert(funcModeGet,QByteArrayLiteral("\x01"));
//rigCaps.commands.insert(funcModeSet,QByteArrayLiteral("\x06"));
2023-04-19 14:51:23 +01:00
break ;
2021-08-17 14:00:37 -07:00
case model736 :
rigCaps . modelName = QString ( " IC-736 " ) ;
rigCaps . rigctlModel = 3020 ;
rigCaps . hasSpectrum = false ;
rigCaps . inputs . clear ( ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
rigCaps . hasFDcomms = false ;
rigCaps . hasATU = false ;
rigCaps . hasPTTCommand = false ;
2021-11-05 23:21:36 -07:00
rigCaps . useRTSforPTT = true ;
2021-08-17 14:00:37 -07:00
rigCaps . hasDataModes = false ;
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . bands = standardHF ;
rigCaps . modes = { createMode ( modeLSB , 0x00 , " LSB " ) , createMode ( modeUSB , 0x01 , " USB " ) ,
2021-11-04 20:45:02 -07:00
createMode ( modeAM , 0x02 , " AM " ) , createMode ( modeFM , 0x05 , " FM " ) ,
2021-08-17 14:00:37 -07:00
createMode ( modeCW , 0x03 , " CW " ) , createMode ( modeCW_R , 0x07 , " CW-R " ) ,
} ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcFreqGet,QByteArrayLiteral("\x00"));
//rigCaps.commands.insert(funcFreqSet,QByteArrayLiteral("\x03"));
// rigCaps.commands.insert(funcModeGet,QByteArrayLiteral("\x01"));
//rigCaps.commands.insert(funcModeSet,QByteArrayLiteral("\x06"));
2021-08-17 14:00:37 -07:00
break ;
2022-11-23 20:44:32 -08:00
case model737 :
rigCaps . modelName = QString ( " IC-737 " ) ;
rigCaps . rigctlModel = 3021 ;
rigCaps . hasSpectrum = false ;
rigCaps . inputs . clear ( ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
rigCaps . hasFDcomms = false ;
rigCaps . hasATU = false ;
rigCaps . hasPTTCommand = false ;
rigCaps . useRTSforPTT = true ;
rigCaps . hasDataModes = false ;
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . bands = standardHF ;
rigCaps . modes = { createMode ( modeLSB , 0x00 , " LSB " ) , createMode ( modeUSB , 0x01 , " USB " ) ,
createMode ( modeAM , 0x02 , " AM " ) , createMode ( modeFM , 0x05 , " FM " ) ,
createMode ( modeCW , 0x03 , " CW " ) , createMode ( modeCW_R , 0x07 , " CW-R " ) ,
} ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcFreqGet,QByteArrayLiteral("\x00"));
// rigCaps.commands.insert(funcFreqSet,QByteArrayLiteral("\x03"));
// rigCaps.commands.insert(funcModeGet,QByteArrayLiteral("\x01"));
// rigCaps.commands.insert(funcModeSet,QByteArrayLiteral("\x06"));
2022-11-23 20:44:32 -08:00
break ;
2022-11-23 16:59:10 -08:00
case model738 :
rigCaps . modelName = QString ( " IC-738 " ) ;
rigCaps . rigctlModel = 3022 ;
rigCaps . hasSpectrum = false ;
rigCaps . inputs . clear ( ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
rigCaps . hasFDcomms = false ;
rigCaps . hasATU = false ;
rigCaps . hasPTTCommand = false ;
rigCaps . useRTSforPTT = true ;
rigCaps . hasDataModes = false ;
2021-08-17 14:00:37 -07:00
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . bands = standardHF ;
rigCaps . modes = { createMode ( modeLSB , 0x00 , " LSB " ) , createMode ( modeUSB , 0x01 , " USB " ) ,
2021-11-04 20:45:02 -07:00
createMode ( modeAM , 0x02 , " AM " ) , createMode ( modeFM , 0x05 , " FM " ) ,
2021-08-17 14:00:37 -07:00
createMode ( modeCW , 0x03 , " CW " ) , createMode ( modeCW_R , 0x07 , " CW-R " ) ,
} ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = false ;
rigCaps . hasVFOAB = true ;
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcFreqGet,QByteArrayLiteral("\x00"));
//rigCaps.commands.insert(funcFreqSet,QByteArrayLiteral("\x03"));
// rigCaps.commands.insert(funcModeGet,QByteArrayLiteral("\x01"));
// rigCaps.commands.insert(funcModeSet,QByteArrayLiteral("\x06"));
2021-08-17 14:00:37 -07:00
break ;
2022-02-07 20:31:29 -05:00
case model746 :
rigCaps . modelName = QString ( " IC-746 " ) ;
rigCaps . rigctlModel = 3023 ;
rigCaps . hasSpectrum = false ;
rigCaps . inputs . clear ( ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
rigCaps . hasFDcomms = false ;
rigCaps . hasATU = true ;
rigCaps . hasTBPF = true ;
rigCaps . hasIFShift = true ;
rigCaps . hasCTCSS = true ;
rigCaps . hasDTCS = true ;
2023-01-27 21:42:57 -08:00
rigCaps . hasRepeaterModes = true ;
2022-02-07 20:31:29 -05:00
rigCaps . hasAntennaSel = true ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) , { ' \x20 ' } ) ;
// There are two HF and VHF ant, 12-01 adn 12-02 select the HF, the VHF is auto selected
// this incorrectly shows up as 2 and 3 in the drop down.
rigCaps . antennas = { 0x01 , 0x02 } ;
rigCaps . bands = standardHF ;
2022-10-29 15:12:30 +01:00
rigCaps . bands . push_back ( bandDef2m ) ;
rigCaps . bands . push_back ( bandDefGen ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2022-02-07 20:31:29 -05:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x00 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = true ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x00"));
2022-02-07 20:31:29 -05:00
break ;
2022-11-23 16:59:10 -08:00
case model756 :
rigCaps . modelName = QString ( " IC-756 " ) ;
rigCaps . rigctlModel = 3026 ;
rigCaps . hasSpectrum = false ;
rigCaps . inputs . clear ( ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
rigCaps . hasFDcomms = false ;
rigCaps . hasATU = true ;
rigCaps . hasTBPF = true ;
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) , { ' \x06 ' , ' \x12 ' , ' \x18 ' } ) ;
rigCaps . antennas = { 0x00 , 0x01 } ;
rigCaps . bands = standardHF ;
2022-11-26 19:10:59 +00:00
rigCaps . bands . push_back ( bandDefGen ) ;
2022-11-23 16:59:10 -08:00
rigCaps . bsr [ bandGen ] = 0x11 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2022-11-23 16:59:10 -08:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x00 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = false ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
// rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x00"));
2022-11-23 16:59:10 -08:00
break ;
2021-05-20 16:15:25 -07:00
case model756pro :
rigCaps . modelName = QString ( " IC-756 Pro " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3027 ;
2021-05-20 16:15:25 -07:00
rigCaps . hasSpectrum = false ;
rigCaps . inputs . clear ( ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = false ;
2021-05-20 16:15:25 -07:00
rigCaps . hasATU = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-05-20 16:15:25 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) , { ' \x06 ' , ' \x12 ' , ' \x18 ' } ) ;
rigCaps . antennas = { 0x00 , 0x01 } ;
rigCaps . bands = standardHF ;
2022-10-29 15:12:30 +01:00
rigCaps . bands . push_back ( bandDefGen ) ;
2021-05-20 16:15:25 -07:00
rigCaps . bsr [ bandGen ] = 0x11 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x00 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = false ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x00"));
2021-05-21 23:46:15 -07:00
break ;
case model756proii :
rigCaps . modelName = QString ( " IC-756 Pro II " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3027 ;
2021-05-21 23:46:15 -07:00
rigCaps . hasSpectrum = false ;
rigCaps . inputs . clear ( ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = false ;
2021-05-21 23:46:15 -07:00
rigCaps . hasATU = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-05-21 23:46:15 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) , { ' \x06 ' , ' \x12 ' , ' \x18 ' } ) ;
rigCaps . antennas = { 0x00 , 0x01 } ;
rigCaps . bands = standardHF ;
2022-10-29 15:12:30 +01:00
rigCaps . bands . push_back ( bandDefGen ) ;
2021-05-21 23:46:15 -07:00
rigCaps . bsr [ bandGen ] = 0x11 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x00 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = false ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x24 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x00"));
// rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x24"));
2021-05-20 16:15:25 -07:00
break ;
2021-05-20 15:57:30 -07:00
case model756proiii :
rigCaps . modelName = QString ( " IC-756 Pro III " ) ;
2021-08-07 18:34:34 +01:00
rigCaps . rigctlModel = 3027 ;
2021-05-20 15:57:30 -07:00
rigCaps . hasSpectrum = false ;
rigCaps . inputs . clear ( ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = false ;
2021-05-20 15:57:30 -07:00
rigCaps . hasATU = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2021-05-20 15:57:30 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) , { ' \x06 ' , ' \x12 ' , ' \x18 ' } ) ;
rigCaps . antennas = { 0x00 , 0x01 } ;
rigCaps . bands = standardHF ;
2022-10-29 15:12:30 +01:00
rigCaps . bands . push_back ( bandDefGen ) ;
2021-05-20 15:57:30 -07:00
rigCaps . bsr [ bandGen ] = 0x11 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x00 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = false ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x24 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcTransceive,QByteArrayLiteral("\x1a\x05\x00\x00"));
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x24"));
2021-05-20 15:57:30 -07:00
break ;
2021-08-17 09:35:40 -07:00
case model9100 :
rigCaps . modelName = QString ( " IC-9100 " ) ;
rigCaps . rigctlModel = 3068 ;
rigCaps . hasSpectrum = false ;
rigCaps . inputs . append ( inputUSB ) ; // TODO, add commands for this radio's inputs
rigCaps . inputs . append ( inputACC ) ;
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
rigCaps . hasFDcomms = false ;
rigCaps . hasATU = true ;
rigCaps . hasDV = true ;
2021-11-05 10:09:31 -07:00
rigCaps . hasTBPF = true ;
2023-05-15 10:53:52 +01:00
rigCaps . hasRepeaterModes = true
2021-08-17 09:35:40 -07:00
rigCaps . preamps . push_back ( ' \x01 ' ) ;
rigCaps . preamps . push_back ( ' \x02 ' ) ;
rigCaps . attenuators . insert ( rigCaps . attenuators . end ( ) , { ' \x20 ' } ) ;
rigCaps . antennas = { 0x00 , 0x01 } ;
rigCaps . bands = standardHF ;
rigCaps . bands . insert ( rigCaps . bands . end ( ) , standardVU . begin ( ) , standardVU . end ( ) ) ;
2022-10-29 15:12:30 +01:00
rigCaps . bands . push_back ( bandDef23cm ) ;
rigCaps . bands . push_back ( bandDefGen ) ;
2021-08-17 09:35:40 -07:00
rigCaps . bsr [ band2m ] = 0x11 ;
rigCaps . bsr [ band70cm ] = 0x12 ;
rigCaps . bsr [ band23cm ] = 0x13 ;
rigCaps . bsr [ bandGen ] = 0x14 ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-08-17 09:35:40 -07:00
rigCaps . modes . insert ( rigCaps . modes . end ( ) , { createMode ( modeDV , 0x17 , " DV " ) } ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = true ;
2023-02-01 09:21:17 -08:00
rigCaps . hasQuickSplitCommand = true ;
rigCaps . quickSplitCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x14 " ) ;
2023-04-19 14:51:23 +01:00
// new functions
2023-04-23 21:29:44 +01:00
//rigCaps.commands.insert(funcQuickSplit,QByteArrayLiteral("\x1a\x05\x00\x14"));
2021-08-17 09:35:40 -07:00
break ;
2021-02-10 17:32:56 +00:00
default :
2021-05-19 21:51:24 -07:00
rigCaps . modelName = QString ( " IC-0x%1 " ) . arg ( rigCaps . modelID , 2 , 16 ) ;
2021-02-10 17:32:56 +00:00
rigCaps . hasSpectrum = false ;
rigCaps . spectSeqMax = 0 ;
rigCaps . spectAmpMax = 0 ;
rigCaps . spectLenMax = 0 ;
2021-02-19 00:14:40 -08:00
rigCaps . inputs . clear ( ) ;
2021-02-10 17:32:56 +00:00
rigCaps . hasLan = false ;
rigCaps . hasEthernet = false ;
rigCaps . hasWiFi = false ;
2021-06-18 12:41:56 -07:00
rigCaps . hasFDcomms = false ;
2021-04-09 15:57:16 -07:00
rigCaps . hasPreamp = false ;
rigCaps . hasAntennaSel = false ;
2021-04-07 23:35:24 -07:00
rigCaps . attenuators . push_back ( ' \x10 ' ) ;
2021-04-09 10:04:20 -07:00
rigCaps . attenuators . push_back ( ' \x12 ' ) ;
2021-04-07 23:35:24 -07:00
rigCaps . attenuators . push_back ( ' \x20 ' ) ;
2021-04-26 18:24:28 -07:00
rigCaps . bands = standardHF ;
rigCaps . bands . insert ( rigCaps . bands . end ( ) , standardVU . begin ( ) , standardVU . end ( ) ) ;
2022-10-29 15:12:30 +01:00
rigCaps . bands . insert ( rigCaps . bands . end ( ) , { bandDef23cm , bandDef4m , bandDef630m , bandDef2200m , bandDefGen } ) ;
2023-04-23 21:29:44 +01:00
//rigCaps.modes = commonModes;
2021-08-29 00:16:31 +01:00
rigCaps . transceiveCommand = QByteArrayLiteral ( " \x1a \x05 \x00 \x00 " ) ;
2023-01-27 12:44:23 -08:00
rigCaps . hasVFOMS = true ;
rigCaps . hasVFOAB = true ;
2021-05-21 23:46:15 -07:00
qInfo ( logRig ( ) ) < < " Found unknown rig: 0x " < < QString ( " %1 " ) . arg ( rigCaps . modelID , 2 , 16 ) ;
2021-02-10 17:32:56 +00:00
break ;
}
2023-04-23 21:29:44 +01:00
*/
2021-02-10 17:32:56 +00:00
haveRigCaps = true ;
2021-07-16 17:08:55 +01:00
2023-04-19 14:51:23 +01:00
2022-01-26 09:49:52 +00:00
// Copy received guid so we can recognise this radio.
2022-01-29 22:50:58 +00:00
memcpy ( rigCaps . guid , this - > guid , GUIDLEN ) ;
2022-01-26 09:49:52 +00:00
2021-11-06 22:49:10 -07:00
if ( ! usingNativeLAN )
2022-01-04 18:34:34 +00:00
{
if ( useRTSforPTT_isSet )
{
rigCaps . useRTSforPTT = useRTSforPTT_manual ;
}
2021-11-06 22:49:10 -07:00
comm - > setUseRTSforPTT ( rigCaps . useRTSforPTT ) ;
2022-01-04 18:34:34 +00:00
}
2021-11-06 22:49:10 -07:00
2021-02-10 17:32:56 +00:00
if ( lookingForRig )
{
lookingForRig = false ;
foundRig = true ;
2021-05-15 18:53:16 +01:00
2021-02-23 21:21:22 +00:00
qDebug ( logRig ( ) ) < < " ---Rig FOUND from broadcast query: " ;
2021-02-10 17:32:56 +00:00
this - > civAddr = incomingCIVAddr ; // Override and use immediately.
payloadPrefix = QByteArray ( " \xFE \xFE " ) ;
payloadPrefix . append ( civAddr ) ;
2021-02-22 11:11:08 +00:00
payloadPrefix . append ( ( char ) compCivAddr ) ;
2021-02-10 17:32:56 +00:00
// if there is a compile-time error, remove the following line, the "hex" part is the issue:
2022-04-28 10:52:46 +01:00
qInfo ( logRig ( ) ) < < " Using incomingCIVAddr: (int): " < < this - > civAddr < < " hex: " < < QString ( " 0x%1 " ) . arg ( this - > civAddr , 0 , 16 ) ;
2021-02-10 17:32:56 +00:00
emit discoveredRigID ( rigCaps ) ;
} else {
2021-05-15 16:57:08 -07:00
if ( ! foundRig )
{
emit discoveredRigID ( rigCaps ) ;
foundRig = true ;
}
2021-02-10 17:32:56 +00:00
emit haveRigID ( rigCaps ) ;
}
}
2023-05-15 10:53:52 +01:00
bool rigCommander : : parseSpectrum ( scopeData & d )
2018-06-19 12:58:52 -07:00
{
2023-05-15 10:53:52 +01:00
bool ret = false ;
2021-02-10 17:32:56 +00:00
if ( ! haveRigCaps )
{
2021-02-23 21:21:22 +00:00
qDebug ( logRig ( ) ) < < " Spectrum received in rigCommander, but rigID is incomplete. " ;
2023-05-15 10:53:52 +01:00
return ret ;
2021-02-10 17:32:56 +00:00
}
if ( rigCaps . spectSeqMax = = 0 )
{
// there is a chance this will happen with rigs that support spectrum. Once our RigID query returns, we will parse correctly.
2021-05-15 18:53:16 +01:00
qInfo ( logRig ( ) ) < < " Warning: Spectrum sequence max was zero, yet spectrum was received. " ;
2023-05-15 10:53:52 +01:00
return ret ;
2021-02-10 17:32:56 +00:00
}
2023-05-15 10:53:52 +01:00
2018-06-19 12:58:52 -07:00
// Here is what to expect:
// payloadIn[00] = '\x27';
// payloadIn[01] = '\x00';
// payloadIn[02] = '\x00';
//
// Example long: (sequences 2-10, 50 pixels)
// "INDEX: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 "
// "DATA: 27 00 00 07 11 27 13 15 01 00 22 21 09 08 06 19 0e 20 23 25 2c 2d 17 27 29 16 14 1b 1b 21 27 1a 18 17 1e 21 1b 24 21 22 23 13 19 23 2f 2d 25 25 0a 0e 1e 20 1f 1a 0c fd "
// ^--^--(seq 7/11)
// ^-- start waveform data 0x00 to 0xA0, index 05 to 54
//
// Example medium: (sequence #11)
// "INDEX: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 "
// "DATA: 27 00 00 11 11 0b 13 21 23 1a 1b 22 1e 1a 1d 13 21 1d 26 28 1f 19 1a 18 09 2c 2c 2c 1a 1b fd "
// Example short: (sequence #1) includes center/fixed mode at [05]. No pixels.
// "INDEX: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 "
// "DATA: 27 00 00 01 11 01 00 00 00 14 00 00 00 35 14 00 00 fd "
// ^-- mode 00 (center) or 01 (fixed)
// ^--14.00 MHz lower edge
// ^-- 14.350 MHz upper edge
// ^-- possibly 00=in range 01 = out of range
// Note, the index used here, -1, matches the ICD in the owner's manual.
// Owner's manual + 1 = our index.
// divs: Mode: Waveinfo: Len: Comment:
// 2-10 var var 56 Minimum wave information w/waveform data
// 11 10 26 31 Minimum wave information w/waveform data
// 1 1 0 18 Only Wave Information without waveform data
2021-03-22 00:11:43 -07:00
freqt fStart ;
freqt fEnd ;
2023-05-15 10:53:52 +01:00
d . mainSub = bcdHexToUChar ( payloadIn [ 02 ] ) ;
2021-02-15 22:33:21 -08:00
unsigned char sequence = bcdHexToUChar ( payloadIn [ 03 ] ) ;
2022-09-27 09:37:24 +01:00
2018-06-19 12:58:52 -07:00
//unsigned char sequenceMax = bcdHexToDecimal(payloadIn[04]);
2021-02-10 17:32:56 +00:00
2018-06-19 12:58:52 -07:00
// unsigned char waveInfo = payloadIn[06]; // really just one byte?
2021-05-15 18:53:16 +01:00
//qInfo(logRig()) << "Spectrum Data received: " << sequence << "/" << sequenceMax << " mode: " << scopeMode << " waveInfo: " << waveInfo << " length: " << payloadIn.length();
2018-06-19 12:58:52 -07:00
// Sequnce 2, index 05 is the start of data
// Sequence 11. index 05, is the last chunk
// Sequence 11, index 29, is the actual last pixel (it seems)
// It looks like the data length may be variable, so we need to detect it each time.
// start at payloadIn.length()-1 (to override the FD). Never mind, index -1 bad.
// chop off FD.
2021-02-10 17:32:56 +00:00
if ( ( sequence = = 1 ) & & ( sequence < rigCaps . spectSeqMax ) )
2018-06-19 12:58:52 -07:00
{
2021-02-10 17:32:56 +00:00
2023-05-15 13:47:45 +01:00
spectrumMode_t scopeMode = ( spectrumMode_t ) bcdHexToUChar ( payloadIn [ 05 ] ) ; // 0=center, 1=fixed
2021-02-10 17:32:56 +00:00
if ( scopeMode ! = oldScopeMode )
{
2021-02-28 21:41:27 -08:00
//TODO: support the other two modes (firmware 1.40)
// Modes:
// 0x00 Center
// 0x01 Fixed
// 0x02 Scroll-C
// 0x03 Scroll-F
2023-05-15 13:47:45 +01:00
emit havespectrumMode_t ( scopeMode ) ;
2021-02-10 17:32:56 +00:00
oldScopeMode = scopeMode ;
}
2023-02-04 09:57:12 -08:00
if ( payloadIn . length ( ) > = 15 )
{
2023-05-15 10:53:52 +01:00
d . oor = ( bool ) payloadIn [ 16 ] ;
2023-05-24 19:50:01 +01:00
if ( d . oor ) {
d . data = QByteArray ( rigCaps . spectLenMax , ' \0 ' ) ;
return true ;
2023-02-04 09:57:12 -08:00
}
}
2021-02-10 17:32:56 +00:00
2018-06-19 12:58:52 -07:00
// wave information
spectrumLine . clear ( ) ;
2023-05-24 19:50:01 +01:00
2021-02-28 21:41:27 -08:00
// For Fixed, and both scroll modes, the following produces correct information:
2021-03-22 00:11:43 -07:00
fStart = parseFrequency ( payloadIn , 9 ) ;
2023-05-24 19:50:01 +01:00
d . startFreq = fStart . MHzDouble ;
2021-03-22 00:11:43 -07:00
fEnd = parseFrequency ( payloadIn , 14 ) ;
2023-05-24 19:50:01 +01:00
d . endFreq = fEnd . MHzDouble ;
2021-02-28 21:41:27 -08:00
if ( scopeMode = = spectModeCenter )
2018-06-19 12:58:52 -07:00
{
2022-03-23 15:45:51 +00:00
// "center" mode, start is actual center, end is bandwidth.
2023-05-24 19:50:01 +01:00
d . startFreq - = d . endFreq ;
d . endFreq = d . startFreq + 2 * ( d . endFreq ) ;
2018-06-19 12:58:52 -07:00
}
2021-05-01 21:53:05 -07:00
2021-02-10 17:32:56 +00:00
if ( payloadIn . length ( ) > 400 ) // Must be a LAN packet.
{
payloadIn . chop ( 1 ) ;
2023-05-15 10:53:52 +01:00
d . data . append ( payloadIn . right ( payloadIn . length ( ) - 17 ) ) ; // write over the FD, last one doesn't, oh well.
ret = true ;
2021-02-10 17:32:56 +00:00
}
2023-05-15 10:53:52 +01:00
}
else if ( ( sequence > 1 ) & & ( sequence < rigCaps . spectSeqMax ) )
2018-06-19 12:58:52 -07:00
{
// spectrum from index 05 to index 54, length is 55 per segment. Length is 56 total. Pixel data is 50 pixels.
// sequence numbers 2 through 10, 50 pixels each. Total after sequence 10 is 450 pixels.
payloadIn . chop ( 1 ) ;
spectrumLine . insert ( spectrumLine . length ( ) , payloadIn . right ( payloadIn . length ( ) - 5 ) ) ; // write over the FD, last one doesn't, oh well.
2023-05-15 10:53:52 +01:00
ret = true ;
2021-05-15 18:53:16 +01:00
//qInfo(logRig()) << "sequence: " << sequence << "spec index: " << (sequence-2)*55 << " payloadPosition: " << payloadIn.length() - 5 << " payload length: " << payloadIn.length();
2021-02-10 17:32:56 +00:00
} else if ( sequence = = rigCaps . spectSeqMax )
2018-06-19 12:58:52 -07:00
{
2021-02-10 17:32:56 +00:00
// last spectrum, a little bit different (last 25 pixels). Total at end is 475 pixels (7300).
2018-06-19 12:58:52 -07:00
payloadIn . chop ( 1 ) ;
spectrumLine . insert ( spectrumLine . length ( ) , payloadIn . right ( payloadIn . length ( ) - 5 ) ) ;
2023-05-15 10:53:52 +01:00
d . data = spectrumLine ;
ret = true ;
2021-05-15 18:53:16 +01:00
//qInfo(logRig()) << "sequence: " << sequence << " spec index: " << (sequence-2)*55 << " payloadPosition: " << payloadIn.length() - 5 << " payload length: " << payloadIn.length();
2023-05-15 10:53:52 +01:00
//emit haveSpectrumData(spectrumLine, spectrumStartFreq, spectrumEndFreq);
2018-06-19 12:58:52 -07:00
}
2023-05-15 10:53:52 +01:00
d . valid = ret ;
return ret ;
2018-06-19 12:58:52 -07:00
}
2021-02-15 22:33:21 -08:00
void rigCommander : : parseSpectrumRefLevel ( )
{
// 00: 27
// 01: 19
// 02: 00 (fixed)
// 03: XX
// 04: x0
// 05: 00 (+) or 01 (-)
unsigned char negative = payloadIn [ 5 ] ;
int value = bcdHexToUInt ( payloadIn [ 3 ] , payloadIn [ 4 ] ) ;
value = value / 10 ;
if ( negative ) {
value * = ( - 1 * negative ) ;
}
emit haveSpectrumRefLevel ( value ) ;
}
unsigned char rigCommander : : bcdHexToUChar ( unsigned char in )
2018-06-19 12:58:52 -07:00
{
unsigned char out = 0 ;
out = in & 0x0f ;
out + = ( ( in & 0xf0 ) > > 4 ) * 10 ;
return out ;
}
2021-02-15 22:33:21 -08:00
unsigned int rigCommander : : bcdHexToUInt ( unsigned char hundreds , unsigned char tensunits )
{
// convert:
// hex data: 0x41 0x23
// convert to uint:
// uchar: 4123
unsigned char thousands = ( ( hundreds & 0xf0 ) > > 4 ) ;
unsigned int rtnVal ;
rtnVal = ( hundreds & 0x0f ) * 100 ;
rtnVal + = ( ( tensunits & 0xf0 ) > > 4 ) * 10 ;
rtnVal + = ( tensunits & 0x0f ) ;
rtnVal + = thousands * 1000 ;
return rtnVal ;
}
unsigned char rigCommander : : bcdHexToUChar ( unsigned char hundreds , unsigned char tensunits )
2021-02-11 00:33:25 -08:00
{
// convert:
// hex data: 0x01 0x23
// convert to uchar:
// uchar: 123
unsigned char rtnVal ;
rtnVal = ( hundreds & 0x0f ) * 100 ;
rtnVal + = ( ( tensunits & 0xf0 ) > > 4 ) * 10 ;
rtnVal + = ( tensunits & 0x0f ) ;
return rtnVal ;
}
QByteArray rigCommander : : bcdEncodeInt ( unsigned int num )
{
if ( num > 9999 )
{
2021-05-15 18:53:16 +01:00
qInfo ( logRig ( ) ) < < __FUNCTION__ < < " Error, number is too big for four-digit conversion: " < < num ;
2021-02-11 00:33:25 -08:00
return QByteArray ( ) ;
}
char thousands = num / 1000 ;
char hundreds = ( num - ( 1000 * thousands ) ) / 100 ;
char tens = ( num - ( 1000 * thousands ) - ( 100 * hundreds ) ) / 10 ;
char units = ( num - ( 1000 * thousands ) - ( 100 * hundreds ) - ( 10 * tens ) ) ;
char b0 = hundreds | ( thousands < < 4 ) ;
char b1 = units | ( tens < < 4 ) ;
2021-05-15 18:53:16 +01:00
//qInfo(logRig()) << __FUNCTION__ << " encoding value " << num << " as hex:";
2021-02-11 00:33:25 -08:00
//printHex(QByteArray(b0), false, true);
//printHex(QByteArray(b1), false, true);
QByteArray result ;
result . append ( b0 ) . append ( b1 ) ;
return result ;
}
2023-05-12 00:24:01 +01:00
QByteArray rigCommander : : bcdEncodeChar ( unsigned char num )
{
if ( num > 99 )
{
qInfo ( logRig ( ) ) < < __FUNCTION__ < < " Error, number is too big for two-digit conversion: " < < num ;
return QByteArray ( ) ;
}
uchar tens = num / 10 ;
uchar units = num - ( 10 * tens ) ;
uchar b0 = units | ( tens < < 4 ) ;
//qInfo(logRig()) << __FUNCTION__ << " encoding value " << num << " as hex:";
//printHex(QByteArray(b0), false, true);
//printHex(QByteArray(b1), false, true);
QByteArray result ;
result . append ( b0 ) ;
return result ;
}
2023-05-15 10:53:52 +01:00
freqt rigCommander : : parseFrequency ( )
2018-06-19 12:58:52 -07:00
{
2021-03-22 00:11:43 -07:00
freqt freq ;
freq . Hz = 0 ;
freq . MHzDouble = 0 ;
2018-06-19 12:58:52 -07:00
// process payloadIn, which is stripped.
// float frequencyMhz
// payloadIn[04] = ; // XX MHz
// payloadIn[03] = ; // XX0 KHz
// payloadIn[02] = ; // X.X KHz
// payloadIn[01] = ; // . XX KHz
// printHex(payloadIn, false, true);
2023-03-17 23:35:40 +00:00
2021-02-10 17:32:56 +00:00
frequencyMhz = 0.0 ;
2022-01-04 18:34:34 +00:00
if ( payloadIn . length ( ) = = 7 )
2021-02-10 17:32:56 +00:00
{
// 7300 has these digits too, as zeros.
// IC-705 or IC-9700 with higher frequency data available.
2022-01-04 18:34:34 +00:00
frequencyMhz + = 100 * ( payloadIn [ 05 ] & 0x0f ) ;
frequencyMhz + = ( 1000 * ( ( payloadIn [ 05 ] & 0xf0 ) > > 4 ) ) ;
2021-03-22 00:11:43 -07:00
2022-01-04 18:34:34 +00:00
freq . Hz + = ( payloadIn [ 05 ] & 0x0f ) * 1E6 * 100 ;
freq . Hz + = ( ( payloadIn [ 05 ] & 0xf0 ) > > 4 ) * 1E6 * 1000 ;
2021-03-22 00:11:43 -07:00
2021-02-10 17:32:56 +00:00
}
2021-03-22 00:11:43 -07:00
freq . Hz + = ( payloadIn [ 04 ] & 0x0f ) * 1E6 ;
2022-01-04 18:34:34 +00:00
freq . Hz + = ( ( payloadIn [ 04 ] & 0xf0 ) > > 4 ) * 1E6 * 10 ;
2021-03-22 00:11:43 -07:00
2021-02-10 17:32:56 +00:00
frequencyMhz + = payloadIn [ 04 ] & 0x0f ;
2022-01-04 18:34:34 +00:00
frequencyMhz + = 10 * ( ( payloadIn [ 04 ] & 0xf0 ) > > 4 ) ;
2018-06-19 12:58:52 -07:00
2021-03-22 00:11:43 -07:00
// KHz land:
2022-01-04 18:34:34 +00:00
frequencyMhz + = ( ( payloadIn [ 03 ] & 0xf0 ) > > 4 ) / 10.0 ;
2018-06-19 12:58:52 -07:00
frequencyMhz + = ( payloadIn [ 03 ] & 0x0f ) / 100.0 ;
frequencyMhz + = ( ( payloadIn [ 02 ] & 0xf0 ) > > 4 ) / 1000.0 ;
frequencyMhz + = ( payloadIn [ 02 ] & 0x0f ) / 10000.0 ;
2022-01-04 18:34:34 +00:00
frequencyMhz + = ( ( payloadIn [ 01 ] & 0xf0 ) > > 4 ) / 100000.0 ;
frequencyMhz + = ( payloadIn [ 01 ] & 0x0f ) / 1000000.0 ;
2021-03-22 00:11:43 -07:00
freq . Hz + = payloadIn [ 01 ] & 0x0f ;
2022-01-04 18:34:34 +00:00
freq . Hz + = ( ( payloadIn [ 01 ] & 0xf0 ) > > 4 ) * 10 ;
2018-06-19 12:58:52 -07:00
2022-01-04 18:34:34 +00:00
freq . Hz + = ( payloadIn [ 02 ] & 0x0f ) * 100 ;
freq . Hz + = ( ( payloadIn [ 02 ] & 0xf0 ) > > 4 ) * 1000 ;
2021-03-22 00:11:43 -07:00
2022-01-04 18:34:34 +00:00
freq . Hz + = ( payloadIn [ 03 ] & 0x0f ) * 10000 ;
freq . Hz + = ( ( payloadIn [ 03 ] & 0xf0 ) > > 4 ) * 100000 ;
2021-03-22 00:11:43 -07:00
freq . MHzDouble = frequencyMhz ;
2023-05-03 19:19:58 +01:00
2023-05-15 10:53:52 +01:00
return freq ;
2018-06-19 12:58:52 -07:00
}
2023-01-27 21:42:57 -08:00
freqt rigCommander : : parseFrequencyRptOffset ( QByteArray data )
{
2023-01-27 22:11:04 -08:00
// VHF 600 KHz:
2023-01-27 21:42:57 -08:00
// DATA: 0c 00 60 00 fd
// INDEX: 00 01 02 03 04
2023-01-27 22:11:04 -08:00
// UHF 5 MHz:
// DATA: 0c 00 00 05 fd
// INDEX: 00 01 02 03 04
2023-01-27 21:42:57 -08:00
freqt f ;
f . Hz = 0 ;
2023-01-27 22:11:04 -08:00
f . Hz + = ( data [ 3 ] & 0x0f ) * 1E6 ; // 1 MHz
f . Hz + = ( ( data [ 3 ] & 0xf0 ) > > 4 ) * 1E6 * 10 ; // 10 MHz
2023-01-27 21:42:57 -08:00
f . Hz + = ( data [ 2 ] & 0x0f ) * 10E3 ; // 10 KHz
f . Hz + = ( ( data [ 2 ] & 0xf0 ) > > 4 ) * 100E3 ; // 100 KHz
2023-01-27 22:11:04 -08:00
f . Hz + = ( data [ 1 ] & 0x0f ) * 100 ; // 100 Hz
f . Hz + = ( ( data [ 1 ] & 0xf0 ) > > 4 ) * 1000 ; // 1 KHz
2023-04-23 21:29:44 +01:00
f . MHzDouble = f . Hz / 1000000.0 ;
f . VFO = activeVFO ;
2023-01-27 21:42:57 -08:00
return f ;
}
2021-03-22 00:11:43 -07:00
freqt rigCommander : : parseFrequency ( QByteArray data , unsigned char lastPosition )
2018-06-19 12:58:52 -07:00
{
// process payloadIn, which is stripped.
// float frequencyMhz
// payloadIn[04] = ; // XX MHz
// payloadIn[03] = ; // XX0 KHz
// payloadIn[02] = ; // X.X KHz
// payloadIn[01] = ; // . XX KHz
//printHex(data, false, true);
2021-04-11 00:42:25 -07:00
// TODO: Check length of data array prior to reading +/- position
2021-04-25 00:23:52 -07:00
// NOTE: This function was written on the IC-7300, which has no need for 100 MHz and 1 GHz.
// Therefore, this function has to go to position +1 to retrieve those numbers for the IC-9700.
2021-03-22 00:11:43 -07:00
freqt freqs ;
freqs . MHzDouble = 0 ;
freqs . Hz = 0 ;
2023-03-17 23:35:40 +00:00
// Does Frequency contain 100 MHz/1 GHz data?
2021-04-25 00:23:52 -07:00
if ( data . length ( ) > = lastPosition + 1 )
{
freqs . Hz + = ( data [ lastPosition + 1 ] & 0x0f ) * 1E6 * 100 ; // 100 MHz
freqs . Hz + = ( ( data [ lastPosition + 1 ] & 0xf0 ) > > 4 ) * 1E6 * 1000 ; // 1000 MHz
}
2021-03-22 00:11:43 -07:00
2023-03-17 23:35:40 +00:00
// Does Frequency contain VFO data? (\x25 command)
2023-03-18 00:17:33 +00:00
if ( lastPosition - 4 > = 0 & & ( quint8 ) data [ lastPosition - 4 ] < 0x02 )
2023-03-17 23:35:40 +00:00
{
freqs . VFO = ( selVFO_t ) ( quint8 ) data [ lastPosition - 4 ] ;
}
2021-03-22 00:11:43 -07:00
2023-03-17 23:35:40 +00:00
freqs . Hz + = ( data [ lastPosition ] & 0x0f ) * 1E6 ;
freqs . Hz + = ( ( data [ lastPosition ] & 0xf0 ) > > 4 ) * 1E6 * 10 ; // 10 MHz
2018-06-19 12:58:52 -07:00
2021-04-25 00:23:52 -07:00
freqs . Hz + = ( data [ lastPosition - 1 ] & 0x0f ) * 10E3 ; // 10 KHz
freqs . Hz + = ( ( data [ lastPosition - 1 ] & 0xf0 ) > > 4 ) * 100E3 ; // 100 KHz
2021-03-22 00:11:43 -07:00
2021-04-25 00:23:52 -07:00
freqs . Hz + = ( data [ lastPosition - 2 ] & 0x0f ) * 100 ; // 100 Hz
freqs . Hz + = ( ( data [ lastPosition - 2 ] & 0xf0 ) > > 4 ) * 1000 ; // 1 KHz
2021-03-22 00:11:43 -07:00
2021-04-25 00:23:52 -07:00
freqs . Hz + = ( data [ lastPosition - 3 ] & 0x0f ) * 1 ; // 1 Hz
freqs . Hz + = ( ( data [ lastPosition - 3 ] & 0xf0 ) > > 4 ) * 10 ; // 10 Hz
2021-03-22 00:11:43 -07:00
2021-05-01 21:53:05 -07:00
freqs . MHzDouble = ( double ) ( freqs . Hz / 1000000.0 ) ;
2021-03-22 00:11:43 -07:00
return freqs ;
2018-06-19 12:58:52 -07:00
}
2023-05-04 21:55:40 +01:00
quint64 rigCommander : : parseFreqDataToInt ( QByteArray data )
2023-05-03 13:38:06 +01:00
{
2023-05-04 21:55:40 +01:00
// Allow raw data to be parsed. Use a lookup table (pow10) for speed
// Should support VERY large or VERY small numbers!
quint64 val = 0 ;
2023-05-03 13:38:06 +01:00
for ( int i = 0 ; i < data . size ( ) * 2 ; i = i + 2 )
{
2023-05-04 21:55:40 +01:00
val + = ( data [ i / 2 ] & 0x0f ) * pow10 [ i ] ;
val + = ( ( data [ i / 2 ] & 0xf0 ) > > 4 ) * ( pow10 [ i + 1 ] ) ;
2023-05-03 13:38:06 +01:00
}
2023-05-04 21:55:40 +01:00
return val ;
2023-05-03 13:38:06 +01:00
}
2023-05-15 13:47:45 +01:00
modeInfo rigCommander : : parseMode ( quint8 mode , quint8 filter )
2018-06-19 12:58:52 -07:00
{
2023-05-15 13:47:45 +01:00
modeInfo mi ;
2023-05-15 10:53:52 +01:00
bool found = false ;
foreach ( auto & m , rigCaps . modes )
{
if ( m . reg = = mode )
{
2023-05-15 13:47:45 +01:00
mi = modeInfo ( m ) ;
2023-05-15 10:53:52 +01:00
found = true ;
break ;
}
}
if ( ! found )
qInfo ( logRig ( ) ) < < QString ( " parseMode() Couldn't find a matching mode %0 with filter %1 " ) . arg ( mode ) . arg ( filter ) ;
2022-10-28 20:04:14 +01:00
2023-06-05 09:27:37 +01:00
/*
2023-05-15 10:53:52 +01:00
cacheItem item = queue - > getCache ( funcFilterWidth ) ;
2023-05-24 19:50:01 +01:00
if ( item . value . isValid ( ) ) {
mi . pass = item . value . toInt ( ) ;
}
else
{
2023-06-05 09:27:37 +01:00
*/
2023-05-03 19:19:58 +01:00
/* We haven't got a valid passband from the rig so we
2022-10-28 20:04:14 +01:00
need to create a ' fake ' one from default values
This will be replaced with a valid one if we get it */
2023-05-15 10:53:52 +01:00
if ( mi . mk = = modeCW | | mi . mk = = modeCW_R | | mi . mk = = modePSK | | mi . mk = = modePSK_R ) {
2022-10-28 20:04:14 +01:00
switch ( filter ) {
case 1 :
2023-05-15 10:53:52 +01:00
mi . pass = 1200 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
case 2 :
2023-05-15 10:53:52 +01:00
mi . pass = 500 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
case 3 :
2023-05-15 10:53:52 +01:00
mi . pass = 250 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
}
}
2023-05-15 10:53:52 +01:00
else if ( mi . mk = = modeRTTY | | mi . mk = = modeRTTY_R )
2022-10-28 20:04:14 +01:00
{
switch ( filter ) {
case 1 :
2023-05-15 10:53:52 +01:00
mi . pass = 2400 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
case 2 :
2023-05-15 10:53:52 +01:00
mi . pass = 500 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
case 3 :
2023-05-15 10:53:52 +01:00
mi . pass = 250 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
}
}
2023-05-15 10:53:52 +01:00
else if ( mi . mk = = modeAM )
2022-10-28 20:04:14 +01:00
{
switch ( filter ) {
case 1 :
2023-05-15 10:53:52 +01:00
mi . pass = 9000 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
case 2 :
2023-05-15 10:53:52 +01:00
mi . pass = 6000 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
case 3 :
2023-05-15 10:53:52 +01:00
mi . pass = 3000 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
}
}
2023-05-15 10:53:52 +01:00
else if ( mi . mk = = modeFM )
2022-10-28 20:04:14 +01:00
{
switch ( filter ) {
case 1 :
2023-05-15 10:53:52 +01:00
mi . pass = 15000 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
case 2 :
2023-05-15 10:53:52 +01:00
mi . pass = 10000 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
case 3 :
2023-05-15 10:53:52 +01:00
mi . pass = 7000 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
}
}
else { // SSB or unknown mode
switch ( filter ) {
case 1 :
2023-05-15 10:53:52 +01:00
mi . pass = 3000 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
case 2 :
2023-05-15 10:53:52 +01:00
mi . pass = 2400 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
case 3 :
2023-05-15 10:53:52 +01:00
mi . pass = 1800 ;
2022-10-31 13:33:47 +00:00
break ;
2022-10-28 20:04:14 +01:00
}
}
2023-06-05 09:27:37 +01:00
//}
2023-05-15 10:53:52 +01:00
return mi ;
2018-06-19 12:58:52 -07:00
}
2018-11-16 22:19:44 -08:00
void rigCommander : : startATU ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcTunerStatus , payload ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( 0x02 ) ) ;
prepDataAndSend ( payload ) ;
}
2018-11-16 22:19:44 -08:00
}
2018-11-16 23:13:59 -08:00
void rigCommander : : setATU ( bool enabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcTunerStatus , payload , static_cast < int > ( enabled ) ) )
2018-11-16 23:13:59 -08:00
{
2023-04-23 21:29:44 +01:00
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
prepDataAndSend ( payload ) ;
2018-11-16 23:13:59 -08:00
}
}
void rigCommander : : getATUStatus ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcTunerStatus , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2018-11-16 23:13:59 -08:00
}
2021-04-07 23:35:24 -07:00
void rigCommander : : getAttenuator ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcAttenuator , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2021-04-07 23:35:24 -07:00
}
void rigCommander : : getPreamp ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcPreamp , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2021-04-07 23:35:24 -07:00
}
void rigCommander : : getAntenna ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcAntenna , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2021-04-07 23:35:24 -07:00
}
void rigCommander : : setAttenuator ( unsigned char att )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcAttenuator , payload , att ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( att ) ;
prepDataAndSend ( payload ) ;
}
2021-04-07 23:35:24 -07:00
}
void rigCommander : : setPreamp ( unsigned char pre )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-25 15:56:28 +01:00
if ( getCommand ( funcPreamp , payload , pre ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( pre ) ;
prepDataAndSend ( payload ) ;
}
2021-04-07 23:35:24 -07:00
}
2021-07-16 17:08:55 +01:00
void rigCommander : : setAntenna ( unsigned char ant , bool rx )
2021-04-07 23:35:24 -07:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcAntenna , payload , ant ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( ant ) ;
if ( rigCaps . commands . contains ( funcRXAntenna ) ) {
payload . append ( static_cast < unsigned char > ( rx ) ) ; // 0x00 = use for TX and RX
}
prepDataAndSend ( payload ) ;
2021-09-22 10:39:35 +01:00
}
2021-04-07 23:35:24 -07:00
}
2023-04-15 20:13:20 +01:00
void rigCommander : : setNB ( bool enabled ) {
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcNoiseBlanker , payload , static_cast < int > ( enabled ) ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
2023-04-15 20:13:20 +01:00
void rigCommander : : getNB ( )
2022-01-04 18:34:34 +00:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcNoiseBlanker , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
2023-04-15 20:13:20 +01:00
void rigCommander : : setNR ( bool enabled ) {
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcNoiseReduction , payload , static_cast < int > ( enabled ) ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
2023-04-15 20:13:20 +01:00
void rigCommander : : getNR ( )
2022-01-04 18:34:34 +00:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcNoiseReduction , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : setAutoNotch ( bool enabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcAutoNotch , payload , static_cast < int > ( enabled ) ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : getAutoNotch ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcAutoNotch , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : setToneEnabled ( bool enabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-27 16:39:51 +01:00
if ( getCommand ( funcRepeaterTone , payload , static_cast < int > ( enabled ) ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : getToneEnabled ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-27 16:39:51 +01:00
if ( getCommand ( funcRepeaterTone , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : setToneSql ( bool enabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-27 16:39:51 +01:00
if ( getCommand ( funcRepeaterTSQL , payload , static_cast < int > ( enabled ) ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
2023-01-31 18:00:12 -08:00
void rigCommander : : getToneSqlEnabled ( )
2022-01-04 18:34:34 +00:00
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-27 16:39:51 +01:00
if ( getCommand ( funcRepeaterTSQL , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : setCompressor ( bool enabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcCompressor , payload , static_cast < int > ( enabled ) ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : getCompressor ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcCompressor , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : setMonitor ( bool enabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcMonitor , payload , static_cast < int > ( enabled ) ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : getMonitor ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcMonitor , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : setVox ( bool enabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcVox , payload , static_cast < int > ( enabled ) ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : getVox ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcVox , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
2023-04-25 08:56:06 +01:00
void rigCommander : : setBreakIn ( unsigned char type )
{
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcBreakIn , payload , type ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( type ) ;
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : getBreakIn ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcBreakIn , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
2023-01-20 22:11:30 -08:00
void rigCommander : : setKeySpeed ( unsigned char wpm )
{
// 0 = 6 WPM
// 255 = 48 WPM
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcKeySpeed , payload , wpm ) )
2023-04-23 21:29:44 +01:00
{
unsigned char wpmRadioSend = round ( ( wpm - 6 ) * ( 6.071 ) ) ;
payload . append ( bcdEncodeInt ( wpmRadioSend ) ) ;
prepDataAndSend ( payload ) ;
}
2023-01-20 22:11:30 -08:00
}
2023-01-20 23:23:47 -08:00
void rigCommander : : getKeySpeed ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcKeySpeed , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2023-01-20 23:23:47 -08:00
}
2022-01-04 18:34:34 +00:00
void rigCommander : : setManualNotch ( bool enabled )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcManualNotch , payload , static_cast < int > ( enabled ) ) )
2023-04-23 21:29:44 +01:00
{
payload . append ( static_cast < unsigned char > ( enabled ) ) ;
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
void rigCommander : : getManualNotch ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
if ( getCommand ( funcManualNotch , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
}
2022-01-04 18:34:34 +00:00
}
2018-11-19 23:42:34 -08:00
void rigCommander : : getRigID ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
2023-04-26 18:41:38 +01:00
if ( getCommand ( funcTransceiverId , payload ) )
2023-04-23 21:29:44 +01:00
{
prepDataAndSend ( payload ) ;
} else {
// If we haven't got this command yet, need to use the default one!
QByteArray payload = " \x19 \x00 " ;
prepDataAndSend ( payload ) ;
}
2018-11-19 23:42:34 -08:00
}
2021-11-06 23:59:03 -07:00
void rigCommander : : setRigID ( unsigned char rigID )
{
// This function overrides radio model detection.
// It can be used for radios without Rig ID commands,
// or to force a specific radio model
2022-11-23 22:45:29 -08:00
qInfo ( logRig ( ) ) < < " Setting rig ID to: (int) " < < ( int ) rigID ;
2021-11-06 23:59:03 -07:00
lookingForRig = true ;
foundRig = false ;
2021-11-07 00:24:08 -07:00
// needed because this is a fake message and thus the value is uninitialized
// this->civAddr comes from how rigCommander is setup and should be accurate.
this - > incomingCIVAddr = this - > civAddr ;
2023-05-24 19:50:01 +01:00
if ( rigList . contains ( rigID ) ) this - > model = rigID ;
2021-11-06 23:59:03 -07:00
rigCaps . modelID = rigID ;
2023-05-24 19:50:01 +01:00
rigCaps . model = this - > model ;
2021-11-06 23:59:03 -07:00
determineRigCaps ( ) ;
2023-05-24 19:50:01 +01:00
//this->model = determineRadioModel(rigID);
//rigCaps.model = determineRadioModel(rigID);
2021-11-06 23:59:03 -07:00
}
2021-02-27 00:37:00 +00:00
void rigCommander : : changeLatency ( const quint16 value )
2021-02-10 17:32:56 +00:00
{
2021-02-27 00:37:00 +00:00
emit haveChangeLatency ( value ) ;
2021-02-10 17:32:56 +00:00
}
2019-02-01 12:21:54 -08:00
void rigCommander : : sayAll ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char cmd = 0x0 ;
if ( getCommand ( funcSpeech , payload , cmd ) )
2023-04-23 21:29:44 +01:00
{
2023-04-25 08:56:06 +01:00
payload . append ( cmd ) ;
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2019-02-01 12:21:54 -08:00
}
2018-11-19 23:42:34 -08:00
2019-02-01 12:21:54 -08:00
void rigCommander : : sayFrequency ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char cmd = 0x1 ;
if ( getCommand ( funcSpeech , payload , cmd ) )
2023-04-23 21:29:44 +01:00
{
2023-04-25 08:56:06 +01:00
payload . append ( cmd ) ;
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2019-02-01 12:21:54 -08:00
}
2018-11-19 23:42:34 -08:00
2019-02-01 12:21:54 -08:00
void rigCommander : : sayMode ( )
{
2023-04-25 08:56:06 +01:00
QByteArray payload ;
unsigned char cmd = 0x2 ;
if ( getCommand ( funcSpeech , payload , cmd ) )
2023-04-23 21:29:44 +01:00
{
2023-04-25 08:56:06 +01:00
payload . append ( cmd ) ;
2023-04-23 21:29:44 +01:00
prepDataAndSend ( payload ) ;
}
2019-02-01 12:21:54 -08:00
}
2018-11-19 23:42:34 -08:00
// Other:
2018-06-19 12:58:52 -07:00
QByteArray rigCommander : : stripData ( const QByteArray & data , unsigned char cutPosition )
{
QByteArray rtndata ;
if ( data . length ( ) < cutPosition )
{
return rtndata ;
}
rtndata = data . right ( cutPosition ) ;
return rtndata ;
}
2022-01-21 19:23:32 +00:00
void rigCommander : : radioSelection ( QList < radio_cap_packet > radios )
{
emit requestRadioSelection ( radios ) ;
}
2022-01-23 17:54:40 +00:00
void rigCommander : : radioUsage ( quint8 radio , quint8 busy , QString user , QString ip ) {
2022-01-21 23:58:18 +00:00
emit setRadioUsage ( radio , busy , user , ip ) ;
2022-01-21 19:23:32 +00:00
}
2022-01-23 17:54:40 +00:00
void rigCommander : : setCurrentRadio ( quint8 radio ) {
2022-01-21 23:58:18 +00:00
emit selectedRadio ( radio ) ;
}
2022-01-21 19:23:32 +00:00
2021-08-04 20:49:32 +01:00
2018-06-19 12:58:52 -07:00
void rigCommander : : getDebug ( )
{
// generic debug function for development.
emit getMoreDebug ( ) ;
}
2021-02-17 00:00:28 -08:00
void rigCommander : : printHex ( const QByteArray & pdata )
{
printHex ( pdata , false , true ) ;
}
2018-06-19 12:58:52 -07:00
void rigCommander : : printHex ( const QByteArray & pdata , bool printVert , bool printHoriz )
{
2021-02-23 21:21:22 +00:00
qDebug ( logRig ( ) ) < < " ---- Begin hex dump -----: " ;
2018-06-19 12:58:52 -07:00
QString sdata ( " DATA: " ) ;
QString index ( " INDEX: " ) ;
QStringList strings ;
for ( int i = 0 ; i < pdata . length ( ) ; i + + )
{
strings < < QString ( " [%1]: %2 " ) . arg ( i , 8 , 10 , QChar ( ' 0 ' ) ) . arg ( ( unsigned char ) pdata [ i ] , 2 , 16 , QChar ( ' 0 ' ) ) ;
sdata . append ( QString ( " %1 " ) . arg ( ( unsigned char ) pdata [ i ] , 2 , 16 , QChar ( ' 0 ' ) ) ) ;
index . append ( QString ( " %1 " ) . arg ( i , 2 , 10 , QChar ( ' 0 ' ) ) ) ;
}
if ( printVert )
{
for ( int i = 0 ; i < strings . length ( ) ; i + + )
{
//sdata = QString(strings.at(i));
2021-02-23 21:21:22 +00:00
qDebug ( logRig ( ) ) < < strings . at ( i ) ;
2018-06-19 12:58:52 -07:00
}
}
if ( printHoriz )
{
2021-02-23 21:21:22 +00:00
qDebug ( logRig ( ) ) < < index ;
qDebug ( logRig ( ) ) < < sdata ;
2018-06-19 12:58:52 -07:00
}
2021-02-23 21:21:22 +00:00
qDebug ( logRig ( ) ) < < " ----- End hex dump ----- " ;
2018-06-19 12:58:52 -07:00
}
2021-02-18 09:14:41 +00:00
void rigCommander : : dataFromServer ( QByteArray data )
{
2022-04-20 13:35:23 +01:00
//qInfo(logRig()) << "***************** emit dataForComm()" << data;
2021-02-18 09:14:41 +00:00
emit dataForComm ( data ) ;
}
2022-01-26 09:49:52 +00:00
quint8 * rigCommander : : getGUID ( ) {
return guid ;
}
2018-06-19 12:58:52 -07:00
2023-05-12 00:24:01 +01:00
uchar rigCommander : : makeFilterWidth ( ushort pass )
{
2023-05-27 20:26:53 +01:00
Q_UNUSED ( pass )
return 0U ;
2023-05-12 00:24:01 +01:00
}
2023-06-05 09:27:37 +01:00
void rigCommander : : receiveCommand ( funcs func , QVariant value , bool sub )
2023-05-12 00:24:01 +01:00
{
//qInfo() << "Got command:" << funcString[func];
int val = INT_MIN ;
2023-05-24 19:50:01 +01:00
if ( value . isValid ( ) & & value . canConvert < int > ( ) ) {
// Used to validate payload, otherwise ignore.
val = value . value < int > ( ) ;
2023-05-12 00:24:01 +01:00
//qInfo(logRig()) << "Got value" << QString(value.typeName());
2023-05-26 19:11:36 +01:00
if ( func = = funcMemoryContents | | func = = funcMemoryClear | | func = = funcMemoryWrite | | func = = funcMemoryMode )
2023-05-24 19:50:01 +01:00
{
// Strip out group number from memory for validation purposes.
val = val & 0xffff ;
}
}
if ( func = = funcSendCW )
{
val = value . value < QString > ( ) . length ( ) ;
}
if ( func = = funcAfGain & & value . isValid ( ) & & udp ! = Q_NULLPTR ) {
// Ignore the AF Gain command, just queue it for processing
emit haveSetVolume ( static_cast < uchar > ( value . toInt ( ) ) ) ;
2023-05-25 23:17:54 +01:00
queue - > receiveValue ( func , value , false ) ;
2023-05-24 19:50:01 +01:00
return ;
2023-05-12 00:24:01 +01:00
}
2023-05-24 19:50:01 +01:00
// Need to work out what to do with older dual-VFO rigs.
if ( ( func = = funcSelectedFreq | | func = = funcUnselectedFreq ) & & ! rigCaps . commands . contains ( func ) )
{
if ( value . isValid ( ) )
func = funcFreqSet ;
else
func = funcFreqGet ;
} else if ( ( func = = funcSelectedMode | | func = = funcUnselectedMode ) & & ! rigCaps . commands . contains ( func ) )
{
if ( value . isValid ( ) )
func = funcModeSet ;
else
func = funcModeGet ;
} else if ( func = = funcSelectVFO ) {
2023-05-12 00:24:01 +01:00
// Special command
vfo_t vfo = value . value < vfo_t > ( ) ;
func = ( vfo = = vfoA ) ? funcVFOASelect : ( vfo = = vfoB ) ? funcVFOBSelect : ( vfo = = vfoMain ) ? funcVFOMainSelect : funcVFOSubSelect ;
value . clear ( ) ;
2023-05-24 19:50:01 +01:00
val = INT_MIN ;
2023-05-12 00:24:01 +01:00
}
QByteArray payload ;
2023-06-05 09:27:37 +01:00
if ( getCommand ( func , payload , val , sub ) )
2023-05-12 00:24:01 +01:00
{
if ( value . isValid ( ) )
{
if ( ! strcmp ( value . typeName ( ) , " bool " ) )
{
payload . append ( value . value < bool > ( ) ) ;
}
2023-05-25 23:17:54 +01:00
else if ( ! strcmp ( value . typeName ( ) , " QString " ) )
2023-05-24 19:50:01 +01:00
{
QString text = value . value < QString > ( ) ;
if ( pttAllowed & & func = = funcSendCW )
{
QByteArray textData = text . toLocal8Bit ( ) ;
unsigned char p = 0 ;
for ( int c = 0 ; c < textData . length ( ) ; c + + )
{
p = textData . at ( c ) ;
if ( ( ( p > = 0x30 ) & & ( p < = 0x39 ) ) | |
( ( p > = 0x41 ) & & ( p < = 0x5A ) ) | |
( ( p > = 0x61 ) & & ( p < = 0x7A ) ) | |
( p = = 0x2F ) | | ( p = = 0x3F ) | | ( p = = 0x2E ) | |
( p = = 0x2D ) | | ( p = = 0x2C ) | | ( p = = 0x3A ) | |
( p = = 0x27 ) | | ( p = = 0x28 ) | | ( p = = 0x29 ) | |
( p = = 0x3D ) | | ( p = = 0x2B ) | | ( p = = 0x22 ) | |
( p = = 0x40 ) | | ( p = = 0x20 ) )
{
// Allowed character, continue
} else {
qWarning ( logRig ( ) ) < < " Invalid character detected in CW message at position " < < c < < " , the character is " < < text . at ( c ) ;
textData [ c ] = 0x3F ; // "?"
}
}
payload . append ( textData ) ;
}
}
2023-05-12 00:24:01 +01:00
else if ( ! strcmp ( value . typeName ( ) , " uchar " ) )
{
2023-05-27 20:26:53 +01:00
payload . append ( value . value < uchar > ( ) ) ;
2023-05-12 00:24:01 +01:00
}
else if ( ! strcmp ( value . typeName ( ) , " ushort " ) )
{
if ( func = = funcFilterWidth )
payload . append ( makeFilterWidth ( value . value < ushort > ( ) ) ) ;
else
payload . append ( bcdEncodeInt ( value . value < ushort > ( ) ) ) ;
}
2023-05-24 19:50:01 +01:00
else if ( ! strcmp ( value . typeName ( ) , " short " ) )
{
// Currently only used for RIT (I think)
bool isNegative = false ;
short val = value . value < short > ( ) ;
qInfo ( ) < < " Setting rit to " < < val ;
if ( val < 0 )
{
isNegative = true ;
val * = - 1 ;
}
freqt f ;
QByteArray freqBytes ;
f . Hz = val ;
freqBytes = makeFreqPayload ( f ) ;
freqBytes . truncate ( 2 ) ;
payload . append ( freqBytes ) ;
payload . append ( QByteArray ( 1 , ( char ) isNegative ) ) ;
}
2023-05-12 00:24:01 +01:00
else if ( ! strcmp ( value . typeName ( ) , " uint " ) & & ( func = = funcMemoryContents | | func = = funcMemoryMode ) )
{
// Format is different for all radios!
foreach ( auto parse , rigCaps . memParser ) {
// If "a" exists, break out of the loop as soon as we have the value.
if ( parse . spec = = ' a ' ) {
if ( parse . len = = 1 ) {
payload . append ( bcdEncodeChar ( value . value < uint > ( ) > > 16 & 0xff ) ) ;
}
else if ( parse . len = = 2 )
{
payload . append ( bcdEncodeInt ( value . value < uint > ( ) > > 16 & 0xffff ) ) ;
}
break ;
}
}
payload . append ( bcdEncodeInt ( value . value < uint > ( ) & 0xffff ) ) ;
}
2023-05-15 13:47:45 +01:00
else if ( ! strcmp ( value . typeName ( ) , " modeInfo " ) )
2023-05-12 00:24:01 +01:00
{
if ( func = = funcDataModeWithFilter )
{
2023-05-15 13:47:45 +01:00
payload . append ( value . value < modeInfo > ( ) . data ) ;
if ( value . value < modeInfo > ( ) . data ! = 0 )
payload . append ( value . value < modeInfo > ( ) . filter ) ;
2023-05-12 00:24:01 +01:00
} else {
2023-05-15 13:47:45 +01:00
payload . append ( value . value < modeInfo > ( ) . reg ) ;
2023-05-15 10:53:52 +01:00
if ( func = = funcSelectedMode | | func = = funcUnselectedMode )
2023-05-15 13:47:45 +01:00
payload . append ( value . value < modeInfo > ( ) . data ) ;
payload . append ( value . value < modeInfo > ( ) . filter ) ;
2023-05-12 00:24:01 +01:00
}
}
else if ( ! strcmp ( value . typeName ( ) , " freqt " ) )
{
if ( func = = funcSendFreqOffset ) {
payload . append ( makeFreqPayload ( value . value < freqt > ( ) ) . mid ( 1 , 3 ) ) ;
} else {
payload . append ( makeFreqPayload ( value . value < freqt > ( ) ) ) ;
}
}
2023-05-15 10:53:52 +01:00
else if ( ! strcmp ( value . typeName ( ) , " antennaInfo " ) )
{
payload . append ( value . value < antennaInfo > ( ) . antenna ) ;
2023-05-24 19:50:01 +01:00
if ( rigCaps . commands . contains ( funcRXAntenna ) )
payload . append ( value . value < antennaInfo > ( ) . rx ) ;
2023-05-15 10:53:52 +01:00
}
else if ( ! strcmp ( value . typeName ( ) , " rigInput " ) )
{
payload . append ( bcdEncodeChar ( value . value < rigInput > ( ) . reg ) ) ;
}
else if ( ! strcmp ( value . typeName ( ) , " memoryType " ) )
{
payload . append ( setMemory ( value . value < memoryType > ( ) ) ) ;
}
2023-05-24 19:50:01 +01:00
else if ( ! strcmp ( value . typeName ( ) , " spectrumBounds " ) )
{
spectrumBounds s = value . value < spectrumBounds > ( ) ;
uchar range = 1 ;
for ( bandType band : rigCaps . bands )
{
if ( band . range ! = 0.0 & & s . start > band . range )
range + + ;
}
payload . append ( range ) ;
payload . append ( s . edge ) ;
payload . append ( makeFreqPayload ( s . start ) ) ;
payload . append ( makeFreqPayload ( s . end ) ) ;
qInfo ( ) < < " Bounds " < < range < < s . edge < < s . start < < s . end < < payload . toHex ( ) ;
}
else if ( ! strcmp ( value . typeName ( ) , " duplexMode_t " ) )
{
payload . append ( static_cast < uchar > ( value . value < duplexMode_t > ( ) ) ) ;
}
else if ( ! strcmp ( value . typeName ( ) , " spectrumMode_t " ) )
{
payload . append ( static_cast < uchar > ( value . value < spectrumMode_t > ( ) ) ) ;
}
else if ( ! strcmp ( value . typeName ( ) , " centerSpanData " ) )
{
centerSpanData span = value . value < centerSpanData > ( ) ;
double freq = double ( span . freq / 1000000.0 ) ;
payload . append ( makeFreqPayload ( freq ) ) ;
}
else if ( ! strcmp ( value . typeName ( ) , " toneInfo " ) )
{
toneInfo t = value . value < toneInfo > ( ) ;
payload . append ( encodeTone ( t . tone , t . tinv , t . rinv ) ) ;
}
2023-05-26 18:38:40 +01:00
else if ( ! strcmp ( value . typeName ( ) , " bandStackType " ) )
{
bandStackType bsr = value . value < bandStackType > ( ) ;
payload . append ( bsr . band ) ;
payload . append ( bsr . regCode ) ; // [01...03]. 01 = latest, 03 = oldest
}
2023-05-12 00:24:01 +01:00
else
{
qInfo ( logRig ( ) ) < < " Got unknown value type " < < QString ( value . typeName ( ) ) ;
2023-05-24 19:50:01 +01:00
return ;
2023-05-12 00:24:01 +01:00
}
2023-05-24 19:50:01 +01:00
// This was a set command, so queue a get straight after to retrieve the updated value
// will fail on some commands so they would need to be added here:
2023-05-27 20:26:53 +01:00
if ( func ! = funcScopeFixedEdgeFreq & & func ! = funcSpeech & & func ! = funcBandStackReg )
2023-05-24 19:50:01 +01:00
queue - > addUnique ( priorityImmediate , func ) ;
2023-05-12 00:24:01 +01:00
}
prepDataAndSend ( payload ) ;
}
else
{
2023-05-24 19:50:01 +01:00
qDebug ( logRig ( ) ) < < " cachingQueue(): unimplemented command " < < funcString [ func ] ;
2023-05-12 00:24:01 +01:00
}
}
2018-06-19 12:58:52 -07:00