Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Wed Dec 21 15:08:51 2016 +0000
Revision:
79:82b01c1a62f6
Parent:
78:f1c0affd99e7
Child:
80:30265d5dd20a
Unitary debug prints.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 24:a8433b091764 1 #include "mbed.h"
Jeej 24:a8433b091764 2 #include "rtos.h"
Jeej 24:a8433b091764 3 #include "dbg.h"
Jeej 49:81d5bddb02f0 4 #include "d7a.h"
Jeej 24:a8433b091764 5 #include "d7a_com.h"
Jeej 45:b85384e7d825 6 #include "d7a_alp.h"
Jeej 25:aac250164497 7 #include "d7a_common.h"
Jeej 25:aac250164497 8 #include "d7a_fs.h"
Jeej 25:aac250164497 9 #include "d7a_modem.h"
Jeej 25:aac250164497 10 #include "d7a_sys.h"
Jeej 76:fda2e34ff19d 11 #include "cbuffer.h"
Jeej 24:a8433b091764 12
Jeej 79:82b01c1a62f6 13 #if 1
Jeej 79:82b01c1a62f6 14 #define COM_DPRINT(...) DPRINT(__VA_ARGS__)
Jeej 79:82b01c1a62f6 15 #define DPRINT_DATA(...) DPRINT_DATA(__VA_ARGS__)
Jeej 79:82b01c1a62f6 16 #else
Jeej 79:82b01c1a62f6 17 #define COM_DPRINT(...);
Jeej 79:82b01c1a62f6 18 #define DPRINT_DATA(...);
Jeej 79:82b01c1a62f6 19 #endif
Jeej 79:82b01c1a62f6 20
Jeej 37:e04613e021f2 21 #define XON_SIGNAL (0x0001 << 0)
Jeej 37:e04613e021f2 22 #define START_SIGNAL (0x0001 << 1)
Jeej 31:ab9bfdbc6b44 23
Jeej 31:ab9bfdbc6b44 24 typedef struct {
Jeej 31:ab9bfdbc6b44 25 uint32_t len;
Jeej 45:b85384e7d825 26 uint8_t buf[1];
Jeej 31:ab9bfdbc6b44 27 } d7a_com_tx_buf_t;
Jeej 30:d775c1409849 28
Jeej 77:8c792719a1fc 29 static bool g_com_rx_started;
Jeej 77:8c792719a1fc 30 static bool g_com_tx_started;
Jeej 77:8c792719a1fc 31 static uint8_t g_com_state;
Jeej 77:8c792719a1fc 32 static DigitalOut* g_com_rts;
Jeej 77:8c792719a1fc 33 static InterruptIn* g_com_cts;
Jeej 77:8c792719a1fc 34 static CBuffer<uint8_t, 512> g_com_rx_buf;
Jeej 77:8c792719a1fc 35 static d7a_com_rx_msg_t g_com_msg;
Jeej 77:8c792719a1fc 36 static uint16_t g_com_skipped_bytes;
Jeej 77:8c792719a1fc 37 static uint8_t g_com_tx_seq;
Jeej 77:8c792719a1fc 38 static uint8_t g_com_rx_seq;
Jeej 77:8c792719a1fc 39 static Semaphore g_com_data_parsing(0);
Jeej 77:8c792719a1fc 40 static Semaphore g_com_cts_int(0);
Jeej 77:8c792719a1fc 41 static RawSerial* g_com_serial;
Jeej 78:f1c0affd99e7 42 static Thread g_com_rx_thread(osPriorityRealtime, 512, NULL);
Jeej 78:f1c0affd99e7 43 static Thread g_com_tx_thread(osPriorityHigh, 512, NULL);
Jeej 77:8c792719a1fc 44 static Queue<d7a_com_tx_buf_t, 8> g_com_tx_queue;
Jeej 77:8c792719a1fc 45 static Timer g_com_tim;
Jeej 77:8c792719a1fc 46
Jeej 77:8c792719a1fc 47
Jeej 37:e04613e021f2 48 enum {
Jeej 37:e04613e021f2 49 SEARCH_HEADER,
Jeej 37:e04613e021f2 50 PARSE_HEADER,
Jeej 37:e04613e021f2 51 SEARCH_BODY,
Jeej 37:e04613e021f2 52 PARSE_BODY,
Jeej 37:e04613e021f2 53 };
Jeej 30:d775c1409849 54
Jeej 24:a8433b091764 55
Jeej 24:a8433b091764 56 /**
Jeej 24:a8433b091764 57 Thread for parsing packets from RX buffer.
Jeej 24:a8433b091764 58
Jeej 24:a8433b091764 59 @param void
Jeej 24:a8433b091764 60 @return void
Jeej 24:a8433b091764 61 */
Jeej 76:fda2e34ff19d 62 void d7a_com_rx_thread();
Jeej 76:fda2e34ff19d 63 void d7a_com_tx_thread();
Jeej 31:ab9bfdbc6b44 64
Jeej 24:a8433b091764 65
Jeej 24:a8433b091764 66 /**
Jeej 24:a8433b091764 67 Serial Rx Interrupt Service Routine.
Jeej 24:a8433b091764 68 Add recevied bytes to the RX buffer.
Jeej 24:a8433b091764 69
Jeej 24:a8433b091764 70 @param void
Jeej 24:a8433b091764 71 @return void
Jeej 24:a8433b091764 72 */
Jeej 24:a8433b091764 73 void rx_isr()
Jeej 24:a8433b091764 74 {
Jeej 24:a8433b091764 75 // Loop just in case more than one character is in UART's receive FIFO buffer
Jeej 77:8c792719a1fc 76 while (g_com_serial->readable())
Jeej 34:1311cc53201a 77 {
Jeej 77:8c792719a1fc 78 g_com_rx_buf.push(g_com_serial->getc());
Jeej 34:1311cc53201a 79 //PRINT("-");
Jeej 78:f1c0affd99e7 80 }
Jeej 78:f1c0affd99e7 81
Jeej 78:f1c0affd99e7 82 // unlock data parsing thread
Jeej 78:f1c0affd99e7 83 if (g_com_state == SEARCH_HEADER && g_com_rx_buf.available_data() >= KAL_COM_HEADER_LEN)
Jeej 78:f1c0affd99e7 84 {
Jeej 78:f1c0affd99e7 85 g_com_state = PARSE_HEADER;
Jeej 78:f1c0affd99e7 86 g_com_data_parsing.release();
Jeej 78:f1c0affd99e7 87 }
Jeej 78:f1c0affd99e7 88 else if (g_com_state == SEARCH_BODY && g_com_rx_buf.available_data() >= g_com_msg.blen)
Jeej 78:f1c0affd99e7 89 {
Jeej 78:f1c0affd99e7 90 g_com_state = PARSE_BODY;
Jeej 78:f1c0affd99e7 91 g_com_data_parsing.release();
Jeej 24:a8433b091764 92 }
Jeej 24:a8433b091764 93 }
Jeej 24:a8433b091764 94
Jeej 24:a8433b091764 95 /**
Jeej 24:a8433b091764 96 CTS pin Interrupt Service Routine.
Jeej 24:a8433b091764 97 For flow control (not yet inplemented)
Jeej 24:a8433b091764 98
Jeej 24:a8433b091764 99 @param void
Jeej 24:a8433b091764 100 @return void
Jeej 24:a8433b091764 101 */
Jeej 24:a8433b091764 102 void cts_isr()
Jeej 24:a8433b091764 103 {
Jeej 34:1311cc53201a 104 //PRINT("CTS_INT\r\n");
Jeej 77:8c792719a1fc 105 //g_com_cts_int->release();
Jeej 24:a8433b091764 106 }
Jeej 24:a8433b091764 107
Jeej 26:9f0b9833cac6 108 // D7a_com constructor.
Jeej 26:9f0b9833cac6 109 // Opens a serial port and monitors the input for ALP packets.
Jeej 26:9f0b9833cac6 110 // Pins are those of the host, not the modem:
Jeej 26:9f0b9833cac6 111 // TX-host -> RX-modem
Jeej 26:9f0b9833cac6 112 // RX-host <- TX-modem
Jeej 26:9f0b9833cac6 113 // RTS-host -> CTS-modem
Jeej 26:9f0b9833cac6 114 // CTS-host <- RTS-modem
Jeej 49:81d5bddb02f0 115 d7a_errors_t d7a_com_open( const d7a_com_config_t* config )
Jeej 26:9f0b9833cac6 116 {
Jeej 26:9f0b9833cac6 117 FPRINT("\r\n");
Jeej 26:9f0b9833cac6 118
Jeej 77:8c792719a1fc 119 g_com_state = SEARCH_HEADER;
Jeej 77:8c792719a1fc 120 g_com_skipped_bytes = 0;
Jeej 77:8c792719a1fc 121 g_com_tx_seq = 0;
Jeej 77:8c792719a1fc 122 g_com_rx_seq = 0;
Jeej 31:ab9bfdbc6b44 123
Jeej 77:8c792719a1fc 124 g_com_serial = new RawSerial(config->tx, config->rx, 115200);
Jeej 77:8c792719a1fc 125 g_com_rts = new DigitalOut(config->rts);
Jeej 77:8c792719a1fc 126 g_com_cts = new InterruptIn(config->cts);
Jeej 69:18852c154df9 127
Jeej 77:8c792719a1fc 128 g_com_cts->rise(&cts_isr);
Jeej 30:d775c1409849 129
Jeej 77:8c792719a1fc 130 g_com_serial->format(8, SerialBase::None, 1);
Jeej 77:8c792719a1fc 131 g_com_serial->attach(&rx_isr, Serial::RxIrq);
Jeej 76:fda2e34ff19d 132
Jeej 77:8c792719a1fc 133 osStatus err = g_com_rx_thread.start(d7a_com_rx_thread);
Jeej 76:fda2e34ff19d 134 ASSERT(err == osOK, "Failed to start d7a_com_rx_thread (err: %d)\r\n", err);
Jeej 76:fda2e34ff19d 135
Jeej 77:8c792719a1fc 136 err = g_com_tx_thread.start(d7a_com_tx_thread);
Jeej 76:fda2e34ff19d 137 ASSERT(err == osOK, "Failed to start d7a_com_tx_thread (err: %d)\r\n", err);
Jeej 49:81d5bddb02f0 138
Jeej 49:81d5bddb02f0 139 return D7A_ERR_NONE;
Jeej 26:9f0b9833cac6 140 }
Jeej 26:9f0b9833cac6 141
Jeej 26:9f0b9833cac6 142 // Destructor
Jeej 56:da34fc11e760 143 d7a_errors_t d7a_com_close(void)
Jeej 26:9f0b9833cac6 144 {
Jeej 26:9f0b9833cac6 145 FPRINT("\r\n");
Jeej 77:8c792719a1fc 146 g_com_rx_thread.terminate();
Jeej 77:8c792719a1fc 147 g_com_tx_thread.terminate();
Jeej 77:8c792719a1fc 148 delete g_com_serial;
Jeej 77:8c792719a1fc 149 delete g_com_rts;
Jeej 77:8c792719a1fc 150 delete g_com_cts;
Jeej 49:81d5bddb02f0 151
Jeej 49:81d5bddb02f0 152 return D7A_ERR_NONE;
Jeej 26:9f0b9833cac6 153 }
Jeej 26:9f0b9833cac6 154
Jeej 34:1311cc53201a 155
Jeej 34:1311cc53201a 156 void d7a_com_restart(void)
Jeej 34:1311cc53201a 157 {
Jeej 34:1311cc53201a 158 FPRINT("\r\n");
Jeej 69:18852c154df9 159
Jeej 77:8c792719a1fc 160 g_com_serial->attach(NULL, Serial::RxIrq);
Jeej 42:1578f0480dcb 161
Jeej 77:8c792719a1fc 162 g_com_state = SEARCH_HEADER;
Jeej 77:8c792719a1fc 163 g_com_skipped_bytes = 0;
Jeej 77:8c792719a1fc 164 g_com_tx_seq = 0;
Jeej 77:8c792719a1fc 165 g_com_rx_seq = 0;
Jeej 34:1311cc53201a 166
Jeej 77:8c792719a1fc 167 g_com_rx_buf.reset();
Jeej 34:1311cc53201a 168
Jeej 77:8c792719a1fc 169 g_com_serial->attach(&rx_isr, Serial::RxIrq);
Jeej 34:1311cc53201a 170 }
Jeej 34:1311cc53201a 171
Jeej 42:1578f0480dcb 172
Jeej 24:a8433b091764 173 /**
Jeej 24:a8433b091764 174 Wakes-up modem and send data throught Serial.
Jeej 24:a8433b091764 175
Jeej 24:a8433b091764 176 @param const uint8_t* Pointer to data buffer
Jeej 24:a8433b091764 177 @param int Data length
Jeej 24:a8433b091764 178 @return void
Jeej 24:a8433b091764 179 */
Jeej 45:b85384e7d825 180 static void d7a_com_send(d7a_com_tx_buf_t* tx_buf)
Jeej 69:18852c154df9 181 {
Jeej 45:b85384e7d825 182 FPRINT("\r\n");
Jeej 45:b85384e7d825 183
Jeej 79:82b01c1a62f6 184 COM_DPRINT("<-- (0x%02X) %d\r\n", tx_buf->buf[4], (tx_buf->len - KAL_COM_HEADER_LEN));
Jeej 34:1311cc53201a 185
Jeej 77:8c792719a1fc 186 *(g_com_rts) = 1;
Jeej 24:a8433b091764 187
Jeej 47:19f22e1a448a 188 //dbg_print_data("", "%02X ", (uint8_t*)tx_buf->buf, tx_buf->len, "\r\n");
Jeej 45:b85384e7d825 189
Jeej 70:07b378285c95 190 Thread::wait(3);
Jeej 24:a8433b091764 191
Jeej 45:b85384e7d825 192 for (uint32_t i=0 ; i<tx_buf->len ; i++)
Jeej 24:a8433b091764 193 {
Jeej 77:8c792719a1fc 194 g_com_serial->putc(tx_buf->buf[i]);
Jeej 24:a8433b091764 195 }
Jeej 24:a8433b091764 196
Jeej 66:492b1d7ba370 197 // Important to not release the ressource too soon
Jeej 70:07b378285c95 198 Thread::wait(2);
Jeej 42:1578f0480dcb 199
Jeej 77:8c792719a1fc 200 *(g_com_rts) = 0;
Jeej 24:a8433b091764 201 }
Jeej 24:a8433b091764 202
Jeej 26:9f0b9833cac6 203 // Formats and send packet throught Serial.
Jeej 45:b85384e7d825 204 d7a_com_tx_buf_t* d7a_com_new_msg(d7a_com_tx_msg_t* msg)
Jeej 34:1311cc53201a 205 {
Jeej 45:b85384e7d825 206 uint8_t len = KAL_COM_HEADER_LEN + msg->alen + msg->plen;
Jeej 34:1311cc53201a 207 FPRINT("(len:%d)\r\n", len);
Jeej 34:1311cc53201a 208
Jeej 45:b85384e7d825 209 d7a_com_tx_buf_t* tx_buf = (d7a_com_tx_buf_t*)MALLOC(sizeof(d7a_com_tx_buf_t) - 1 + len);
Jeej 34:1311cc53201a 210
Jeej 34:1311cc53201a 211 // construct serial header
Jeej 34:1311cc53201a 212 // concatenate and update tx_seq ID
Jeej 45:b85384e7d825 213 uint8_t* p = tx_buf->buf;
Jeej 45:b85384e7d825 214 uint8_t* t = p;
Jeej 45:b85384e7d825 215 *p++ = (uint8_t)KAL_COM_SYNC_BYTE_0;
Jeej 45:b85384e7d825 216 *p++ = (uint8_t)KAL_COM_SYNC_BYTE_1;
Jeej 45:b85384e7d825 217 *p++ = (uint8_t)msg->alen + msg->plen;
Jeej 77:8c792719a1fc 218 *p++ = (uint8_t)g_com_tx_seq++;
Jeej 45:b85384e7d825 219 *p++ = (uint8_t)msg->id;
Jeej 34:1311cc53201a 220
Jeej 34:1311cc53201a 221 // copy payload and parameters
Jeej 45:b85384e7d825 222 memcpy(p, msg->pbuf, msg->plen);
Jeej 45:b85384e7d825 223 p += msg->plen;
Jeej 45:b85384e7d825 224 memcpy(p, msg->abuf, msg->alen);
Jeej 45:b85384e7d825 225 p += msg->alen;
Jeej 34:1311cc53201a 226
Jeej 45:b85384e7d825 227 tx_buf->len = (uint32_t)(p - t);
Jeej 34:1311cc53201a 228
Jeej 45:b85384e7d825 229 ASSERT(tx_buf->len == len, "New msg wrong length %d expected %d\r\n", tx_buf->len, len);
Jeej 45:b85384e7d825 230
Jeej 45:b85384e7d825 231 return tx_buf;
Jeej 34:1311cc53201a 232 }
Jeej 34:1311cc53201a 233
Jeej 34:1311cc53201a 234 void d7a_com_post_msg(d7a_com_tx_msg_t* msg)
Jeej 45:b85384e7d825 235 {
Jeej 45:b85384e7d825 236 FPRINT("\r\n");
Jeej 26:9f0b9833cac6 237
Jeej 77:8c792719a1fc 238 g_com_tx_queue.put(d7a_com_new_msg(msg));
Jeej 26:9f0b9833cac6 239 }
Jeej 26:9f0b9833cac6 240
Jeej 30:d775c1409849 241 void d7a_com_dump(uint8_t* buf, uint8_t len, d7a_com_flow_t flow)
Jeej 30:d775c1409849 242 {
Jeej 30:d775c1409849 243 d7a_com_tx_msg_t msg;
Jeej 30:d775c1409849 244
Jeej 30:d775c1409849 245 msg.id = flow;
Jeej 30:d775c1409849 246 msg.pbuf = buf;
Jeej 30:d775c1409849 247 msg.plen = len;
Jeej 30:d775c1409849 248 msg.alen = 0;
Jeej 34:1311cc53201a 249 d7a_com_post_msg(&msg);
Jeej 30:d775c1409849 250 }
Jeej 30:d775c1409849 251
Jeej 25:aac250164497 252 static void d7a_com_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 253 {
Jeej 26:9f0b9833cac6 254 //FPRINT("\r\n");
Jeej 35:1fe2975c5a63 255
Jeej 79:82b01c1a62f6 256 COM_DPRINT("--> (0x%02X) %d\r\n", pkt->id, pkt->blen);
Jeej 35:1fe2975c5a63 257
Jeej 25:aac250164497 258 // Distribute packet types to processes
Jeej 25:aac250164497 259 switch (KAL_COM_FLOWID(pkt->id))
Jeej 25:aac250164497 260 {
Jeej 25:aac250164497 261 case KAL_COM_FLOWID_FS:
Jeej 25:aac250164497 262 d7a_fs_new_pkt(pkt);
Jeej 25:aac250164497 263 break;
Jeej 25:aac250164497 264 case KAL_COM_FLOWID_CMD:
Jeej 25:aac250164497 265 d7a_modem_new_pkt(pkt);
Jeej 25:aac250164497 266 break;
Jeej 45:b85384e7d825 267 case KAL_COM_FLOWID_ALP:
Jeej 45:b85384e7d825 268 d7a_alp_new_pkt(pkt);
Jeej 45:b85384e7d825 269 break;
Jeej 25:aac250164497 270 case KAL_COM_FLOWID_SYS:
Jeej 30:d775c1409849 271 // This has to be here to avoid going to another process
Jeej 30:d775c1409849 272 if (pkt->id == KAL_COM_FLOW_SYS_XON)
Jeej 30:d775c1409849 273 {
Jeej 65:ac3844adfe49 274 FREE(pkt);
Jeej 79:82b01c1a62f6 275 COM_DPRINT("XON\r\n");
Jeej 77:8c792719a1fc 276 g_com_tx_thread.signal_set(XON_SIGNAL);
Jeej 30:d775c1409849 277 }
Jeej 30:d775c1409849 278 else if (pkt->id == KAL_COM_FLOW_SYS_XOFF)
Jeej 30:d775c1409849 279 {
Jeej 65:ac3844adfe49 280 FREE(pkt);
Jeej 79:82b01c1a62f6 281 COM_DPRINT("XOFF\r\n");
Jeej 34:1311cc53201a 282 d7a_sys_xack();
Jeej 30:d775c1409849 283 }
Jeej 30:d775c1409849 284 else
Jeej 30:d775c1409849 285 {
Jeej 30:d775c1409849 286 d7a_sys_new_pkt(pkt);
Jeej 30:d775c1409849 287 }
Jeej 30:d775c1409849 288 break;
Jeej 25:aac250164497 289 default:
Jeej 25:aac250164497 290 EPRINT("Untreated pkt type 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 291 FREE(pkt);
Jeej 25:aac250164497 292 break;
Jeej 25:aac250164497 293 }
Jeej 25:aac250164497 294 }
Jeej 24:a8433b091764 295
Jeej 33:f9a542d3efaa 296
Jeej 24:a8433b091764 297 /**
Jeej 34:1311cc53201a 298 Reads the Rx buffer, parses the packets
Jeej 24:a8433b091764 299
Jeej 24:a8433b091764 300 @param void
Jeej 24:a8433b091764 301 @return void
Jeej 24:a8433b091764 302 */
Jeej 37:e04613e021f2 303 static void parse_packet_header(void)
Jeej 24:a8433b091764 304 {
Jeej 76:fda2e34ff19d 305 FPRINT("\r\n");
Jeej 76:fda2e34ff19d 306
Jeej 37:e04613e021f2 307 uint8_t header[KAL_COM_HEADER_LEN];
Jeej 37:e04613e021f2 308 uint8_t seqnum;
Jeej 33:f9a542d3efaa 309
Jeej 77:8c792719a1fc 310 ASSERT(g_com_rx_buf.available_data() >= KAL_COM_HEADER_LEN, "Not enough data for header\r\n");
Jeej 42:1578f0480dcb 311
Jeej 77:8c792719a1fc 312 g_com_skipped_bytes = 0;
Jeej 33:f9a542d3efaa 313
Jeej 77:8c792719a1fc 314 header[0] = g_com_rx_buf.pop();
Jeej 69:18852c154df9 315
Jeej 77:8c792719a1fc 316 while (g_com_rx_buf.available_data() >= KAL_COM_HEADER_LEN - 1)
Jeej 24:a8433b091764 317 {
Jeej 77:8c792719a1fc 318 header[1] = g_com_rx_buf.pop();
Jeej 69:18852c154df9 319
Jeej 69:18852c154df9 320 // Check sync bytes
Jeej 69:18852c154df9 321 if(KAL_COM_SYNC_BYTE_0 == header[0] && KAL_COM_SYNC_BYTE_1 == header[1])
Jeej 24:a8433b091764 322 {
Jeej 69:18852c154df9 323 // Copy header
Jeej 77:8c792719a1fc 324 g_com_rx_buf.get(&header[2], KAL_COM_HEADER_LEN - 2);
Jeej 69:18852c154df9 325
Jeej 69:18852c154df9 326 // Fill temp header
Jeej 77:8c792719a1fc 327 g_com_msg.blen = header[2];
Jeej 69:18852c154df9 328 seqnum = header[3];
Jeej 77:8c792719a1fc 329 g_com_msg.id = header[4];
Jeej 69:18852c154df9 330
Jeej 69:18852c154df9 331 // Update seqnum
Jeej 77:8c792719a1fc 332 WARNING(g_com_rx_seq == seqnum, "COM Bad seqnum expected:%d got:%d\r\n", g_com_rx_seq, seqnum);
Jeej 77:8c792719a1fc 333 g_com_rx_seq = seqnum + 1;
Jeej 69:18852c154df9 334
Jeej 69:18852c154df9 335 // search for body
Jeej 77:8c792719a1fc 336 g_com_state = SEARCH_BODY;
Jeej 69:18852c154df9 337
Jeej 69:18852c154df9 338 // Start parsing if data is already available
Jeej 77:8c792719a1fc 339 if (g_com_rx_buf.available_data() >= g_com_msg.blen)
Jeej 33:f9a542d3efaa 340 {
Jeej 77:8c792719a1fc 341 g_com_state = PARSE_BODY;
Jeej 77:8c792719a1fc 342 g_com_data_parsing.release();
Jeej 33:f9a542d3efaa 343 }
Jeej 69:18852c154df9 344
Jeej 79:82b01c1a62f6 345 //COM_DPRINT("COM header found (id: %02X seq: %d body: %d/%d bytes)\r\n", g_com_msg.id, seqnum, g_com_rx_buf.available_data(), g_com_msg.blen);
Jeej 69:18852c154df9 346 break;
Jeej 24:a8433b091764 347 }
Jeej 69:18852c154df9 348 else
Jeej 69:18852c154df9 349 {
Jeej 69:18852c154df9 350 // Shift by 1 byte
Jeej 69:18852c154df9 351 WARNING(false, "COM Skipped byte 0x%02X.\r\n", header[0]);
Jeej 69:18852c154df9 352 header[0] = header[1];
Jeej 69:18852c154df9 353 }
Jeej 37:e04613e021f2 354 }
Jeej 37:e04613e021f2 355 }
Jeej 37:e04613e021f2 356
Jeej 37:e04613e021f2 357 /**
Jeej 37:e04613e021f2 358 Reads the Rx buffer, parses the packets
Jeej 37:e04613e021f2 359
Jeej 37:e04613e021f2 360 @param void
Jeej 37:e04613e021f2 361 @return void
Jeej 37:e04613e021f2 362 */
Jeej 37:e04613e021f2 363 static void parse_packet_body(void)
Jeej 37:e04613e021f2 364 {
Jeej 77:8c792719a1fc 365 ASSERT(g_com_rx_buf.available_data() >= g_com_msg.blen, "Not enough data for body\r\n");
Jeej 42:1578f0480dcb 366
Jeej 77:8c792719a1fc 367 if (KAL_COM_FLOWID(g_com_msg.id) != KAL_COM_FLOWID_TRC)
Jeej 37:e04613e021f2 368 {
Jeej 79:82b01c1a62f6 369 //COM_DPRINT("COM body found (%d bytes)\r\n", g_com_msg.blen);
Jeej 37:e04613e021f2 370
Jeej 77:8c792719a1fc 371 d7a_com_rx_msg_t* pkt = (d7a_com_rx_msg_t*)MALLOC(sizeof(d7a_com_rx_msg_t) - 1 + g_com_msg.blen);
Jeej 37:e04613e021f2 372
Jeej 37:e04613e021f2 373 // copy data to buffer
Jeej 77:8c792719a1fc 374 pkt->blen = g_com_msg.blen;
Jeej 77:8c792719a1fc 375 pkt->id = g_com_msg.id;
Jeej 77:8c792719a1fc 376 g_com_rx_buf.get(pkt->buffer, g_com_msg.blen);
Jeej 65:ac3844adfe49 377
Jeej 37:e04613e021f2 378 // add packet to queue
Jeej 37:e04613e021f2 379 d7a_com_new_pkt(pkt);
Jeej 37:e04613e021f2 380 }
Jeej 37:e04613e021f2 381 else
Jeej 37:e04613e021f2 382 {
Jeej 37:e04613e021f2 383 // Ignore packet
Jeej 79:82b01c1a62f6 384 //COM_DPRINT("Ignore pkt id %02X\r\n", g_com_msg.id);
Jeej 77:8c792719a1fc 385 g_com_rx_buf.get(NULL, g_com_msg.blen);
Jeej 24:a8433b091764 386 }
Jeej 33:f9a542d3efaa 387
Jeej 69:18852c154df9 388 // Seach for next header
Jeej 77:8c792719a1fc 389 g_com_state = SEARCH_HEADER;
Jeej 42:1578f0480dcb 390
Jeej 42:1578f0480dcb 391 // Start parsing if data is already available
Jeej 77:8c792719a1fc 392 if (g_com_rx_buf.available_data() >= KAL_COM_HEADER_LEN)
Jeej 42:1578f0480dcb 393 {
Jeej 77:8c792719a1fc 394 g_com_state = PARSE_HEADER;
Jeej 77:8c792719a1fc 395 g_com_data_parsing.release();
Jeej 42:1578f0480dcb 396 }
Jeej 24:a8433b091764 397 }
Jeej 24:a8433b091764 398
Jeej 24:a8433b091764 399
Jeej 24:a8433b091764 400 // Thread for parsing packets from RX buffer.
Jeej 76:fda2e34ff19d 401 void d7a_com_rx_thread()
Jeej 24:a8433b091764 402 {
Jeej 58:38a366236bda 403 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 24:a8433b091764 404 while (true)
Jeej 24:a8433b091764 405 {
Jeej 24:a8433b091764 406 // wait for data available
Jeej 77:8c792719a1fc 407 g_com_data_parsing.wait();
Jeej 37:e04613e021f2 408
Jeej 77:8c792719a1fc 409 if (g_com_state == PARSE_HEADER)
Jeej 33:f9a542d3efaa 410 {
Jeej 37:e04613e021f2 411 parse_packet_header();
Jeej 37:e04613e021f2 412 }
Jeej 77:8c792719a1fc 413 else if (g_com_state == PARSE_BODY)
Jeej 37:e04613e021f2 414 {
Jeej 37:e04613e021f2 415 parse_packet_body();
Jeej 33:f9a542d3efaa 416 }
Jeej 24:a8433b091764 417 }
Jeej 24:a8433b091764 418 }
Jeej 31:ab9bfdbc6b44 419
Jeej 76:fda2e34ff19d 420 void d7a_com_tx_thread()
Jeej 31:ab9bfdbc6b44 421 {
Jeej 58:38a366236bda 422 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 31:ab9bfdbc6b44 423
Jeej 31:ab9bfdbc6b44 424 d7a_com_tx_buf_t* msg;
Jeej 31:ab9bfdbc6b44 425 osEvent evt;
Jeej 34:1311cc53201a 426 uint8_t flow_id;
Jeej 34:1311cc53201a 427
Jeej 31:ab9bfdbc6b44 428 while (true)
Jeej 31:ab9bfdbc6b44 429 {
Jeej 31:ab9bfdbc6b44 430 // wait for data to send
Jeej 77:8c792719a1fc 431 evt = g_com_tx_queue.get();
Jeej 31:ab9bfdbc6b44 432 msg = (evt.status == osEventMessage)? (d7a_com_tx_buf_t*)evt.value.p : NULL;
Jeej 37:e04613e021f2 433
Jeej 31:ab9bfdbc6b44 434
Jeej 31:ab9bfdbc6b44 435 // send message
Jeej 31:ab9bfdbc6b44 436 if (msg != NULL)
Jeej 31:ab9bfdbc6b44 437 {
Jeej 34:1311cc53201a 438 flow_id = msg->buf[4];
Jeej 34:1311cc53201a 439
Jeej 45:b85384e7d825 440 d7a_com_send(msg);
Jeej 31:ab9bfdbc6b44 441 FREE(msg);
Jeej 34:1311cc53201a 442
Jeej 34:1311cc53201a 443 if (KAL_COM_FLOW_SYS_XACK == flow_id)
Jeej 34:1311cc53201a 444 {
Jeej 79:82b01c1a62f6 445 COM_DPRINT("XACK\r\n");
Jeej 77:8c792719a1fc 446 g_com_tx_thread.signal_wait(XON_SIGNAL);
Jeej 34:1311cc53201a 447 }
Jeej 31:ab9bfdbc6b44 448 }
Jeej 31:ab9bfdbc6b44 449 }
Jeej 31:ab9bfdbc6b44 450 }