Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Nov 03 10:56:17 2016 +0000
Revision:
70:07b378285c95
Parent:
69:18852c154df9
Child:
71:f03727ff0f99
Fixed timing problem.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 43:28202405094d 1 #include "mbed.h"
Jeej 43:28202405094d 2 #include "rtos.h"
Jeej 43:28202405094d 3 #include "dbg.h"
Jeej 43:28202405094d 4 #include "d7a.h"
Jeej 43:28202405094d 5 #include "d7a_com.h"
Jeej 43:28202405094d 6 #include "d7a_common.h"
Jeej 43:28202405094d 7 #include "d7a_fs.h"
Jeej 43:28202405094d 8 #include "d7a_modem.h"
Jeej 43:28202405094d 9 #include "d7a_sys.h"
Jeej 43:28202405094d 10 #include "d7a_alp.h"
Jeej 67:9ac9d109b80a 11 #include "sha.h"
Jeej 43:28202405094d 12
Jeej 43:28202405094d 13 typedef struct {
Jeej 43:28202405094d 14 uint8_t tag;
Jeej 67:9ac9d109b80a 15 uint8_t buffer[256];
Jeej 43:28202405094d 16 Queue<d7a_com_rx_msg_t, 16> pkt_queue;
Jeej 45:b85384e7d825 17 Queue<d7a_com_rx_msg_t, 8> pl_queue;
Jeej 47:19f22e1a448a 18
Jeej 59:b42eae56b51b 19 UnsolicitedMsgFunction uns_msg;
Jeej 43:28202405094d 20 Thread* thread;
Jeej 43:28202405094d 21 } d7a_alp_ctx_t;
Jeej 43:28202405094d 22
Jeej 43:28202405094d 23 static d7a_alp_ctx_t g_alp_ctx;
Jeej 43:28202405094d 24
Jeej 43:28202405094d 25 void d7a_alp_thread(const void *p);
Jeej 43:28202405094d 26
Jeej 59:b42eae56b51b 27 d7a_errors_t d7a_alp_open(UnsolicitedMsgFunction uns_msg)
Jeej 43:28202405094d 28 {
Jeej 43:28202405094d 29 FPRINT("\r\n");
Jeej 43:28202405094d 30
Jeej 59:b42eae56b51b 31 g_alp_ctx.uns_msg = uns_msg;
Jeej 69:18852c154df9 32 g_alp_ctx.thread = new Thread(d7a_alp_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE*4);
Jeej 49:81d5bddb02f0 33
Jeej 49:81d5bddb02f0 34 return D7A_ERR_NONE;
Jeej 43:28202405094d 35 }
Jeej 43:28202405094d 36
Jeej 56:da34fc11e760 37 d7a_errors_t d7a_alp_close(void)
Jeej 56:da34fc11e760 38 {
Jeej 56:da34fc11e760 39 FPRINT("\r\n");
Jeej 56:da34fc11e760 40
Jeej 56:da34fc11e760 41 g_alp_ctx.thread->terminate();
Jeej 56:da34fc11e760 42
Jeej 56:da34fc11e760 43 return D7A_ERR_NONE;
Jeej 56:da34fc11e760 44 }
Jeej 56:da34fc11e760 45
Jeej 43:28202405094d 46 void d7a_alp_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 43:28202405094d 47 {
Jeej 43:28202405094d 48 FPRINT("\r\n");
Jeej 43:28202405094d 49 ASSERT(g_alp_ctx.pkt_queue.put(pkt) == osOK, "ALP queue full!\r\n");
Jeej 43:28202405094d 50 }
Jeej 43:28202405094d 51
Jeej 67:9ac9d109b80a 52 static void d7a_alp_new_pl(d7a_com_rx_msg_t* pl)
Jeej 45:b85384e7d825 53 {
Jeej 45:b85384e7d825 54 FPRINT("\r\n");
Jeej 45:b85384e7d825 55 ASSERT(g_alp_ctx.pl_queue.put(pl) == osOK, "ALP OP queue full!\r\n");
Jeej 45:b85384e7d825 56 }
Jeej 45:b85384e7d825 57
Jeej 67:9ac9d109b80a 58 static d7a_com_rx_msg_t* d7a_alp_wait_pkt(uint32_t millisec)
Jeej 43:28202405094d 59 {
Jeej 43:28202405094d 60 FPRINT("\r\n");
Jeej 43:28202405094d 61 osEvent evt = g_alp_ctx.pkt_queue.get(millisec);
Jeej 43:28202405094d 62 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 43:28202405094d 63 }
Jeej 43:28202405094d 64
Jeej 67:9ac9d109b80a 65 static d7a_com_rx_msg_t* d7a_alp_wait_pl(uint32_t millisec)
Jeej 43:28202405094d 66 {
Jeej 43:28202405094d 67 FPRINT("\r\n");
Jeej 45:b85384e7d825 68 osEvent evt = g_alp_ctx.pl_queue.get(millisec);
Jeej 45:b85384e7d825 69 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 43:28202405094d 70 }
Jeej 43:28202405094d 71
Jeej 58:38a366236bda 72 static uint32_t d7a_ctf_to_ti(d7a_ctf_t ctf)
Jeej 58:38a366236bda 73 {
Jeej 58:38a366236bda 74 return ((1 << (2*ctf.bf.exp)) * ctf.bf.mant);
Jeej 58:38a366236bda 75 }
Jeej 58:38a366236bda 76
Jeej 67:9ac9d109b80a 77 static uint32_t d7a_alp_encode_length(uint8_t* p, uint32_t len)
Jeej 43:28202405094d 78 {
Jeej 43:28202405094d 79 if (len <= 0x3F)
Jeej 43:28202405094d 80 {
Jeej 43:28202405094d 81 *p++ = len;
Jeej 43:28202405094d 82 return 1;
Jeej 43:28202405094d 83 }
Jeej 43:28202405094d 84 else if (len <= 0x3FFF)
Jeej 43:28202405094d 85 {
Jeej 43:28202405094d 86 *p++ = 0x40 + (uint8_t)(len >> 8);
Jeej 43:28202405094d 87 *p++ = (uint8_t)(len & 0xFF);
Jeej 43:28202405094d 88 return 2;
Jeej 43:28202405094d 89 }
Jeej 43:28202405094d 90 else if (len <= 0x3FFFFF)
Jeej 43:28202405094d 91 {
Jeej 43:28202405094d 92 *p++ = 0x80 + (uint8_t) (len >> 16);
Jeej 43:28202405094d 93 *p++ = (uint8_t)((len >> 8) & 0xFF);
Jeej 43:28202405094d 94 *p++ = (uint8_t) (len & 0xFF);
Jeej 43:28202405094d 95 return 3;
Jeej 43:28202405094d 96 }
Jeej 43:28202405094d 97 else
Jeej 43:28202405094d 98 {
Jeej 43:28202405094d 99 *p++ = 0xC0 + (uint8_t) (len >> 24);
Jeej 43:28202405094d 100 *p++ = (uint8_t)((len >> 16) & 0xFF);
Jeej 43:28202405094d 101 *p++ = (uint8_t)((len >> 8) & 0xFF);
Jeej 43:28202405094d 102 *p++ = (uint8_t) (len & 0xFF);
Jeej 43:28202405094d 103 return 4;
Jeej 43:28202405094d 104 }
Jeej 43:28202405094d 105 }
Jeej 43:28202405094d 106
Jeej 67:9ac9d109b80a 107 static uint32_t alp_decode_length(uint8_t* p, uint32_t* len)
Jeej 45:b85384e7d825 108 {
Jeej 45:b85384e7d825 109 uint32_t tmp = 0;
Jeej 45:b85384e7d825 110 switch ((*p) & 0xC0)
Jeej 45:b85384e7d825 111 {
Jeej 45:b85384e7d825 112 case 0xC0: // 0xCx xx xx xx
Jeej 45:b85384e7d825 113 tmp = (*p++ & 0x3F) << 24;
Jeej 45:b85384e7d825 114 tmp += *p++ << 16;
Jeej 45:b85384e7d825 115 tmp += *p++ << 8;
Jeej 45:b85384e7d825 116 tmp += *p++ << 0;
Jeej 45:b85384e7d825 117 *len = tmp;
Jeej 45:b85384e7d825 118 return 4;
Jeej 45:b85384e7d825 119 case 0x80: // 0x8x xx xx : 16384 <= Len <4194303
Jeej 45:b85384e7d825 120 tmp = (*p++ & 0x3F) << 16;
Jeej 45:b85384e7d825 121 tmp += *p++ << 8;
Jeej 45:b85384e7d825 122 if (tmp == 0) {
Jeej 45:b85384e7d825 123 // 0x8000 ActP special ActP code
Jeej 45:b85384e7d825 124 // Do not fetch the extra byte
Jeej 45:b85384e7d825 125 tmp = 2;
Jeej 45:b85384e7d825 126 }
Jeej 45:b85384e7d825 127 else
Jeej 45:b85384e7d825 128 {
Jeej 45:b85384e7d825 129 tmp += *p++ << 0;
Jeej 45:b85384e7d825 130 }
Jeej 45:b85384e7d825 131 *len = tmp;
Jeej 45:b85384e7d825 132 return 3;
Jeej 45:b85384e7d825 133 case 0x40: // 0x4x xx : 64 <= Len < 16383
Jeej 45:b85384e7d825 134 tmp = (*p++ & 0x3F) << 8;
Jeej 45:b85384e7d825 135 tmp += *p++ << 0;
Jeej 45:b85384e7d825 136 if (tmp == 0)
Jeej 45:b85384e7d825 137 {
Jeej 45:b85384e7d825 138 // 0x4000 ActP special ActP code
Jeej 45:b85384e7d825 139 tmp = 1;
Jeej 45:b85384e7d825 140 }
Jeej 45:b85384e7d825 141 *len = tmp;
Jeej 45:b85384e7d825 142 return 2;
Jeej 45:b85384e7d825 143 case 0: // Len <63
Jeej 45:b85384e7d825 144 tmp = (*p++ & 0x3F) << 0;
Jeej 45:b85384e7d825 145 *len = tmp;
Jeej 45:b85384e7d825 146 return 1;
Jeej 45:b85384e7d825 147 }
Jeej 45:b85384e7d825 148
Jeej 45:b85384e7d825 149 return 0;
Jeej 45:b85384e7d825 150 }
Jeej 43:28202405094d 151
Jeej 67:9ac9d109b80a 152 static uint32_t d7a_alp_add(uint8_t* p, const uint8_t* data, uint32_t len)
Jeej 43:28202405094d 153 {
Jeej 45:b85384e7d825 154 memcpy(p, data, len);
Jeej 43:28202405094d 155
Jeej 43:28202405094d 156 return len;
Jeej 43:28202405094d 157 }
Jeej 43:28202405094d 158
Jeej 59:b42eae56b51b 159 void d7a_alp_free_msg(d7a_msg_t* msg)
Jeej 59:b42eae56b51b 160 {
Jeej 67:9ac9d109b80a 161 FPRINT("\r\n");
Jeej 67:9ac9d109b80a 162
Jeej 59:b42eae56b51b 163 if (msg->data)
Jeej 59:b42eae56b51b 164 {
Jeej 59:b42eae56b51b 165 FREE(msg->data);
Jeej 59:b42eae56b51b 166 }
Jeej 59:b42eae56b51b 167 FREE(msg);
Jeej 59:b42eae56b51b 168 }
Jeej 59:b42eae56b51b 169
Jeej 67:9ac9d109b80a 170 static d7a_msg_t* d7a_alp_new_msg(void)
Jeej 59:b42eae56b51b 171 {
Jeej 67:9ac9d109b80a 172 FPRINT("\r\n");
Jeej 67:9ac9d109b80a 173
Jeej 59:b42eae56b51b 174 d7a_msg_t* msg = (d7a_msg_t*)MALLOC(sizeof(d7a_msg_t));
Jeej 59:b42eae56b51b 175 memset(msg, 0, sizeof(d7a_msg_t));
Jeej 59:b42eae56b51b 176 msg->err = D7A_ERR_NONE;
Jeej 59:b42eae56b51b 177
Jeej 59:b42eae56b51b 178 return msg;
Jeej 59:b42eae56b51b 179 }
Jeej 58:38a366236bda 180
Jeej 67:9ac9d109b80a 181 static d7a_alp_rsp_t* d7a_alp_parse_pl(d7a_com_rx_msg_t* pkt)
Jeej 67:9ac9d109b80a 182 {
Jeej 67:9ac9d109b80a 183 FPRINT("\r\n");
Jeej 67:9ac9d109b80a 184
Jeej 46:665391110051 185 if (pkt == NULL)
Jeej 46:665391110051 186 {
Jeej 46:665391110051 187 return NULL;
Jeej 46:665391110051 188 }
Jeej 46:665391110051 189
Jeej 45:b85384e7d825 190 uint8_t* p = pkt->buffer;
Jeej 45:b85384e7d825 191 uint8_t* t = p;
Jeej 45:b85384e7d825 192 uint8_t len = pkt->blen;
Jeej 45:b85384e7d825 193
Jeej 45:b85384e7d825 194 d7a_alp_rsp_t* rsp = (d7a_alp_rsp_t*)MALLOC(sizeof(d7a_alp_rsp_t));
Jeej 59:b42eae56b51b 195 rsp->tag = NO_TAG;
Jeej 59:b42eae56b51b 196 rsp->eop = false;
Jeej 59:b42eae56b51b 197 rsp->msg = d7a_alp_new_msg();
Jeej 45:b85384e7d825 198
Jeej 45:b85384e7d825 199 while ((p - t) < len)
Jeej 45:b85384e7d825 200 {
Jeej 45:b85384e7d825 201 uint8_t ctrl = *p++;
Jeej 45:b85384e7d825 202 switch (ctrl & 0x3F)
Jeej 45:b85384e7d825 203 {
Jeej 45:b85384e7d825 204 case ALP_OPCODE_RSP_STATUS:
Jeej 46:665391110051 205 if (ctrl & ALP_OPCODE_INDIRECT)
Jeej 46:665391110051 206 {
Jeej 58:38a366236bda 207 // ITF Type
Jeej 58:38a366236bda 208 uint8_t type = *p++;
Jeej 58:38a366236bda 209 // Length
Jeej 46:665391110051 210 uint32_t length;
Jeej 58:38a366236bda 211 p += alp_decode_length(p, &length);
Jeej 58:38a366236bda 212 // Data
Jeej 58:38a366236bda 213 d7a_sp_res_t* res = (d7a_sp_res_t*)p;
Jeej 58:38a366236bda 214 p += length;
Jeej 58:38a366236bda 215
Jeej 58:38a366236bda 216 // Fill corresponding fields
Jeej 59:b42eae56b51b 217 rsp->msg->lb = res->lb; // Get Link Budget
Jeej 61:87be16080640 218 rsp->msg->rxlev = res->rxlev; // Get RXLEV
Jeej 59:b42eae56b51b 219 memcpy(rsp->msg->id, res->addressee.id, D7A_UID_LEN); // Get UID
Jeej 58:38a366236bda 220
Jeej 59:b42eae56b51b 221 DPRINT("ALP RSP ISTATUS type:%02X lb: %3d ", type, rsp->msg->lb);
Jeej 59:b42eae56b51b 222 DPRINT_DATA("UID:", "%02X", rsp->msg->id, D7A_UID_LEN, "\r\n");
Jeej 46:665391110051 223 }
Jeej 46:665391110051 224 else
Jeej 46:665391110051 225 {
Jeej 59:b42eae56b51b 226 uint8_t aid = *p++; // Action ID
Jeej 59:b42eae56b51b 227 rsp->msg->err = *p++; // Status
Jeej 59:b42eae56b51b 228 DPRINT("ALP RSP STATUS aid:%d Status:%d\r\n", aid, rsp->msg->err);
Jeej 46:665391110051 229 }
Jeej 45:b85384e7d825 230 break;
Jeej 45:b85384e7d825 231 case ALP_OPCODE_RSP_TAG:
Jeej 59:b42eae56b51b 232 rsp->eop = !!(ctrl & ALP_CTRL_EOP);
Jeej 45:b85384e7d825 233 rsp->tag = *p++; // TAG
Jeej 59:b42eae56b51b 234 DPRINT("ALP RSP TAG %d EOP %d\r\n", rsp->tag, rsp->eop);
Jeej 45:b85384e7d825 235 break;
Jeej 45:b85384e7d825 236 case ALP_OPCODE_RSP_F_DATA:
Jeej 59:b42eae56b51b 237 uint8_t fid;
Jeej 45:b85384e7d825 238 uint32_t offset;
Jeej 59:b42eae56b51b 239 uint32_t length;
Jeej 59:b42eae56b51b 240 fid = *p++; // File ID
Jeej 45:b85384e7d825 241 p += alp_decode_length(p, &offset); // offset
Jeej 59:b42eae56b51b 242 p += alp_decode_length(p, &length); // length
Jeej 59:b42eae56b51b 243 rsp->msg->data = (d7a_data_t*)MALLOC(sizeof(d7a_data_t) - 1 + length);
Jeej 59:b42eae56b51b 244 rsp->msg->data->fid = fid;
Jeej 59:b42eae56b51b 245 rsp->msg->data->offset = offset;
Jeej 59:b42eae56b51b 246 rsp->msg->data->length = length;
Jeej 59:b42eae56b51b 247 p += d7a_alp_add(rsp->msg->data->buf, p, length);
Jeej 59:b42eae56b51b 248 DPRINT("ALP RSP F_DATA f:%d o:%d s:%d\r\n", fid, offset, length);
Jeej 59:b42eae56b51b 249 //DPRINT_DATA("DATA: ", "%02X ", (uint8_t*)rsp->data, rsp->data_len, "\r\n");
Jeej 45:b85384e7d825 250 break;
Jeej 45:b85384e7d825 251 default:
Jeej 45:b85384e7d825 252 WARNING(false, "ALP Untreated OP %d\r\n", ctrl);
Jeej 45:b85384e7d825 253 break;
Jeej 45:b85384e7d825 254 }
Jeej 45:b85384e7d825 255 }
Jeej 45:b85384e7d825 256
Jeej 45:b85384e7d825 257 ASSERT((p - t) == len, "Payload wrong size: %d expected %d\r\n", (p - t), len);
Jeej 67:9ac9d109b80a 258
Jeej 45:b85384e7d825 259 return rsp;
Jeej 45:b85384e7d825 260 }
Jeej 45:b85384e7d825 261
Jeej 45:b85384e7d825 262
Jeej 67:9ac9d109b80a 263 static uint32_t d7a_alp_tag(uint8_t* p, bool eop)
Jeej 43:28202405094d 264 {
Jeej 43:28202405094d 265 uint8_t* t = p;
Jeej 43:28202405094d 266
Jeej 45:b85384e7d825 267 *p++ = ALP_OPCODE_TAG + ((eop)? ALP_CTRL_EOP : 0);
Jeej 43:28202405094d 268 *p++ = ++g_alp_ctx.tag;
Jeej 43:28202405094d 269
Jeej 43:28202405094d 270 return (uint32_t)(p - t);
Jeej 43:28202405094d 271 }
Jeej 43:28202405094d 272
Jeej 67:9ac9d109b80a 273 static uint32_t d7a_alp_forward_action(uint8_t* p, alp_d7a_itf_t* itf, bool resp)
Jeej 43:28202405094d 274 {
Jeej 43:28202405094d 275 uint8_t* t = p;
Jeej 43:28202405094d 276
Jeej 58:38a366236bda 277 uint32_t itf_size = sizeof(alp_d7a_itf_t);
Jeej 58:38a366236bda 278 switch (itf->cfg.addressee.ctrl.bf.idf)
Jeej 58:38a366236bda 279 {
Jeej 58:38a366236bda 280 case D7A_ID_NBID:
Jeej 58:38a366236bda 281 itf_size -= 7;
Jeej 58:38a366236bda 282 break;
Jeej 58:38a366236bda 283 case D7A_ID_NOID:
Jeej 58:38a366236bda 284 itf_size -= 8;
Jeej 58:38a366236bda 285 break;
Jeej 58:38a366236bda 286 case D7A_ID_UID:
Jeej 58:38a366236bda 287 break;
Jeej 58:38a366236bda 288 case D7A_ID_VID:
Jeej 58:38a366236bda 289 itf_size -= 4;
Jeej 58:38a366236bda 290 break;
Jeej 58:38a366236bda 291 default:
Jeej 58:38a366236bda 292 break;
Jeej 58:38a366236bda 293 }
Jeej 58:38a366236bda 294
Jeej 45:b85384e7d825 295 *p++ = ALP_OPCODE_FORWARD + ((resp)? ALP_CTRL_RESP : 0);
Jeej 58:38a366236bda 296 p += d7a_alp_add(p, (uint8_t*)itf, itf_size);
Jeej 43:28202405094d 297
Jeej 43:28202405094d 298 return (uint32_t)(p - t);
Jeej 43:28202405094d 299 }
Jeej 43:28202405094d 300
Jeej 67:9ac9d109b80a 301 static uint32_t d7a_alp_write_action(uint8_t* p, const uint8_t file_id, const uint32_t offset, const uint32_t size, const uint8_t* const buf, bool resp)
Jeej 43:28202405094d 302 {
Jeej 43:28202405094d 303 uint8_t* t = p;
Jeej 43:28202405094d 304
Jeej 45:b85384e7d825 305 *p++ = ALP_OPCODE_F_WR_DATA + ((resp)? ALP_CTRL_RESP : 0);
Jeej 43:28202405094d 306 *p++ = file_id;
Jeej 43:28202405094d 307 p += d7a_alp_encode_length(p, offset);
Jeej 43:28202405094d 308 p += d7a_alp_encode_length(p, size);
Jeej 43:28202405094d 309 p += d7a_alp_add(p, buf, size);
Jeej 43:28202405094d 310
Jeej 43:28202405094d 311 return (uint32_t)(p - t);
Jeej 43:28202405094d 312 }
Jeej 43:28202405094d 313
Jeej 67:9ac9d109b80a 314 static uint32_t d7a_alp_read_action(uint8_t* p, const uint8_t file_id, const uint32_t offset, const uint32_t size, bool resp)
Jeej 43:28202405094d 315 {
Jeej 43:28202405094d 316 uint8_t* t = p;
Jeej 43:28202405094d 317
Jeej 45:b85384e7d825 318 *p++ = ALP_OPCODE_F_RD_DATA + ((resp)? ALP_CTRL_RESP : 0);
Jeej 43:28202405094d 319 *p++ = file_id;
Jeej 43:28202405094d 320 p += d7a_alp_encode_length(p, offset);
Jeej 43:28202405094d 321 p += d7a_alp_encode_length(p, size);
Jeej 43:28202405094d 322
Jeej 43:28202405094d 323 return (uint32_t)(p - t);
Jeej 43:28202405094d 324 }
Jeej 43:28202405094d 325
Jeej 67:9ac9d109b80a 326 static uint32_t d7a_alp_perm_request_action(uint8_t* p, uint8_t* req, uint32_t req_size, const uint8_t* root_key, bool resp)
Jeej 43:28202405094d 327 {
Jeej 67:9ac9d109b80a 328 uint8_t* t = p;
Jeej 67:9ac9d109b80a 329 uint8_t hash[32];
Jeej 67:9ac9d109b80a 330
Jeej 67:9ac9d109b80a 331 *p++ = ALP_OPCODE_PERM_REQ + ((resp)? ALP_CTRL_RESP : 0);
Jeej 67:9ac9d109b80a 332 *p++ = 1; // ROOT request
Jeej 67:9ac9d109b80a 333 *p++ = 42; // Auth protocol ID
Jeej 67:9ac9d109b80a 334 sha256_init();
Jeej 67:9ac9d109b80a 335 sha256_update(req, req_size);
Jeej 67:9ac9d109b80a 336 sha256_update((uint8_t*)root_key, D7A_ROOT_KEY_SIZE);
Jeej 67:9ac9d109b80a 337 sha256_final(hash);
Jeej 67:9ac9d109b80a 338 //PRINT_DATA("Token: ", "%02X", hash, D7A_AUTH_PROTOCOLE_TOKEN_SIZE, "\r\n");
Jeej 67:9ac9d109b80a 339 p += d7a_alp_add(p, hash, D7A_AUTH_PROTOCOLE_TOKEN_SIZE);
Jeej 67:9ac9d109b80a 340
Jeej 67:9ac9d109b80a 341 return (uint32_t)(p - t);
Jeej 67:9ac9d109b80a 342 }
Jeej 67:9ac9d109b80a 343
Jeej 67:9ac9d109b80a 344 static uint32_t d7a_alp_flush_action(uint8_t* p, uint8_t fid, bool resp)
Jeej 67:9ac9d109b80a 345 {
Jeej 67:9ac9d109b80a 346 uint8_t* t = p;
Jeej 67:9ac9d109b80a 347
Jeej 67:9ac9d109b80a 348 *p++ = ALP_OPCODE_F_FLUSH + ((resp)? ALP_CTRL_RESP : 0);
Jeej 67:9ac9d109b80a 349 *p++ = fid;
Jeej 67:9ac9d109b80a 350
Jeej 67:9ac9d109b80a 351 return (uint32_t)(p - t);
Jeej 67:9ac9d109b80a 352 }
Jeej 67:9ac9d109b80a 353
Jeej 67:9ac9d109b80a 354 static void d7a_alp_construct_resp(d7a_msg_t** ret, uint8_t current_tag, uint32_t max_responses)
Jeej 67:9ac9d109b80a 355 {
Jeej 67:9ac9d109b80a 356 FPRINT("\r\n");
Jeej 67:9ac9d109b80a 357
Jeej 59:b42eae56b51b 358 int i = 0;
Jeej 59:b42eae56b51b 359 d7a_alp_rsp_t* pl = NULL;
Jeej 59:b42eae56b51b 360 d7a_com_rx_msg_t* pkt = NULL;
Jeej 70:07b378285c95 361 int32_t time;
Jeej 70:07b378285c95 362 Timer timeout;
Jeej 70:07b378285c95 363
Jeej 70:07b378285c95 364 timeout.start();
Jeej 59:b42eae56b51b 365
Jeej 59:b42eae56b51b 366 // Parse responses
Jeej 59:b42eae56b51b 367 do
Jeej 43:28202405094d 368 {
Jeej 70:07b378285c95 369 time = D7A_ALP_RESP_TO - timeout.read_ms();
Jeej 70:07b378285c95 370 if (time < 0) time = 0;
Jeej 70:07b378285c95 371
Jeej 70:07b378285c95 372 pkt = d7a_alp_wait_pl(time);
Jeej 59:b42eae56b51b 373
Jeej 59:b42eae56b51b 374 if (pkt == NULL)
Jeej 59:b42eae56b51b 375 {
Jeej 59:b42eae56b51b 376 ret[i] = d7a_alp_new_msg();
Jeej 59:b42eae56b51b 377 ret[i]->err = D7A_ERR_CMD_TO;
Jeej 59:b42eae56b51b 378 break;
Jeej 59:b42eae56b51b 379 }
Jeej 59:b42eae56b51b 380
Jeej 59:b42eae56b51b 381 pl = d7a_alp_parse_pl(pkt);
Jeej 67:9ac9d109b80a 382
Jeej 59:b42eae56b51b 383 // Check TAG
Jeej 59:b42eae56b51b 384 if (pl->tag == NO_TAG)
Jeej 59:b42eae56b51b 385 {
Jeej 59:b42eae56b51b 386 WARNING(false, "No tag in payload expected %d\r\n", current_tag);
Jeej 59:b42eae56b51b 387 FREE(pkt);
Jeej 59:b42eae56b51b 388 d7a_alp_free_msg(pl->msg);
Jeej 59:b42eae56b51b 389 FREE(pl);
Jeej 59:b42eae56b51b 390 ret[i] = d7a_alp_new_msg();
Jeej 59:b42eae56b51b 391 ret[i]->err = D7A_ERR_UNKNOWN;
Jeej 59:b42eae56b51b 392 break;
Jeej 59:b42eae56b51b 393 }
Jeej 59:b42eae56b51b 394
Jeej 59:b42eae56b51b 395 if (pl->tag != current_tag)
Jeej 59:b42eae56b51b 396 {
Jeej 59:b42eae56b51b 397 WARNING(false, "Ingnoring tag %d expecting %d\r\n", pl->tag, current_tag);
Jeej 59:b42eae56b51b 398 d7a_alp_free_msg(pl->msg);
Jeej 59:b42eae56b51b 399 FREE(pl);
Jeej 59:b42eae56b51b 400 d7a_alp_new_pl(pkt);
Jeej 59:b42eae56b51b 401 continue;
Jeej 59:b42eae56b51b 402 }
Jeej 59:b42eae56b51b 403
Jeej 59:b42eae56b51b 404 FREE(pkt);
Jeej 59:b42eae56b51b 405
Jeej 59:b42eae56b51b 406 // Check for END OF PAYLOAD
Jeej 59:b42eae56b51b 407 if (pl->eop)
Jeej 59:b42eae56b51b 408 {
Jeej 59:b42eae56b51b 409 DPRINT("EOP\r\n");
Jeej 59:b42eae56b51b 410
Jeej 59:b42eae56b51b 411 // If tag only
Jeej 62:f1e4da5162c2 412 if (!pl->msg->data && !pl->msg->lb && i != 0)
Jeej 59:b42eae56b51b 413 {
Jeej 59:b42eae56b51b 414 // Ignore response
Jeej 59:b42eae56b51b 415 d7a_alp_free_msg(pl->msg);
Jeej 59:b42eae56b51b 416 }
Jeej 59:b42eae56b51b 417 else
Jeej 59:b42eae56b51b 418 {
Jeej 59:b42eae56b51b 419 DPRINT("last response (err %d)\r\n", pl->msg->err);
Jeej 59:b42eae56b51b 420 ret[i] = pl->msg;
Jeej 59:b42eae56b51b 421 }
Jeej 59:b42eae56b51b 422
Jeej 59:b42eae56b51b 423 FREE(pl);
Jeej 59:b42eae56b51b 424 break;
Jeej 59:b42eae56b51b 425 }
Jeej 59:b42eae56b51b 426 // Wait for new msg
Jeej 59:b42eae56b51b 427 else
Jeej 59:b42eae56b51b 428 {
Jeej 59:b42eae56b51b 429 DPRINT("next response (err %d)\r\n", pl->msg->err);
Jeej 59:b42eae56b51b 430 ret[i] = pl->msg;
Jeej 59:b42eae56b51b 431 FREE(pl);
Jeej 59:b42eae56b51b 432 i++;
Jeej 59:b42eae56b51b 433 ASSERT(i <= max_responses, "Too much responses! max: %d\r\n", max_responses);
Jeej 59:b42eae56b51b 434 }
Jeej 59:b42eae56b51b 435
Jeej 59:b42eae56b51b 436 } while (1);
Jeej 58:38a366236bda 437 }
Jeej 45:b85384e7d825 438
Jeej 67:9ac9d109b80a 439 d7a_msg_t** d7a_alp_write_file(const uint8_t file_id, const uint32_t offset, const uint32_t size, const uint8_t* const buf, const uint8_t* root_key, d7a_addressee_t* addressee, uint8_t retry, bool resp)
Jeej 43:28202405094d 440 {
Jeej 67:9ac9d109b80a 441 FPRINT("\r\n");
Jeej 67:9ac9d109b80a 442
Jeej 58:38a366236bda 443 // Get command buffer
Jeej 43:28202405094d 444 uint8_t* p = &g_alp_ctx.buffer[0];
Jeej 58:38a366236bda 445 // Save initial position of the command buffer
Jeej 43:28202405094d 446 uint8_t* t = p;
Jeej 43:28202405094d 447
Jeej 58:38a366236bda 448 bool broadcast = false;
Jeej 58:38a366236bda 449 uint8_t current_tag;
Jeej 58:38a366236bda 450 d7a_msg_t** ret = NULL;
Jeej 60:8d4133fbc060 451 uint32_t max_responses = 2;
Jeej 58:38a366236bda 452 uint8_t i;
Jeej 58:38a366236bda 453
Jeej 58:38a366236bda 454 if (addressee)
Jeej 58:38a366236bda 455 {
Jeej 58:38a366236bda 456 if (addressee->ctrl.bf.idf == D7A_ID_NBID)
Jeej 58:38a366236bda 457 {
Jeej 58:38a366236bda 458 broadcast = true;
Jeej 58:38a366236bda 459 d7a_ctf_t ctf;
Jeej 58:38a366236bda 460 ctf.byte = addressee->id[0];
Jeej 60:8d4133fbc060 461 max_responses = ((1 << (2*ctf.bf.exp)) * ctf.bf.mant) + 1;
Jeej 58:38a366236bda 462 }
Jeej 58:38a366236bda 463 else if (addressee->ctrl.bf.idf == D7A_ID_NOID)
Jeej 58:38a366236bda 464 {
Jeej 58:38a366236bda 465 broadcast = true;
Jeej 60:8d4133fbc060 466 max_responses = 33;
Jeej 58:38a366236bda 467 }
Jeej 58:38a366236bda 468 }
Jeej 58:38a366236bda 469
Jeej 58:38a366236bda 470 // malloc and init pointer array
Jeej 58:38a366236bda 471 ret = (d7a_msg_t**)MALLOC(sizeof(d7a_msg_t*) * (max_responses + 1));
Jeej 58:38a366236bda 472 for (i = 0; i < (max_responses + 1); i++)
Jeej 58:38a366236bda 473 {
Jeej 58:38a366236bda 474 ret[i] = NULL;
Jeej 58:38a366236bda 475 }
Jeej 60:8d4133fbc060 476
Jeej 58:38a366236bda 477 // Construct command
Jeej 58:38a366236bda 478
Jeej 43:28202405094d 479 // Tag action
Jeej 45:b85384e7d825 480 p += d7a_alp_tag(p, true);
Jeej 58:38a366236bda 481
Jeej 58:38a366236bda 482 // get tag
Jeej 58:38a366236bda 483 current_tag = g_alp_ctx.tag;
Jeej 58:38a366236bda 484
Jeej 45:b85384e7d825 485 if (addressee)
Jeej 45:b85384e7d825 486 {
Jeej 46:665391110051 487 // Construct interface
Jeej 46:665391110051 488 alp_d7a_itf_t itf = {
Jeej 58:38a366236bda 489 // Dash7 interface
Jeej 58:38a366236bda 490 .type = 0xD7,
Jeej 58:38a366236bda 491 // Switch response type if broadcast
Jeej 58:38a366236bda 492 .cfg.qos.bf.resp = (broadcast)? D7A_RESP_ALL : D7A_RESP_ANY,
Jeej 46:665391110051 493 .cfg.qos.bf.retry = retry,
Jeej 46:665391110051 494 .cfg.qos.bf.record = 0,
Jeej 46:665391110051 495 .cfg.qos.bf.stop_on_err = 0,
Jeej 46:665391110051 496 .cfg.dorm_to.byte = 0,
Jeej 46:665391110051 497 };
Jeej 46:665391110051 498 memcpy(&itf.cfg.addressee, addressee, sizeof(d7a_addressee_t));
Jeej 58:38a366236bda 499
Jeej 58:38a366236bda 500 // Forward action
Jeej 46:665391110051 501 p += d7a_alp_forward_action(p, &itf, true);
Jeej 45:b85384e7d825 502 }
Jeej 45:b85384e7d825 503
Jeej 67:9ac9d109b80a 504 // Ask for root permissions
Jeej 67:9ac9d109b80a 505 if (root_key)
Jeej 67:9ac9d109b80a 506 {
Jeej 67:9ac9d109b80a 507 uint8_t req[100];
Jeej 67:9ac9d109b80a 508 uint8_t req_size = d7a_alp_write_action(req, file_id, offset, size, buf, resp);
Jeej 67:9ac9d109b80a 509 p += d7a_alp_perm_request_action(p, req, req_size, root_key, false);
Jeej 67:9ac9d109b80a 510 }
Jeej 67:9ac9d109b80a 511
Jeej 45:b85384e7d825 512 // Write action
Jeej 45:b85384e7d825 513 p += d7a_alp_write_action(p, file_id, offset, size, buf, resp);
Jeej 45:b85384e7d825 514
Jeej 58:38a366236bda 515 // Send command
Jeej 45:b85384e7d825 516 d7a_com_dump(&g_alp_ctx.buffer[0], (uint8_t)(p - t), KAL_COM_FLOW_AT_CMD);
Jeej 59:b42eae56b51b 517
Jeej 58:38a366236bda 518 // Parse responses
Jeej 59:b42eae56b51b 519 d7a_alp_construct_resp(ret, current_tag, max_responses);
Jeej 45:b85384e7d825 520
Jeej 58:38a366236bda 521 return ret;
Jeej 45:b85384e7d825 522 }
Jeej 45:b85384e7d825 523
Jeej 67:9ac9d109b80a 524 d7a_msg_t** d7a_alp_read_file(const uint8_t file_id, const uint32_t offset, const uint32_t size, const uint8_t* root_key, d7a_addressee_t* addressee, uint8_t retry)
Jeej 45:b85384e7d825 525 {
Jeej 67:9ac9d109b80a 526 FPRINT("\r\n");
Jeej 67:9ac9d109b80a 527
Jeej 58:38a366236bda 528 // Get command buffer
Jeej 45:b85384e7d825 529 uint8_t* p = &g_alp_ctx.buffer[0];
Jeej 58:38a366236bda 530 // Save initial position of the command buffer
Jeej 45:b85384e7d825 531 uint8_t* t = p;
Jeej 45:b85384e7d825 532
Jeej 58:38a366236bda 533 bool broadcast = false;
Jeej 58:38a366236bda 534 uint8_t current_tag;
Jeej 58:38a366236bda 535 d7a_msg_t** ret = NULL;
Jeej 60:8d4133fbc060 536 uint32_t max_responses = 2;
Jeej 58:38a366236bda 537 uint8_t i;
Jeej 58:38a366236bda 538
Jeej 58:38a366236bda 539 if (addressee)
Jeej 58:38a366236bda 540 {
Jeej 58:38a366236bda 541 if (addressee->ctrl.bf.idf == D7A_ID_NBID)
Jeej 58:38a366236bda 542 {
Jeej 58:38a366236bda 543 broadcast = true;
Jeej 58:38a366236bda 544 d7a_ctf_t ctf;
Jeej 58:38a366236bda 545 ctf.byte = addressee->id[0];
Jeej 60:8d4133fbc060 546 max_responses = ((1 << (2*ctf.bf.exp)) * ctf.bf.mant) + 1;
Jeej 58:38a366236bda 547 }
Jeej 58:38a366236bda 548 else if (addressee->ctrl.bf.idf == D7A_ID_NOID)
Jeej 58:38a366236bda 549 {
Jeej 58:38a366236bda 550 broadcast = true;
Jeej 60:8d4133fbc060 551 max_responses = 33;
Jeej 58:38a366236bda 552 }
Jeej 58:38a366236bda 553 }
Jeej 58:38a366236bda 554
Jeej 58:38a366236bda 555 // malloc and init pointer array
Jeej 58:38a366236bda 556 ret = (d7a_msg_t**)MALLOC(sizeof(d7a_msg_t*) * (max_responses + 1));
Jeej 58:38a366236bda 557 for (i = 0; i < (max_responses + 1); i++)
Jeej 58:38a366236bda 558 {
Jeej 58:38a366236bda 559 ret[i] = NULL;
Jeej 58:38a366236bda 560 }
Jeej 58:38a366236bda 561
Jeej 58:38a366236bda 562 // Construct command
Jeej 58:38a366236bda 563
Jeej 45:b85384e7d825 564 // Tag action
Jeej 45:b85384e7d825 565 p += d7a_alp_tag(p, true);
Jeej 43:28202405094d 566
Jeej 58:38a366236bda 567 // get tag
Jeej 58:38a366236bda 568 current_tag = g_alp_ctx.tag;
Jeej 58:38a366236bda 569
Jeej 43:28202405094d 570 if (addressee)
Jeej 43:28202405094d 571 {
Jeej 46:665391110051 572 // Construct interface
Jeej 46:665391110051 573 alp_d7a_itf_t itf = {
Jeej 58:38a366236bda 574 // Dash7 interface
Jeej 58:38a366236bda 575 .type = 0xD7,
Jeej 58:38a366236bda 576 // Switch response type if broadcast
Jeej 58:38a366236bda 577 //.cfg.qos.bf.resp = (broadcast)? D7A_RESP_ALL : D7A_RESP_ANY,
Jeej 58:38a366236bda 578 .cfg.qos.bf.resp = D7A_RESP_ALL,
Jeej 46:665391110051 579 .cfg.qos.bf.retry = retry,
Jeej 46:665391110051 580 .cfg.qos.bf.record = 0,
Jeej 46:665391110051 581 .cfg.qos.bf.stop_on_err = 0,
Jeej 46:665391110051 582 .cfg.dorm_to.byte = 0,
Jeej 46:665391110051 583 };
Jeej 46:665391110051 584 memcpy(&itf.cfg.addressee, addressee, sizeof(d7a_addressee_t));
Jeej 58:38a366236bda 585
Jeej 58:38a366236bda 586 // Forward action
Jeej 46:665391110051 587 p += d7a_alp_forward_action(p, &itf, true);
Jeej 43:28202405094d 588 }
Jeej 43:28202405094d 589
Jeej 67:9ac9d109b80a 590 // Ask for root permissions
Jeej 67:9ac9d109b80a 591 if (root_key)
Jeej 67:9ac9d109b80a 592 {
Jeej 67:9ac9d109b80a 593 uint8_t req[100];
Jeej 67:9ac9d109b80a 594 uint8_t req_size = d7a_alp_read_action(req, file_id, offset, size, true);
Jeej 67:9ac9d109b80a 595 p += d7a_alp_perm_request_action(p, req, req_size, root_key, false);
Jeej 67:9ac9d109b80a 596 }
Jeej 67:9ac9d109b80a 597
Jeej 43:28202405094d 598 // Read action
Jeej 58:38a366236bda 599 p += d7a_alp_read_action(p, file_id, offset, size, true);
Jeej 45:b85384e7d825 600
Jeej 58:38a366236bda 601 // Send command
Jeej 58:38a366236bda 602 d7a_com_dump(&g_alp_ctx.buffer[0], (uint8_t)(p - t), KAL_COM_FLOW_AT_CMD);
Jeej 59:b42eae56b51b 603
Jeej 58:38a366236bda 604 // Parse responses
Jeej 59:b42eae56b51b 605 d7a_alp_construct_resp(ret, current_tag, max_responses);
Jeej 45:b85384e7d825 606
Jeej 58:38a366236bda 607 return ret;
Jeej 43:28202405094d 608 }
Jeej 43:28202405094d 609
Jeej 67:9ac9d109b80a 610
Jeej 67:9ac9d109b80a 611 d7a_msg_t** d7a_alp_flush_file(const uint8_t file_id, const uint8_t* root_key, d7a_addressee_t* addressee, uint8_t retry, bool resp)
Jeej 67:9ac9d109b80a 612 {
Jeej 67:9ac9d109b80a 613 FPRINT("\r\n");
Jeej 67:9ac9d109b80a 614
Jeej 67:9ac9d109b80a 615 // Get command buffer
Jeej 67:9ac9d109b80a 616 uint8_t* p = &g_alp_ctx.buffer[0];
Jeej 67:9ac9d109b80a 617 // Save initial position of the command buffer
Jeej 67:9ac9d109b80a 618 uint8_t* t = p;
Jeej 67:9ac9d109b80a 619
Jeej 67:9ac9d109b80a 620 bool broadcast = false;
Jeej 67:9ac9d109b80a 621 uint8_t current_tag;
Jeej 67:9ac9d109b80a 622 d7a_msg_t** ret = NULL;
Jeej 67:9ac9d109b80a 623 uint32_t max_responses = 2;
Jeej 67:9ac9d109b80a 624 uint8_t i;
Jeej 67:9ac9d109b80a 625
Jeej 67:9ac9d109b80a 626 if (addressee)
Jeej 67:9ac9d109b80a 627 {
Jeej 67:9ac9d109b80a 628 if (addressee->ctrl.bf.idf == D7A_ID_NBID)
Jeej 67:9ac9d109b80a 629 {
Jeej 67:9ac9d109b80a 630 broadcast = true;
Jeej 67:9ac9d109b80a 631 d7a_ctf_t ctf;
Jeej 67:9ac9d109b80a 632 ctf.byte = addressee->id[0];
Jeej 67:9ac9d109b80a 633 max_responses = ((1 << (2*ctf.bf.exp)) * ctf.bf.mant) + 1;
Jeej 67:9ac9d109b80a 634 }
Jeej 67:9ac9d109b80a 635 else if (addressee->ctrl.bf.idf == D7A_ID_NOID)
Jeej 67:9ac9d109b80a 636 {
Jeej 67:9ac9d109b80a 637 broadcast = true;
Jeej 67:9ac9d109b80a 638 max_responses = 33;
Jeej 67:9ac9d109b80a 639 }
Jeej 67:9ac9d109b80a 640 }
Jeej 67:9ac9d109b80a 641
Jeej 67:9ac9d109b80a 642 // malloc and init pointer array
Jeej 67:9ac9d109b80a 643 ret = (d7a_msg_t**)MALLOC(sizeof(d7a_msg_t*) * (max_responses + 1));
Jeej 67:9ac9d109b80a 644 for (i = 0; i < (max_responses + 1); i++)
Jeej 67:9ac9d109b80a 645 {
Jeej 67:9ac9d109b80a 646 ret[i] = NULL;
Jeej 67:9ac9d109b80a 647 }
Jeej 67:9ac9d109b80a 648
Jeej 67:9ac9d109b80a 649 // Construct command
Jeej 67:9ac9d109b80a 650
Jeej 67:9ac9d109b80a 651 // Tag action
Jeej 67:9ac9d109b80a 652 p += d7a_alp_tag(p, true);
Jeej 67:9ac9d109b80a 653
Jeej 67:9ac9d109b80a 654 // get tag
Jeej 67:9ac9d109b80a 655 current_tag = g_alp_ctx.tag;
Jeej 67:9ac9d109b80a 656
Jeej 67:9ac9d109b80a 657 if (addressee)
Jeej 67:9ac9d109b80a 658 {
Jeej 67:9ac9d109b80a 659 // Construct interface
Jeej 67:9ac9d109b80a 660 alp_d7a_itf_t itf = {
Jeej 67:9ac9d109b80a 661 // Dash7 interface
Jeej 67:9ac9d109b80a 662 .type = 0xD7,
Jeej 67:9ac9d109b80a 663 // Switch response type if broadcast
Jeej 67:9ac9d109b80a 664 .cfg.qos.bf.resp = (broadcast)? D7A_RESP_ALL : D7A_RESP_ANY,
Jeej 67:9ac9d109b80a 665 .cfg.qos.bf.retry = retry,
Jeej 67:9ac9d109b80a 666 .cfg.qos.bf.record = 0,
Jeej 67:9ac9d109b80a 667 .cfg.qos.bf.stop_on_err = 0,
Jeej 67:9ac9d109b80a 668 .cfg.dorm_to.byte = 0,
Jeej 67:9ac9d109b80a 669 };
Jeej 67:9ac9d109b80a 670 memcpy(&itf.cfg.addressee, addressee, sizeof(d7a_addressee_t));
Jeej 67:9ac9d109b80a 671
Jeej 67:9ac9d109b80a 672 // Forward action
Jeej 67:9ac9d109b80a 673 p += d7a_alp_forward_action(p, &itf, true);
Jeej 67:9ac9d109b80a 674 }
Jeej 67:9ac9d109b80a 675
Jeej 67:9ac9d109b80a 676 // Ask for root permissions
Jeej 67:9ac9d109b80a 677 if (root_key)
Jeej 67:9ac9d109b80a 678 {
Jeej 67:9ac9d109b80a 679 uint8_t req[100];
Jeej 67:9ac9d109b80a 680 uint8_t req_size = d7a_alp_flush_action(req, file_id, resp);
Jeej 67:9ac9d109b80a 681 p += d7a_alp_perm_request_action(p, req, req_size, root_key, false);
Jeej 67:9ac9d109b80a 682 }
Jeej 67:9ac9d109b80a 683
Jeej 67:9ac9d109b80a 684 // Write action
Jeej 67:9ac9d109b80a 685 p += d7a_alp_flush_action(p, file_id, resp);
Jeej 67:9ac9d109b80a 686
Jeej 67:9ac9d109b80a 687 // Send command
Jeej 67:9ac9d109b80a 688 d7a_com_dump(&g_alp_ctx.buffer[0], (uint8_t)(p - t), KAL_COM_FLOW_AT_CMD);
Jeej 67:9ac9d109b80a 689
Jeej 67:9ac9d109b80a 690 // Parse responses
Jeej 67:9ac9d109b80a 691 d7a_alp_construct_resp(ret, current_tag, max_responses);
Jeej 67:9ac9d109b80a 692
Jeej 67:9ac9d109b80a 693 return ret;
Jeej 67:9ac9d109b80a 694 }
Jeej 67:9ac9d109b80a 695
Jeej 67:9ac9d109b80a 696
Jeej 43:28202405094d 697 void d7a_alp_thread(const void *p)
Jeej 43:28202405094d 698 {
Jeej 58:38a366236bda 699 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 43:28202405094d 700 d7a_com_rx_msg_t* pkt;
Jeej 43:28202405094d 701
Jeej 43:28202405094d 702 while (true)
Jeej 43:28202405094d 703 {
Jeej 43:28202405094d 704 pkt = d7a_alp_wait_pkt();
Jeej 43:28202405094d 705 ASSERT(pkt != NULL, "ALP NULL pkt\r\n");
Jeej 43:28202405094d 706
Jeej 43:28202405094d 707 switch(pkt->id)
Jeej 43:28202405094d 708 {
Jeej 43:28202405094d 709 case KAL_COM_FLOW_AT_RESP:
Jeej 50:30440c9aeb7c 710 DPRINT("KAL_COM_FLOW_AT_RESP\r\n");
Jeej 45:b85384e7d825 711
Jeej 45:b85384e7d825 712 d7a_alp_new_pl(pkt);
Jeej 43:28202405094d 713
Jeej 43:28202405094d 714 break;
Jeej 59:b42eae56b51b 715 case KAL_COM_FLOW_AT_UNS:
Jeej 59:b42eae56b51b 716 DPRINT("KAL_COM_FLOW_AT_UNS\r\n");
Jeej 65:ac3844adfe49 717 if (g_alp_ctx.uns_msg)
Jeej 65:ac3844adfe49 718 {
Jeej 65:ac3844adfe49 719 d7a_msg_t** uns = (d7a_msg_t**)MALLOC(sizeof(d7a_msg_t*) * 2);
Jeej 65:ac3844adfe49 720
Jeej 65:ac3844adfe49 721 d7a_alp_rsp_t* pl = d7a_alp_parse_pl(pkt);
Jeej 65:ac3844adfe49 722
Jeej 65:ac3844adfe49 723 uns[0] = pl->msg;
Jeej 65:ac3844adfe49 724 uns[1] = NULL;
Jeej 65:ac3844adfe49 725
Jeej 65:ac3844adfe49 726 FREE(pl);
Jeej 65:ac3844adfe49 727
Jeej 65:ac3844adfe49 728 // Callback
Jeej 65:ac3844adfe49 729 g_alp_ctx.uns_msg(uns);
Jeej 65:ac3844adfe49 730 }
Jeej 65:ac3844adfe49 731
Jeej 59:b42eae56b51b 732 FREE(pkt);
Jeej 59:b42eae56b51b 733 break;
Jeej 43:28202405094d 734 default:
Jeej 43:28202405094d 735 EPRINT("ALP Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 45:b85384e7d825 736 FREE(pkt);
Jeej 43:28202405094d 737 break;
Jeej 43:28202405094d 738 }
Jeej 43:28202405094d 739 }
Jeej 43:28202405094d 740 }