WizziLab's serial protocol library

Dependents:   modem_ref_helper_for_v5_3_217 modem_ref_helper

Committer:
Jeej
Date:
Tue Aug 20 13:48:15 2019 +0000
Revision:
8:42e00820df36
Parent:
5:a06d239f3b3e
Child:
9:0140247bab90
Implemented DMA instead of interrupts.

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