e9d021835a
committing for safety...
144 lines
3.2 KiB
C
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
|
|
//======================================================================
|