From 054ffd593751e2681b962f3382c26b64fc2bb65f Mon Sep 17 00:00:00 2001 From: kk4das <66222670+kk4das@users.noreply.github.com> Date: Tue, 24 Jan 2023 22:11:39 -0500 Subject: [PATCH] V1.3 - Added support for all IC-746 modes and frequencies 100MHz and greater --- .development | 0 IC746.cpp | 72 ++++++++++++++++++++++++++++++++-------------- IC746.h | 26 ++++++++++------- IC746CAT.ino | 10 +++++++ README.md | 7 +++++ library.properties | 4 +-- 6 files changed, 85 insertions(+), 34 deletions(-) create mode 100644 .development create mode 100644 IC746CAT.ino diff --git a/.development b/.development new file mode 100644 index 0000000..e69de29 diff --git a/IC746.cpp b/IC746.cpp index 7902d02..b38d72c 100644 --- a/IC746.cpp +++ b/IC746.cpp @@ -1,9 +1,16 @@ - /************************************************************************* +/************************************************************************* IC746 CAT Library, by KK4DAS, Dean Souleles - V1.0.2 12/17/2021 - - Send NACK on receipt of undocumented commands / fix for latest WSJTX Hamlib - - V1.0.1 2/3/2021 + V1.3 1/21/2023 + - Included all defined modes in Get/Set Mode (thanks to Mike, KA4CDN) + - Fix to allow frequencies greater than 100MHz -(thanks to Bob, KA1GT) + + V1.2 10/22/2021 + - Fixes bug that caused "WSJTX Rig Control Error" for versions after 2.2.2 + - The problem was caused by an unsupported CIV command being sent by WSJTX + - This fix responds to unimplemented commands with a NACK instead of an ACK + - Bug was reported on the WSJTX groups board. + + V1.1 2/3/2021 - various fixes, now works properly with OmniRig and flrig - smeter now returns proper BCD code - calibrated to emulate ICOM responses @@ -36,10 +43,11 @@ #define DEBUG_CAT_DETAIL //#define DEBUG_CAT_SMETER #include -SoftwareSerial catDebug(6, 7); // RX, TX +SoftwareSerial catDebug(11,12); // RX, TX String dbg; #endif +//extern void displayBanner(String s); // User supplied calback function work variables, must be static static FuncPtrBoolean catSplit; @@ -107,8 +115,8 @@ static FuncPtrVoid catSwapVfo; */ void IC746::begin() { Serial.begin(9600, SERIAL_8N2); - while (!Serial);; - Serial.flush(); +// while (!Serial);; +// Serial.flush(); #ifdef DEBUG_CAT catDebug.begin(9600); @@ -127,11 +135,15 @@ void IC746::begin(long br, int mode) { SERIAL_7O1; SERIAL_8O1; SERIAL_5O2; SERIAL_6O2; SERIAL_7O2; SERIAL_8O2 */ Serial.begin(br, mode); - Serial.flush(); + // Serial.flush(); #ifdef DEBUG_CAT catDebug.begin(9600); dbg = "CAT Debug Ready"; catDebug.println(dbg.c_str()); + delay(1000); + catDebug.println(dbg.c_str()); + catDebug.println(dbg.c_str()); + catDebug.println(dbg.c_str()); #endif } @@ -240,7 +252,7 @@ void IC746::sendResponse(byte *buf, int len) { // sendAck() - send back hard-code acknowledge message // void IC746::sendAck() { - byte ack[] = {CAT_CTRL_ADDR, CAT_RIG_ADDR, CAT_ACK}; + byte ack[] = {CAT_RIG_ADDR, CAT_CTRL_ADDR, CAT_ACK}; send(ack, 3); } @@ -248,7 +260,8 @@ void IC746::sendAck() { // sendNack() - send back hard-code negative-acknowledge message // void IC746::sendNack() { - byte nack[] = {CAT_CTRL_ADDR, CAT_RIG_ADDR, CAT_NACK}; + byte nack[] = {CAT_RIG_ADDR, CAT_CTRL_ADDR, CAT_NACK}; +// displayBanner(String("Nack")); send(nack, 3); } @@ -500,6 +513,7 @@ void IC746::doSetFreq() { /////////////////////////////////////////////////////////////////////////////////////////////////////// void IC746::doReadFreq() { if (catGetFreq) { +// displayBanner(String("Read Freq")); FreqtoBCD(catGetFreq()); // get the frequency, convert to BCD and stuff it in the response buffer sendResponse(cmdBuf, CAT_SZ_FREQ); } @@ -507,16 +521,22 @@ void IC746::doReadFreq() { /////////////////////////////////////////////////////////////////////////////////////////////////////// // doSetMode() - process the CAT_SET_MODE command -// Call the user function to put the rig into the requested mode. Only USB or LSB are supported. +// Call the user function to put the rig into the requested mode. +// The rig must handle all of the possible modes +// CAT_MODE_LSB +// CAT_MODE_USB +// CAT_MODE_AM: +// CAT_MODE_CW - (LSB) +// CAT_MODE_RTTY - (LSB) +// CAT_MODE_FM +// CAT_MODE_CW_R - (Reverse - USB) +// CAT_MODE_RTTY_R - (Reverse - LSB) /////////////////////////////////////////////////////////////////////////////////////////////////////// void IC746::doSetMode() { if (catSetMode) { - switch (cmdBuf[CAT_IX_SUB_CMD]) { - case CAT_MODE_LSB: - case CAT_MODE_USB: - catSetMode(cmdBuf[CAT_IX_SUB_CMD]); - break; - } + + catSetMode(cmdBuf[CAT_IX_SUB_CMD]); + } sendAck(); } @@ -702,8 +722,12 @@ void IC746::check() { default: // For all other commands respond with an NACK #ifdef DEBUG_CAT + String dbg; dbg = "unimp cmd: "; dbg += String(cmdBuf[CAT_IX_CMD], HEX); + dbg += " "; + dbg += String(cmdBuf[CAT_IX_SUB_CMD], HEX); +// displayBanner(dbg); catDebug.println(dbg.c_str()); #endif sendNack(); @@ -737,12 +761,15 @@ long IC746::BCDtoFreq() { freq += 100000L * (cmdBuf[CAT_IX_FREQ + 2] >> 4); freq += 1000000L * (cmdBuf[CAT_IX_FREQ + 3] & 0xf); freq += 10000000L * (cmdBuf[CAT_IX_FREQ + 3] >> 4); + freq += 100000000L * (cmdBuf[CAT_IX_FREQ + 4] & 0xf); + freq += 1000000000L * (cmdBuf[CAT_IX_FREQ + 4] >> 4); + return freq; } void IC746::FreqtoBCD(long freq) { - byte ones, tens, hund, thou, ten_thou, hund_thou, mil, ten_mil; + byte ones, tens, hund, thou, ten_thou, hund_thou, mil, ten_mil, hund_mil, thou_mil; ones = byte(freq % 10); tens = byte((freq / 10L) % 10); @@ -757,11 +784,12 @@ void IC746::FreqtoBCD(long freq) { cmdBuf[CAT_IX_FREQ + 2] = byte((hund_thou << 4)) | ten_thou; mil = byte((freq / 1000000L) % 10); - ten_mil = byte(freq / 10000000L); + ten_mil = byte(freq / 10000000L) % 10; cmdBuf[CAT_IX_FREQ + 3] = byte((ten_mil << 4)) | mil; - cmdBuf[CAT_IX_FREQ + 4] = 0; // fixed - + hund_mil = byte((freq / 100000000L) % 10); + thou_mil = byte(freq / 1000000000L % 10); // Allow frequencies up to 9999.999999 MHz to be enterd + cmdBuf[CAT_IX_FREQ + 4] = byte((thou_mil << 4)) | hund_mil; } void IC746::SmetertoBCD(byte s) { diff --git a/IC746.h b/IC746.h index 373669f..e5493b1 100644 --- a/IC746.h +++ b/IC746.h @@ -1,9 +1,14 @@ /************************************************************************* IC746 CAT Library, by KK4DAS, Dean Souleles - V1.0.2 12/17/2021 - - Send NACK on undocmented command / fix for lates WSJTX hamlib - - V1.0.1 2/3/2021 + V1.3 1/24/2023 + - Added support for frequencies 100MHz and above. + - Added support for setting and getting all IC-746 defined MODES + + V1.2 + - Fixes bug that caused WSJTX not to connect. Sends NACK on all unsupported + - commands. (Requires lastes hamlib build with WSJTX) + + V1.1 2/3/2021 - various fixes, now works properly with OmniRig and flrig - smeter now returns proper BCD code - calibrated to emulate ICOM responses @@ -84,12 +89,13 @@ // Mode Subcommand #define CAT_MODE_LSB 0x00 #define CAT_MODE_USB 0x01 -#define CAT_MODE_AM 0x02 // Not implemented -#define CAT_MODE_CW 0x03 // Not implemented -#define CAT_MODE_RTTY 0x04 // Not implemented -#define CAT_MODE_FM 0x05 // Not implemented -#define CAT_MODE_CW_R 0x06 // Not implemented -#define CAT_MODE_RTTY_R 0x07 // Not implemented +#define CAT_MODE_AM 0x02 +#define CAT_MODE_CW 0x03 // LSB CW +#define CAT_MODE_RTTY 0x04 // LSB RTTY +#define CAT_MODE_FM 0x05 +#define CAT_MODE_CW_R 0x07 // Reverse CW - USB +#define CAT_MODE_RTTY_R 0x08 // Reverse RTTY - USB + #define CAT_MODE_FILTER1 0x01 // Required for "read mode" // VFO Subcommand diff --git a/IC746CAT.ino b/IC746CAT.ino new file mode 100644 index 0000000..71ba133 --- /dev/null +++ b/IC746CAT.ino @@ -0,0 +1,10 @@ +// Dummy Sketch to allow editing of Nextion Lbrary files in the IDE +#include "IC746.h" + +void setup() { + +} + +void loop() { + +} diff --git a/README.md b/README.md index f8a274f..eb5ee6c 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,13 @@ So far we have tested support for the following CAT capable software: If you use find this library does not work with any particular CAT enabled software please let me know via the "Issues" tab on Github. +## Release Notes ## +Version 1.3 1/24/2023 - support for frequencies 100MHz and above. Support for setting and getting all defined IC746 modes. + +Version 1.2 - Corrects bug that was causing new version of WSJTX not to connect. Sends NACK on all unsupported commands, + +Version 1.0 - Initial release. + ## Known limitations ## Split frequency handling in WSJTX does not work as expected. The work-around is to configure WSJTX Split for either NONE or "Fake it". Split functionality has been tested and works as expected using CatBkt. diff --git a/library.properties b/library.properties index 950e638..8f34687 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ name=ICOM 746 CAT Control -version=1.0.2 +version=1.3.0 author=Dean Souleles, KK4DAS, maintainer=Dean Souleles, KK4DAS, sentence=Simulate an ICOM 746 radio from the CAT point of view. paragraph=This lirary emulates the Computer Assisted Transceiver (CAT) control behavior of an ICOM 746. It is intended to be included in a conrol program for an amateur radio. It provides all of the functionality required for programs like FLDIG and WSJTX to be able to control your rig. category=Other -url=https://github.com/kk4das/IC746CAT +url=https://github.com/KK4DAS/IC746/ architectures=*