kopia lustrzana https://github.com/kk4das/IC746CAT
V1.3 - Added support for all IC-746 modes and frequencies 100MHz and greater
rodzic
b9fa9c8970
commit
054ffd5937
72
IC746.cpp
72
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.h>
|
||||
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) {
|
||||
|
|
26
IC746.h
26
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
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
// Dummy Sketch to allow editing of Nextion Lbrary files in the IDE
|
||||
#include "IC746.h"
|
||||
|
||||
void setup() {
|
||||
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
}
|
|
@ -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.
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
name=ICOM 746 CAT Control
|
||||
version=1.0.2
|
||||
version=1.3.0
|
||||
author=Dean Souleles, KK4DAS, <kk4das@gmail.com>
|
||||
maintainer=Dean Souleles, KK4DAS, <kk4das@gmail.com>
|
||||
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=*
|
||||
|
|
Ładowanie…
Reference in New Issue