ubitx-v5d-xcvr/ubitx_iop/cat.h

144 lines
3.2 KiB
C

//======================================================================
// cat.h
//======================================================================
#ifndef __iop_cat_h__
#define __iop_cat_h__
#define ACK 0
#define CAT_PREFIX 0xC0
#define IOP_PREFIX 0xD0
#define EEPROM_READ_PREFIX 0xE0
#define EEPROM_WRITE_PREFIX 0xF0
#define IOP_MODE_COMMAND 0x00
#define IOP_START_TX_COMMAND 0x01
#define IOP_STOP_TX_COMMAND 0x02
#define IOP_CW_CONFIG_MSG 0x03
#define IOP_MODE_REQUEST 0x00
#define IOP_CW_STATUS_MSG 0x03
#define IOP_MODE_SSB 0x00
#define IOP_MODE_DIGI 0x01
#define IOP_MODE_CW 0x02
#include "config.h"
#define USBSERIAL Serial
#define HWSERIAL Serial1
/*struct IOPTMsg {
};
*/
enum KeyMode {
STRAIGHT = 0,
IAMBIC_A,
IAMBIC_B,
//ULTIMATIC,
//BUG,
};
const byte MODE_LETTER[3] = {'S', 'A', 'B'};
const byte NO_FLAGS = 0;
const byte REVERSED = 1;
#define R_MESSAGE_MAX_LEN 32
#define T_MESSAGE_MAX_LEN 32
struct RMessage {
uint8_t id;
uint8_t len;
byte data[R_MESSAGE_MAX_LEN];
};
struct TMessage {
uint8_t id;
uint8_t len;
byte data[T_MESSAGE_MAX_LEN];
};
//======================================================================
// CW CONFIGURATION MESSAGE
//======================================================================
struct CWConfig {
// mode
KeyMode mode = IAMBIC_A;
// flags
bool reversed = false;
// parameters
uint8_t wpm = 15;
float weight = 3.0;
uint16_t sidetone = 700;
};
void packR_CWConfig(RMessage &m, CWConfig const &c)
{
m.id = IOP_CW_CONFIG_MSG;
m.len = 6;
// mode
m.data[0] = byte(c.mode);
// flags
m.data[1] = NO_FLAGS;
m.data[1] |= (c.reversed ? REVERSED : 0);
// parameters
m.data[2] = byte(c.wpm);
m.data[3] = byte(c.weight * 10.0);
m.data[4] = byte(c.sidetone >> 8);
m.data[5] = byte(c.sidetone | 0x0F);
}
void unpackR_CWConfig(CWConfig &c, RMessage const &m)
{
//if (m.id != IOP_CW_CONFIG_MSG || m.len != 6) {
// // do some error thing...
//}
//mode
c.mode = KeyMode(m.data[0]);
// flags
c.reversed = bool(m.data[1] & REVERSED);
// parameters
c.wpm = uint8_t(m.data[2]);
c.weight = float(m.data[3]) / 10.0;
c.sidetone = (m.data[4] << 8) | m.data[5];
}
//======================================================================
// MODE REQUEST MESSAGE
//======================================================================
void packT_ModeRequest(TMessage &m)
{
m.id = IOP_MODE_REQUEST;
m.len = 0;
}
//======================================================================
// CW STATUS MESSAGE
//======================================================================
//void packT_DisplayText(TMessage &m, CWConfig const &c)
//{
// m.id = IOP_CW_STATUS_MSG;
// m.len = 3;
// m.data[0] = ' '; // growth
// m.data[1] = MODE_LETTER[c.mode];
// m.data[2] = ' '; // TODO: RX filter width
//}
// No unpack required: this is a string to put on the display.
//======================================================================
void initCAT(long, int);
void serviceCAT();
#endif
//======================================================================
// EOF
//======================================================================