/********************************************************************************************** * Copyright � 2017 Digital Confections LLC * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in the * Software without restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, subject to the * following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * ********************************************************************************************** * * linkbus.h - a simple serial inter-processor communication protocol. */ #ifndef LINKBUS_H_ #define LINKBUS_H_ #include "defs.h" //#include "transmitter.h" //#include "si5351.h" #define LINKBUS_MAX_MSG_LENGTH 50 #define LINKBUS_MIN_MSG_LENGTH 3 /* shortest message: $TTY; */ #define LINKBUS_MAX_MSG_FIELD_LENGTH 21 #define LINKBUS_MAX_MSG_NUMBER_OF_FIELDS 3 #define LINKBUS_NUMBER_OF_RX_MSG_BUFFERS 2 #define LINKBUS_MAX_TX_MSG_LENGTH 40 #define LINKBUS_NUMBER_OF_TX_MSG_BUFFERS 10 #define LINKBUS_POWERUP_DELAY_SECONDS 6 #define LINKBUS_MIN_TX_INTERVAL_MS 100 #define FOSC 16000000 /* Clock Speed */ #define BAUD 57600 #define MYUBRR(b) (FOSC / 16 / (b) - 1) typedef enum { EMPTY_BUFF, FULL_BUFF } BufferState; /* Linkbus Messages * Message formats: * $id,f1,f2... fn; * !id,f1,f2,... fn; * $id,f1,f2,... fn? * * where * $ = command - ! indicates a response or broadcast to subscribers * id = linkbus MessageID * fn = variable length fields * ; = end of message flag - ? = end of query * Null fields in settings commands indicates no change should be applied * All null fields indicates a polling request for current settings * ? terminator indicates subscription request to value changes * Sending a query with fields containing data, is the equivalent of sending * a command followed by a query (i.e., a response is requested). * * TEST EQUIPMENT MESSAGE FAMILY (DEVICE MESSAGING) * $TST - Test message * !ACK - Simple acknowledgment to a command (sent when required) * $CK0 - Set Si5351 CLK0: field1 = freq (Hz); field2 = enable (BOOL) * $CK1 - Set Si5351 CLK1: field1 = freq (Hz); field2 = enable (BOOL) * $CK2 - Set Si5351 CLK2: field1 = freq (Hz); field2 = enable (BOOL) * $VOL - Set audio volume: field1 = inc/decr (BOOL); field2 = % (int) * $BAT? - Subscribe to battery voltage reports * * DUAL-BAND RX MESSAGE FAMILY (FUNCTIONAL MESSAGING) * $BND - Set/Get radio band to 2m or 80m * $S? - Subscribe to signal strength reports * - Subscribe to gain setting reports * - */ typedef enum { MESSAGE_EMPTY = 0, /* TEST EQUIPMENT MESSAGE FAMILY (TEST DEVICE MESSAGING) */ MESSAGE_BAND = 'B' * 100 + 'N' * 10 + 'D', /* $BND,; / $BND? / !BND,; // Set band; field1 = RadioBand */ MESSAGE_TTY = 'T' * 100 + 'T' * 10 + 'Y', /* Adjust for PC communications interface (add crlf, etc.) */ /* DUAL-BAND TX MESSAGE FAMILY (FUNCTIONAL MESSAGING) */ MESSAGE_CLOCK_CAL = 'C' * 100 + 'A' * 10 + 'L', /* Set Jerry's clock calibration value */ MESSAGE_FACTORY_RESET = 'F' * 100 + 'A' * 10 + 'C', /* Sets EEPROM back to defaults */ MESSAGE_OVERRIDE_DIP = 'D' *100 + 'I' * 10 + 'P', /* Override DIP switch settings using this value */ MESSAGE_LEDS = 'L' * 100 + 'E' * 10 + 'D', /* Turn on or off LEDs - accepts 1 or 0 or ON or OFF */ MESSAGE_SYNC_ENABLE = 'S' * 100 + 'Y' * 10 + 'N', /* Enable or disable transmitter syncing */ MESSAGE_TEMP = 'T' * 100 + 'E' * 10 + 'M', /* Temperature data */ MESSAGE_SET_STATION_ID = 'I' * 10 + 'D', /* Sets amateur radio callsign text */ MESSAGE_GO = 'G' * 10 + 'O', /* Synchronizes clock */ /* UTILITY MESSAGES */ MESSAGE_RESET = 'R' * 100 + 'S' * 10 + 'T', /* Processor reset */ MESSAGE_VERSION = 'V' * 100 + 'E' * 10 + + 'R', /* S/W version number */ INVALID_MESSAGE = UINT16_MAX /* This value must never overlap a valid message ID */ } LBMessageID; typedef enum { LINKBUS_MSG_UNKNOWN = 0, LINKBUS_MSG_COMMAND, LINKBUS_MSG_QUERY, LINKBUS_MSG_REPLY, LINKBUS_MSG_INVALID } LBMessageType; typedef enum { FIELD1 = 0, FIELD2 = 1, FIELD3 = 2 } LBMessageField; typedef enum { BATTERY_BROADCAST = 0x0001, RSSI_BROADCAST = 0x0002, RF_BROADCAST = 0x0004, UPC_TEMP_BROADCAST = 0x0008, ALL_BROADCASTS = 0x000FF } LBbroadcastType; typedef enum { NO_ID = 0, CONTROL_HEAD_ID = 1, RECEIVER_ID = 2, TRANSMITTER_ID = 3 } DeviceID; typedef char LinkbusTxBuffer[LINKBUS_MAX_TX_MSG_LENGTH]; typedef struct { LBMessageType type; LBMessageID id; char fields[LINKBUS_MAX_MSG_NUMBER_OF_FIELDS][LINKBUS_MAX_MSG_FIELD_LENGTH]; } LinkbusRxBuffer; #define WAITING_FOR_UPDATE -1 /** */ void linkbus_init(uint32_t baud); /** * Immediately turns off receiver and flushes receive buffer */ void linkbus_disable(void); /** * Undoes linkbus_disable() */ void linkbus_enable(void); /** */ void linkbus_end_tx(void); /** */ void linkbus_reset_rx(void); /** */ LinkbusTxBuffer* nextEmptyTxBuffer(void); /** */ LinkbusTxBuffer* nextFullTxBuffer(void); /** */ BOOL linkbusTxInProgress(void); /** */ LinkbusRxBuffer* nextEmptyRxBuffer(void); /** */ LinkbusRxBuffer* nextFullRxBuffer(void); /** */ void lb_send_sync(void); /** */ BOOL linkbus_send_text(char* text); /** */ void lb_send_ESP(LBMessageType msgType, char* msg); /** */ void lb_send_msg(LBMessageType msgType, char* msgLabel, char* msgStr); /** */ void lb_broadcast_num(uint16_t data, char* str); /** */ void lb_send_Help(void); /** */ void lb_send_NewPrompt(void); /** */ void lb_send_NewLine(void); /** */ void linkbus_setLineTerm(char* term); /** */ void lb_echo_char(uint8_t c); /** */ BOOL lb_send_string(char* str); /** */ void lb_send_value(uint16_t value, char* label); /** */ void lb_send_Help(void); #endif /* LINKBUS_H_ */