//====================================================================== // 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 //======================================================================