WizziLab's serial protocol library

Dependents:   modem_ref_helper_for_v5_3_217 modem_ref_helper

Committer:
Jeej
Date:
Fri Feb 19 10:59:27 2021 +0000
Revision:
12:9edd3fd978d2
Parent:
9:0140247bab90
Child:
13:a3997e6aea6e
Removed debug

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 5:a06d239f3b3e 1 #ifndef _WIZZICOM_H_
Jeej 5:a06d239f3b3e 2 #define _WIZZICOM_H_
Jeej 0:95b73d0b37b7 3
Jeej 0:95b73d0b37b7 4 #include "mbed.h"
Jeej 0:95b73d0b37b7 5 #include "rtos.h"
Jeej 9:0140247bab90 6 #include "kal_buf_circ.h"
Jeej 0:95b73d0b37b7 7 #include "WizziDebug.h"
Jeej 0:95b73d0b37b7 8
Jeej 8:42e00820df36 9 // message header length in byte
Jeej 9:0140247bab90 10 #define KAL_COM_HEADER_LEN 5
Jeej 9:0140247bab90 11 #define RX_BUF_SIZE 512
Jeej 0:95b73d0b37b7 12
Jeej 0:95b73d0b37b7 13 typedef enum
Jeej 0:95b73d0b37b7 14 {
Jeej 0:95b73d0b37b7 15 HAL_ERROR_NONE = 0,
Jeej 0:95b73d0b37b7 16 HAL_ERROR_DEFAULT = -1,
Jeej 0:95b73d0b37b7 17 HAL_ERROR_MEM_FULL = -2,
Jeej 0:95b73d0b37b7 18 HAL_ERROR_MEM_EMPTY = -3,
Jeej 0:95b73d0b37b7 19 HAL_ERROR_MODULE_BUSY = -4,
Jeej 0:95b73d0b37b7 20 HAL_ERROR_MODULE_OFF = -5,
Jeej 0:95b73d0b37b7 21 HAL_ERROR_SERIAL_BAD_SYNC = -100,
Jeej 0:95b73d0b37b7 22 HAL_ERROR_SERIAL_BAD_SEQ = -101,
Jeej 0:95b73d0b37b7 23 HAL_ERROR_I2C_BAD_DEVID = -200,
Jeej 0:95b73d0b37b7 24 HAL_ERROR_I2C_NACK = -201,
Jeej 0:95b73d0b37b7 25 HAL_ERROR_I2C_ARB_LOST = -202,
Jeej 0:95b73d0b37b7 26
Jeej 0:95b73d0b37b7 27 } hal_error_t;
Jeej 0:95b73d0b37b7 28
Jeej 0:95b73d0b37b7 29
Jeej 0:95b73d0b37b7 30 typedef enum {
Jeej 0:95b73d0b37b7 31 // Default printf type
Jeej 0:95b73d0b37b7 32 WizziComPacketPrintf,
Jeej 0:95b73d0b37b7 33 // Substitute the string by a codeword
Jeej 0:95b73d0b37b7 34 // interpreted by the PC com tool
Jeej 0:95b73d0b37b7 35 WizziComPacketPrintfCompressed,
Jeej 0:95b73d0b37b7 36 // Display the payload as hex data
Jeej 0:95b73d0b37b7 37 WizziComPacketPrintHex,
Jeej 0:95b73d0b37b7 38
Jeej 0:95b73d0b37b7 39 // AT command
Jeej 0:95b73d0b37b7 40 WizziComPacketAlpCmd,
Jeej 0:95b73d0b37b7 41 // AT command response
Jeej 0:95b73d0b37b7 42 WizziComPacketAlpResp,
Jeej 0:95b73d0b37b7 43 // AT unsolicited message
Jeej 0:95b73d0b37b7 44 WizziComPacketAlpUns,
Jeej 0:95b73d0b37b7 45 // AT unsolicited error
Jeej 0:95b73d0b37b7 46 WizziComPacketAlpErr,
Jeej 0:95b73d0b37b7 47
Jeej 0:95b73d0b37b7 48 // Remote Commands
Jeej 0:95b73d0b37b7 49 WizziComPacketCmd,
Jeej 0:95b73d0b37b7 50
Jeej 0:95b73d0b37b7 51 // Remote System reset
Jeej 0:95b73d0b37b7 52 WizziComPacketSysReset,
Jeej 0:95b73d0b37b7 53 // Button Emulator
Jeej 0:95b73d0b37b7 54 WizziComPacketSysButton,
Jeej 0:95b73d0b37b7 55 // Dump Debug parameters
Jeej 0:95b73d0b37b7 56 WizziComPacketSysInfo,
Jeej 0:95b73d0b37b7 57 // CUP signalisation
Jeej 0:95b73d0b37b7 58 WizziComPacketSysCup,
Jeej 0:95b73d0b37b7 59 // Ping distant COM
Jeej 0:95b73d0b37b7 60 WizziComPacketSysPing,
Jeej 0:95b73d0b37b7 61 // Pong from distant COM
Jeej 0:95b73d0b37b7 62 WizziComPacketSysPong,
Jeej 0:95b73d0b37b7 63 // Enable system config from distant COM
Jeej 0:95b73d0b37b7 64 WizziComPacketSysConfig,
Jeej 0:95b73d0b37b7 65 // Configure Output Trace level from distant COM
Jeej 0:95b73d0b37b7 66 WizziComPacketSysTlev,
Jeej 0:95b73d0b37b7 67 // Configure COM port redirection
Jeej 0:95b73d0b37b7 68 WizziComPacketSysRedir,
Jeej 0:95b73d0b37b7 69 // Flow control signalling
Jeej 0:95b73d0b37b7 70 WizziComPacketSysXon,
Jeej 0:95b73d0b37b7 71 WizziComPacketSysXoff,
Jeej 0:95b73d0b37b7 72 WizziComPacketSysXack,
Jeej 0:95b73d0b37b7 73
Jeej 0:95b73d0b37b7 74 // File System Command/Response
Jeej 0:95b73d0b37b7 75 WizziComPacketFsCmd,
Jeej 0:95b73d0b37b7 76 WizziComPacketFsResp,
Jeej 0:95b73d0b37b7 77
Jeej 0:95b73d0b37b7 78 WIZZICOM_PKT_QTY,
Jeej 0:95b73d0b37b7 79
Jeej 0:95b73d0b37b7 80 // Special flag to redirect all undirected packets to this callback
Jeej 4:a37e42de1ba7 81 WizziComPacketUntreated = WIZZICOM_PKT_QTY,
Jeej 0:95b73d0b37b7 82 } WizziComPacketType;
Jeej 0:95b73d0b37b7 83
Jeej 0:95b73d0b37b7 84 typedef struct {
Jeej 0:95b73d0b37b7 85 uint8_t type;
Jeej 0:95b73d0b37b7 86 uint8_t length;
Jeej 0:95b73d0b37b7 87 uint8_t data[1];
Jeej 0:95b73d0b37b7 88 } WizziComPacket_t;
Jeej 0:95b73d0b37b7 89
Jeej 0:95b73d0b37b7 90 //======================================================================
Jeej 0:95b73d0b37b7 91 // wizzi_com_tx_msg_t
Jeej 0:95b73d0b37b7 92 //----------------------------------------------------------------------
Jeej 0:95b73d0b37b7 93 // Transmit message structure
Jeej 0:95b73d0b37b7 94 //======================================================================
Jeej 0:95b73d0b37b7 95 typedef struct
Jeej 0:95b73d0b37b7 96 {
Jeej 0:95b73d0b37b7 97 // identifier wizzi_com_flow_t
Jeej 0:95b73d0b37b7 98 uint8_t id;
Jeej 0:95b73d0b37b7 99 // length of the string buffer defined by a pointer
Jeej 0:95b73d0b37b7 100 uint8_t plen;
Jeej 0:95b73d0b37b7 101 // length of the allocated buffer
Jeej 0:95b73d0b37b7 102 uint8_t alen;
Jeej 0:95b73d0b37b7 103 // pointer to a string buffer that does not need to be freed
Jeej 0:95b73d0b37b7 104 uint8_t* pbuf;
Jeej 0:95b73d0b37b7 105 // pointer to argument that does not need to be freed
Jeej 0:95b73d0b37b7 106 uint8_t* abuf;
Jeej 0:95b73d0b37b7 107
Jeej 0:95b73d0b37b7 108 } wizzi_com_tx_msg_t;
Jeej 0:95b73d0b37b7 109
Jeej 0:95b73d0b37b7 110 //======================================================================
Jeej 0:95b73d0b37b7 111 // wizzi_com_rx_msg_t
Jeej 0:95b73d0b37b7 112 //----------------------------------------------------------------------
Jeej 0:95b73d0b37b7 113 // Receive message structure
Jeej 0:95b73d0b37b7 114 //======================================================================
Jeej 0:95b73d0b37b7 115 typedef struct
Jeej 0:95b73d0b37b7 116 {
Jeej 0:95b73d0b37b7 117 // error message
Jeej 0:95b73d0b37b7 118 hal_error_t err;
Jeej 0:95b73d0b37b7 119 // length of the log (string) buffer
Jeej 0:95b73d0b37b7 120 uint8_t blen;
Jeej 0:95b73d0b37b7 121 // identifier wizzi_com_flow_t
Jeej 0:95b73d0b37b7 122 uint8_t id;
Jeej 0:95b73d0b37b7 123 // Com port where the message came from
Jeej 0:95b73d0b37b7 124 uint8_t com_id;
Jeej 0:95b73d0b37b7 125 // pointer to the log buffer
Jeej 0:95b73d0b37b7 126 uint8_t buffer[1];
Jeej 0:95b73d0b37b7 127
Jeej 0:95b73d0b37b7 128 } wizzi_com_rx_msg_t;
Jeej 0:95b73d0b37b7 129
Jeej 0:95b73d0b37b7 130 typedef struct {
Jeej 0:95b73d0b37b7 131 uint32_t len;
Jeej 0:95b73d0b37b7 132 uint8_t buf[1];
Jeej 0:95b73d0b37b7 133 } wizzi_com_tx_buf_t;
Jeej 0:95b73d0b37b7 134
Jeej 1:ca1c9bfb1cf4 135 uint8_t wizzicom_type_to_flow(uint8_t packet_type);
Jeej 1:ca1c9bfb1cf4 136 uint8_t wizzicom_flow_to_type(uint8_t flow_id);
Jeej 0:95b73d0b37b7 137
Jeej 0:95b73d0b37b7 138 class WizziCom {
Jeej 1:ca1c9bfb1cf4 139 typedef void (*WizziComCallback)(WizziCom*, WizziComPacket_t*);
Jeej 0:95b73d0b37b7 140
Jeej 0:95b73d0b37b7 141 private:
Jeej 1:ca1c9bfb1cf4 142 volatile uint8_t _state;
Jeej 0:95b73d0b37b7 143 wizzi_com_rx_msg_t _msg;
Jeej 0:95b73d0b37b7 144 uint8_t _tx_seq;
Jeej 0:95b73d0b37b7 145 uint8_t _rx_seq;
Jeej 0:95b73d0b37b7 146
Jeej 0:95b73d0b37b7 147 DigitalOut* _irq_out;
Jeej 0:95b73d0b37b7 148 InterruptIn* _irq_in;
Jeej 0:95b73d0b37b7 149 RawSerial* _serial;
Jeej 9:0140247bab90 150 uint8_t _rx_byte;
Jeej 0:95b73d0b37b7 151
Jeej 9:0140247bab90 152 kal_buf_circ_handle_t _cbuf;
Jeej 9:0140247bab90 153 kal_buf_circ_static_handle_t _cbuf_h;
Jeej 9:0140247bab90 154 kal_buf_circ_static_buffer_t(_cbuf_b, RX_BUF_SIZE, sizeof(uint8_t));
Jeej 0:95b73d0b37b7 155
Jeej 8:42e00820df36 156 Semaphore _tx_done;
Jeej 8:42e00820df36 157 Semaphore _rx_done;
Jeej 0:95b73d0b37b7 158 Semaphore _irq_in_int;
Jeej 0:95b73d0b37b7 159 Thread _rx_thread;
Jeej 0:95b73d0b37b7 160 Thread _tx_thread;
Jeej 0:95b73d0b37b7 161 Thread _callback_thread;
Jeej 0:95b73d0b37b7 162 Queue<wizzi_com_tx_buf_t, 8> _tx_queue;
Jeej 0:95b73d0b37b7 163 Queue<WizziComPacket_t, 8> _rx_queue;
Jeej 0:95b73d0b37b7 164
Jeej 1:ca1c9bfb1cf4 165 Callback<void(WizziCom*, WizziComPacket_t*)> _callback[WIZZICOM_PKT_QTY+1];
Jeej 0:95b73d0b37b7 166
Jeej 8:42e00820df36 167 void _get_header(uint8_t length);
Jeej 8:42e00820df36 168 void _get_body(uint8_t length);
Jeej 8:42e00820df36 169 void _tx_done_isr(int event);
Jeej 9:0140247bab90 170 void _rx_isr(void);
Jeej 8:42e00820df36 171 void _rx_done_isr(int event);
Jeej 0:95b73d0b37b7 172 void _irq_in_isr();
Jeej 5:a06d239f3b3e 173 void _send_raw(uint8_t* data, uint32_t len);
Jeej 0:95b73d0b37b7 174 void _sys_xack(void);
Jeej 0:95b73d0b37b7 175 wizzi_com_tx_buf_t* _new_msg(wizzi_com_tx_msg_t* msg);
Jeej 0:95b73d0b37b7 176 void _post_msg(wizzi_com_tx_msg_t* msg);
Jeej 0:95b73d0b37b7 177 void _new_pkt(WizziComPacket_t* pkt);
Jeej 8:42e00820df36 178 void _parse_packet(void);
Jeej 0:95b73d0b37b7 179 void _thread_rx(void);
Jeej 0:95b73d0b37b7 180 void _thread_tx(void);
Jeej 0:95b73d0b37b7 181 void _thread_callback(void);
Jeej 0:95b73d0b37b7 182
Jeej 0:95b73d0b37b7 183 public:
Jeej 0:95b73d0b37b7 184 WizziCom(PinName tx, PinName rx, PinName irq_out = NC, PinName irq_in = NC);
Jeej 0:95b73d0b37b7 185 ~WizziCom();
Jeej 0:95b73d0b37b7 186
Jeej 0:95b73d0b37b7 187 void attach(WizziComCallback function, WizziComPacketType packet_type);
Jeej 0:95b73d0b37b7 188
Jeej 0:95b73d0b37b7 189 template<class T>
Jeej 0:95b73d0b37b7 190 void attach(T* object, void (T::*member)(WizziCom*, WizziComPacket_t*), WizziComPacketType packet_type)
Jeej 0:95b73d0b37b7 191 {
Jeej 0:95b73d0b37b7 192 _callback[packet_type] = callback(object, member);
Jeej 0:95b73d0b37b7 193 }
Jeej 0:95b73d0b37b7 194
Jeej 0:95b73d0b37b7 195 void reset(void);
Jeej 0:95b73d0b37b7 196 void send(WizziComPacketType type, uint8_t length, uint8_t* data);
Jeej 0:95b73d0b37b7 197 void send(WizziComPacket_t* packet);
Jeej 5:a06d239f3b3e 198 void print_raw(char* str);
Jeej 5:a06d239f3b3e 199 void send_raw(uint8_t* data, uint32_t len);
Jeej 1:ca1c9bfb1cf4 200
Jeej 1:ca1c9bfb1cf4 201 uint8_t type_to_flow(WizziComPacketType packet_type);
Jeej 0:95b73d0b37b7 202 };
Jeej 0:95b73d0b37b7 203
Jeej 5:a06d239f3b3e 204 #endif // _WIZZICOM_H_