Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Sep 01 18:13:46 2016 +0000
Revision:
46:665391110051
Parent:
45:b85384e7d825
Child:
47:19f22e1a448a
Point to point implemented. Need to support several commands at the same time.

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 43:28202405094d 11
Jeej 43:28202405094d 12
Jeej 43:28202405094d 13 typedef struct {
Jeej 43:28202405094d 14 uint8_t tag;
Jeej 43:28202405094d 15 uint8_t buffer[100];
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 43:28202405094d 18 Thread* thread;
Jeej 43:28202405094d 19 } d7a_alp_ctx_t;
Jeej 43:28202405094d 20
Jeej 43:28202405094d 21 static d7a_alp_ctx_t g_alp_ctx;
Jeej 43:28202405094d 22
Jeej 43:28202405094d 23 void d7a_alp_thread(const void *p);
Jeej 43:28202405094d 24
Jeej 43:28202405094d 25 void d7a_alp_open(void)
Jeej 43:28202405094d 26 {
Jeej 43:28202405094d 27 FPRINT("\r\n");
Jeej 43:28202405094d 28
Jeej 43:28202405094d 29 g_alp_ctx.thread = new Thread(d7a_alp_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE);
Jeej 43:28202405094d 30 }
Jeej 43:28202405094d 31
Jeej 43:28202405094d 32 void d7a_alp_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 43:28202405094d 33 {
Jeej 43:28202405094d 34 FPRINT("\r\n");
Jeej 43:28202405094d 35 ASSERT(g_alp_ctx.pkt_queue.put(pkt) == osOK, "ALP queue full!\r\n");
Jeej 43:28202405094d 36 }
Jeej 43:28202405094d 37
Jeej 45:b85384e7d825 38 void d7a_alp_new_pl(d7a_com_rx_msg_t* pl)
Jeej 45:b85384e7d825 39 {
Jeej 45:b85384e7d825 40 FPRINT("\r\n");
Jeej 45:b85384e7d825 41 ASSERT(g_alp_ctx.pl_queue.put(pl) == osOK, "ALP OP queue full!\r\n");
Jeej 45:b85384e7d825 42 }
Jeej 45:b85384e7d825 43
Jeej 45:b85384e7d825 44 d7a_com_rx_msg_t* d7a_alp_wait_pkt(uint32_t millisec)
Jeej 43:28202405094d 45 {
Jeej 43:28202405094d 46 FPRINT("\r\n");
Jeej 43:28202405094d 47 osEvent evt = g_alp_ctx.pkt_queue.get(millisec);
Jeej 43:28202405094d 48 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 43:28202405094d 49 }
Jeej 43:28202405094d 50
Jeej 45:b85384e7d825 51 d7a_com_rx_msg_t* d7a_alp_wait_pl(uint32_t millisec)
Jeej 43:28202405094d 52 {
Jeej 43:28202405094d 53 FPRINT("\r\n");
Jeej 45:b85384e7d825 54 osEvent evt = g_alp_ctx.pl_queue.get(millisec);
Jeej 45:b85384e7d825 55 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 43:28202405094d 56 }
Jeej 43:28202405094d 57
Jeej 45:b85384e7d825 58 uint32_t d7a_alp_encode_length(uint8_t* p, uint32_t len)
Jeej 43:28202405094d 59 {
Jeej 43:28202405094d 60 if (len <= 0x3F)
Jeej 43:28202405094d 61 {
Jeej 43:28202405094d 62 *p++ = len;
Jeej 43:28202405094d 63 return 1;
Jeej 43:28202405094d 64 }
Jeej 43:28202405094d 65 else if (len <= 0x3FFF)
Jeej 43:28202405094d 66 {
Jeej 43:28202405094d 67 *p++ = 0x40 + (uint8_t)(len >> 8);
Jeej 43:28202405094d 68 *p++ = (uint8_t)(len & 0xFF);
Jeej 43:28202405094d 69 return 2;
Jeej 43:28202405094d 70 }
Jeej 43:28202405094d 71 else if (len <= 0x3FFFFF)
Jeej 43:28202405094d 72 {
Jeej 43:28202405094d 73 *p++ = 0x80 + (uint8_t) (len >> 16);
Jeej 43:28202405094d 74 *p++ = (uint8_t)((len >> 8) & 0xFF);
Jeej 43:28202405094d 75 *p++ = (uint8_t) (len & 0xFF);
Jeej 43:28202405094d 76 return 3;
Jeej 43:28202405094d 77 }
Jeej 43:28202405094d 78 else
Jeej 43:28202405094d 79 {
Jeej 43:28202405094d 80 *p++ = 0xC0 + (uint8_t) (len >> 24);
Jeej 43:28202405094d 81 *p++ = (uint8_t)((len >> 16) & 0xFF);
Jeej 43:28202405094d 82 *p++ = (uint8_t)((len >> 8) & 0xFF);
Jeej 43:28202405094d 83 *p++ = (uint8_t) (len & 0xFF);
Jeej 43:28202405094d 84 return 4;
Jeej 43:28202405094d 85 }
Jeej 43:28202405094d 86 }
Jeej 43:28202405094d 87
Jeej 45:b85384e7d825 88 uint32_t alp_decode_length(uint8_t* p, uint32_t* len)
Jeej 45:b85384e7d825 89 {
Jeej 45:b85384e7d825 90 uint32_t tmp = 0;
Jeej 45:b85384e7d825 91 switch ((*p) & 0xC0)
Jeej 45:b85384e7d825 92 {
Jeej 45:b85384e7d825 93 case 0xC0: // 0xCx xx xx xx
Jeej 45:b85384e7d825 94 tmp = (*p++ & 0x3F) << 24;
Jeej 45:b85384e7d825 95 tmp += *p++ << 16;
Jeej 45:b85384e7d825 96 tmp += *p++ << 8;
Jeej 45:b85384e7d825 97 tmp += *p++ << 0;
Jeej 45:b85384e7d825 98 *len = tmp;
Jeej 45:b85384e7d825 99 return 4;
Jeej 45:b85384e7d825 100 case 0x80: // 0x8x xx xx : 16384 <= Len <4194303
Jeej 45:b85384e7d825 101 tmp = (*p++ & 0x3F) << 16;
Jeej 45:b85384e7d825 102 tmp += *p++ << 8;
Jeej 45:b85384e7d825 103 if (tmp == 0) {
Jeej 45:b85384e7d825 104 // 0x8000 ActP special ActP code
Jeej 45:b85384e7d825 105 // Do not fetch the extra byte
Jeej 45:b85384e7d825 106 tmp = 2;
Jeej 45:b85384e7d825 107 }
Jeej 45:b85384e7d825 108 else
Jeej 45:b85384e7d825 109 {
Jeej 45:b85384e7d825 110 tmp += *p++ << 0;
Jeej 45:b85384e7d825 111 }
Jeej 45:b85384e7d825 112 *len = tmp;
Jeej 45:b85384e7d825 113 return 3;
Jeej 45:b85384e7d825 114 case 0x40: // 0x4x xx : 64 <= Len < 16383
Jeej 45:b85384e7d825 115 tmp = (*p++ & 0x3F) << 8;
Jeej 45:b85384e7d825 116 tmp += *p++ << 0;
Jeej 45:b85384e7d825 117 if (tmp == 0)
Jeej 45:b85384e7d825 118 {
Jeej 45:b85384e7d825 119 // 0x4000 ActP special ActP code
Jeej 45:b85384e7d825 120 tmp = 1;
Jeej 45:b85384e7d825 121 }
Jeej 45:b85384e7d825 122 *len = tmp;
Jeej 45:b85384e7d825 123 return 2;
Jeej 45:b85384e7d825 124 case 0: // Len <63
Jeej 45:b85384e7d825 125 tmp = (*p++ & 0x3F) << 0;
Jeej 45:b85384e7d825 126 *len = tmp;
Jeej 45:b85384e7d825 127 return 1;
Jeej 45:b85384e7d825 128 }
Jeej 45:b85384e7d825 129
Jeej 45:b85384e7d825 130 return 0;
Jeej 45:b85384e7d825 131 }
Jeej 43:28202405094d 132
Jeej 45:b85384e7d825 133 uint32_t d7a_alp_add(uint8_t* p, const uint8_t* data, uint32_t len)
Jeej 43:28202405094d 134 {
Jeej 45:b85384e7d825 135 memcpy(p, data, len);
Jeej 43:28202405094d 136
Jeej 43:28202405094d 137 return len;
Jeej 43:28202405094d 138 }
Jeej 43:28202405094d 139
Jeej 45:b85384e7d825 140 d7a_alp_rsp_t* d7a_alp_parse_pl(d7a_com_rx_msg_t* pkt)
Jeej 46:665391110051 141 {
Jeej 46:665391110051 142 if (pkt == NULL)
Jeej 46:665391110051 143 {
Jeej 46:665391110051 144 return NULL;
Jeej 46:665391110051 145 }
Jeej 46:665391110051 146
Jeej 45:b85384e7d825 147 uint8_t* p = pkt->buffer;
Jeej 45:b85384e7d825 148 uint8_t* t = p;
Jeej 45:b85384e7d825 149 uint8_t len = pkt->blen;
Jeej 45:b85384e7d825 150
Jeej 45:b85384e7d825 151 d7a_alp_rsp_t* rsp = (d7a_alp_rsp_t*)MALLOC(sizeof(d7a_alp_rsp_t));
Jeej 45:b85384e7d825 152
Jeej 45:b85384e7d825 153 rsp->nb_status = 0;
Jeej 45:b85384e7d825 154 rsp->length = 0;
Jeej 45:b85384e7d825 155 rsp->data = NULL;
Jeej 45:b85384e7d825 156
Jeej 45:b85384e7d825 157 while ((p - t) < len)
Jeej 45:b85384e7d825 158 {
Jeej 45:b85384e7d825 159
Jeej 45:b85384e7d825 160 uint8_t ctrl = *p++;
Jeej 45:b85384e7d825 161 switch (ctrl & 0x3F)
Jeej 45:b85384e7d825 162 {
Jeej 45:b85384e7d825 163 case ALP_OPCODE_RSP_STATUS:
Jeej 46:665391110051 164 if (ctrl & ALP_OPCODE_INDIRECT)
Jeej 46:665391110051 165 {
Jeej 46:665391110051 166 uint8_t type = *p++; // ITF Type
Jeej 46:665391110051 167 uint32_t length;
Jeej 46:665391110051 168 p += alp_decode_length(p, &length); // Length
Jeej 46:665391110051 169 p += length; // Data
Jeej 46:665391110051 170 PRINT("ALP RSP ISTATUS %02X\r\n", type);
Jeej 46:665391110051 171 }
Jeej 46:665391110051 172 else
Jeej 46:665391110051 173 {
Jeej 46:665391110051 174 rsp->status[rsp->nb_status].aid = *p++; // Action ID
Jeej 46:665391110051 175 rsp->status[rsp->nb_status].status = *p++; // Status
Jeej 46:665391110051 176 PRINT("ALP RSP STATUS[%d] aid:%d Status:%d\r\n", rsp->nb_status, rsp->status[rsp->nb_status].aid, rsp->status[rsp->nb_status].status);
Jeej 46:665391110051 177 rsp->nb_status++;
Jeej 46:665391110051 178 }
Jeej 45:b85384e7d825 179 break;
Jeej 45:b85384e7d825 180 case ALP_OPCODE_RSP_TAG:
Jeej 45:b85384e7d825 181 rsp->tag_status = (ctrl & ~0x3F) | 0x01;
Jeej 45:b85384e7d825 182 rsp->tag = *p++; // TAG
Jeej 46:665391110051 183 PRINT("ALP RSP TAG %d %02x\r\n", rsp->tag, rsp->tag_status);
Jeej 45:b85384e7d825 184 break;
Jeej 45:b85384e7d825 185 case ALP_OPCODE_RSP_F_DATA:
Jeej 45:b85384e7d825 186 uint8_t fid = *p++; // File ID
Jeej 45:b85384e7d825 187 uint32_t offset;
Jeej 45:b85384e7d825 188 p += alp_decode_length(p, &offset); // offset
Jeej 45:b85384e7d825 189 p += alp_decode_length(p, &(rsp->length)); // length
Jeej 45:b85384e7d825 190 rsp->data = (uint8_t*)MALLOC(rsp->length);
Jeej 45:b85384e7d825 191 p += d7a_alp_add(rsp->data, p, rsp->length);
Jeej 46:665391110051 192 PRINT("ALP RSP F_DATA f:%d o:%d s:%d\r\n", fid, offset, rsp->length);
Jeej 45:b85384e7d825 193 //dbg_print_data("DATA: ", "%02X ", (uint8_t*)rsp->data, rsp->length, "\r\n");
Jeej 45:b85384e7d825 194 break;
Jeej 45:b85384e7d825 195 default:
Jeej 45:b85384e7d825 196 WARNING(false, "ALP Untreated OP %d\r\n", ctrl);
Jeej 45:b85384e7d825 197 break;
Jeej 45:b85384e7d825 198 }
Jeej 45:b85384e7d825 199 }
Jeej 45:b85384e7d825 200
Jeej 45:b85384e7d825 201 FREE(pkt);
Jeej 45:b85384e7d825 202
Jeej 45:b85384e7d825 203 ASSERT((p - t) == len, "Payload wrong size: %d expected %d\r\n", (p - t), len);
Jeej 45:b85384e7d825 204
Jeej 45:b85384e7d825 205 return rsp;
Jeej 45:b85384e7d825 206 }
Jeej 45:b85384e7d825 207
Jeej 45:b85384e7d825 208
Jeej 45:b85384e7d825 209 uint32_t d7a_alp_tag(uint8_t* p, bool eop)
Jeej 43:28202405094d 210 {
Jeej 43:28202405094d 211 uint8_t* t = p;
Jeej 43:28202405094d 212
Jeej 45:b85384e7d825 213 *p++ = ALP_OPCODE_TAG + ((eop)? ALP_CTRL_EOP : 0);
Jeej 43:28202405094d 214 *p++ = ++g_alp_ctx.tag;
Jeej 43:28202405094d 215
Jeej 43:28202405094d 216 return (uint32_t)(p - t);
Jeej 43:28202405094d 217 }
Jeej 43:28202405094d 218
Jeej 46:665391110051 219
Jeej 46:665391110051 220
Jeej 46:665391110051 221 uint32_t d7a_alp_forward_action(uint8_t* p, alp_d7a_itf_t* itf, bool resp)
Jeej 43:28202405094d 222 {
Jeej 43:28202405094d 223 uint8_t* t = p;
Jeej 43:28202405094d 224
Jeej 45:b85384e7d825 225 *p++ = ALP_OPCODE_FORWARD + ((resp)? ALP_CTRL_RESP : 0);
Jeej 46:665391110051 226 p += d7a_alp_add(p, (uint8_t*)itf, sizeof(alp_d7a_itf_t));
Jeej 43:28202405094d 227
Jeej 43:28202405094d 228 return (uint32_t)(p - t);
Jeej 43:28202405094d 229 }
Jeej 43:28202405094d 230
Jeej 45:b85384e7d825 231 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 232 {
Jeej 43:28202405094d 233 uint8_t* t = p;
Jeej 43:28202405094d 234
Jeej 45:b85384e7d825 235 *p++ = ALP_OPCODE_F_WR_DATA + ((resp)? ALP_CTRL_RESP : 0);
Jeej 43:28202405094d 236 *p++ = file_id;
Jeej 43:28202405094d 237 p += d7a_alp_encode_length(p, offset);
Jeej 43:28202405094d 238 p += d7a_alp_encode_length(p, size);
Jeej 43:28202405094d 239 p += d7a_alp_add(p, buf, size);
Jeej 43:28202405094d 240
Jeej 43:28202405094d 241 return (uint32_t)(p - t);
Jeej 43:28202405094d 242 }
Jeej 43:28202405094d 243
Jeej 45:b85384e7d825 244 uint32_t d7a_alp_read_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 245 {
Jeej 43:28202405094d 246 uint8_t* t = p;
Jeej 43:28202405094d 247
Jeej 45:b85384e7d825 248 *p++ = ALP_OPCODE_F_RD_DATA + ((resp)? ALP_CTRL_RESP : 0);
Jeej 43:28202405094d 249 *p++ = file_id;
Jeej 43:28202405094d 250 p += d7a_alp_encode_length(p, offset);
Jeej 43:28202405094d 251 p += d7a_alp_encode_length(p, size);
Jeej 43:28202405094d 252
Jeej 43:28202405094d 253 return (uint32_t)(p - t);
Jeej 43:28202405094d 254 }
Jeej 43:28202405094d 255
Jeej 45:b85384e7d825 256 void free_pl(d7a_alp_rsp_t* pl)
Jeej 43:28202405094d 257 {
Jeej 45:b85384e7d825 258 if (pl->data != NULL)
Jeej 43:28202405094d 259 {
Jeej 45:b85384e7d825 260 FREE(pl->data);
Jeej 43:28202405094d 261 }
Jeej 45:b85384e7d825 262 FREE(pl);
Jeej 43:28202405094d 263 }
Jeej 43:28202405094d 264
Jeej 45:b85384e7d825 265
Jeej 46:665391110051 266 d7a_errors_t d7a_alp_write_file(const uint8_t file_id, const uint32_t offset, const uint32_t size, const uint8_t* const buf, d7a_addressee_t* addressee, uint8_t retry, bool resp)
Jeej 43:28202405094d 267 {
Jeej 43:28202405094d 268 uint8_t* p = &g_alp_ctx.buffer[0];
Jeej 43:28202405094d 269 uint8_t* t = p;
Jeej 43:28202405094d 270
Jeej 43:28202405094d 271 // Tag action
Jeej 45:b85384e7d825 272 p += d7a_alp_tag(p, true);
Jeej 45:b85384e7d825 273
Jeej 45:b85384e7d825 274 if (addressee)
Jeej 45:b85384e7d825 275 {
Jeej 46:665391110051 276 // Construct interface
Jeej 46:665391110051 277 alp_d7a_itf_t itf = {
Jeej 46:665391110051 278 .type = 0xD7, // Dash7 interface
Jeej 46:665391110051 279 .cfg.qos.bf.resp = D7A_RESP_ANY,
Jeej 46:665391110051 280 .cfg.qos.bf.retry = retry,
Jeej 46:665391110051 281 .cfg.qos.bf.record = 0,
Jeej 46:665391110051 282 .cfg.qos.bf.stop_on_err = 0,
Jeej 46:665391110051 283 .cfg.dorm_to.byte = 0,
Jeej 46:665391110051 284 };
Jeej 46:665391110051 285 memcpy(&itf.cfg.addressee, addressee, sizeof(d7a_addressee_t));
Jeej 46:665391110051 286 itf.cfg.addressee.ctrl.bf.idf = D7A_ID_UID;
Jeej 46:665391110051 287
Jeej 45:b85384e7d825 288 // Forward
Jeej 46:665391110051 289 p += d7a_alp_forward_action(p, &itf, true);
Jeej 45:b85384e7d825 290 }
Jeej 45:b85384e7d825 291
Jeej 45:b85384e7d825 292 // Write action
Jeej 45:b85384e7d825 293 p += d7a_alp_write_action(p, file_id, offset, size, buf, resp);
Jeej 45:b85384e7d825 294
Jeej 45:b85384e7d825 295 d7a_com_dump(&g_alp_ctx.buffer[0], (uint8_t)(p - t), KAL_COM_FLOW_AT_CMD);
Jeej 45:b85384e7d825 296
Jeej 45:b85384e7d825 297 d7a_alp_rsp_t* pl;
Jeej 46:665391110051 298 d7a_errors_t status;
Jeej 45:b85384e7d825 299
Jeej 46:665391110051 300 do
Jeej 45:b85384e7d825 301 {
Jeej 46:665391110051 302 pl = d7a_alp_parse_pl(d7a_alp_wait_pl(60000));
Jeej 46:665391110051 303
Jeej 46:665391110051 304 if (pl == NULL)
Jeej 45:b85384e7d825 305 {
Jeej 46:665391110051 306 status = D7A_ERR_CMD_TO;
Jeej 46:665391110051 307 free_pl(pl);
Jeej 46:665391110051 308 break;
Jeej 45:b85384e7d825 309 }
Jeej 45:b85384e7d825 310
Jeej 46:665391110051 311 ASSERT(pl->tag_status & 0x01, "No tag in payload expected %d\r\n", g_alp_ctx.tag);
Jeej 46:665391110051 312 ASSERT(pl->tag == g_alp_ctx.tag, "Wrong tag %d expected %d\r\n", pl->tag, g_alp_ctx.tag);
Jeej 45:b85384e7d825 313
Jeej 46:665391110051 314 if (pl->tag_status & ALP_CTRL_ERR)
Jeej 45:b85384e7d825 315 {
Jeej 45:b85384e7d825 316 if (pl->nb_status)
Jeej 45:b85384e7d825 317 {
Jeej 46:665391110051 318 status = (d7a_errors_t)pl->status[0].status;
Jeej 45:b85384e7d825 319 }
Jeej 45:b85384e7d825 320 else
Jeej 45:b85384e7d825 321 {
Jeej 45:b85384e7d825 322 status = D7A_ERR_TX_FAILED;
Jeej 45:b85384e7d825 323 }
Jeej 45:b85384e7d825 324 }
Jeej 46:665391110051 325
Jeej 46:665391110051 326 if (pl->tag_status & ALP_CTRL_EOP)
Jeej 45:b85384e7d825 327 {
Jeej 46:665391110051 328 if (!addressee)
Jeej 46:665391110051 329 {
Jeej 46:665391110051 330 if (pl->nb_status)
Jeej 46:665391110051 331 {
Jeej 46:665391110051 332 status = (d7a_errors_t)pl->status[0].status;
Jeej 46:665391110051 333 }
Jeej 46:665391110051 334 else
Jeej 46:665391110051 335 {
Jeej 46:665391110051 336 status = D7A_ERR_TX_FAILED;
Jeej 46:665391110051 337 }
Jeej 46:665391110051 338 }
Jeej 46:665391110051 339
Jeej 46:665391110051 340 free_pl(pl);
Jeej 46:665391110051 341 break;
Jeej 45:b85384e7d825 342 }
Jeej 46:665391110051 343
Jeej 46:665391110051 344 free_pl(pl);
Jeej 46:665391110051 345 } while (1);
Jeej 45:b85384e7d825 346
Jeej 45:b85384e7d825 347 return status;
Jeej 45:b85384e7d825 348 }
Jeej 45:b85384e7d825 349
Jeej 46:665391110051 350 d7a_errors_t d7a_alp_read_file(const uint8_t file_id, const uint32_t offset, const uint32_t size, const uint8_t* const buf, d7a_addressee_t* addressee, uint8_t retry)
Jeej 45:b85384e7d825 351 {
Jeej 45:b85384e7d825 352 uint8_t* p = &g_alp_ctx.buffer[0];
Jeej 45:b85384e7d825 353 uint8_t* t = p;
Jeej 45:b85384e7d825 354
Jeej 45:b85384e7d825 355 // Tag action
Jeej 45:b85384e7d825 356 p += d7a_alp_tag(p, true);
Jeej 43:28202405094d 357
Jeej 43:28202405094d 358 if (addressee)
Jeej 43:28202405094d 359 {
Jeej 46:665391110051 360 // Construct interface
Jeej 46:665391110051 361 alp_d7a_itf_t itf = {
Jeej 46:665391110051 362 .type = 0xD7, // Dash7 interface
Jeej 46:665391110051 363 .cfg.qos.bf.resp = D7A_RESP_ANY,
Jeej 46:665391110051 364 .cfg.qos.bf.retry = retry,
Jeej 46:665391110051 365 .cfg.qos.bf.record = 0,
Jeej 46:665391110051 366 .cfg.qos.bf.stop_on_err = 0,
Jeej 46:665391110051 367 .cfg.dorm_to.byte = 0,
Jeej 46:665391110051 368 };
Jeej 46:665391110051 369 memcpy(&itf.cfg.addressee, addressee, sizeof(d7a_addressee_t));
Jeej 46:665391110051 370 itf.cfg.addressee.ctrl.bf.idf = D7A_ID_UID;
Jeej 46:665391110051 371
Jeej 43:28202405094d 372 // Forward
Jeej 46:665391110051 373 p += d7a_alp_forward_action(p, &itf, true);
Jeej 43:28202405094d 374 }
Jeej 43:28202405094d 375
Jeej 43:28202405094d 376 // Read action
Jeej 45:b85384e7d825 377 p += d7a_alp_read_action(p, file_id, offset, size, buf, true);
Jeej 43:28202405094d 378
Jeej 45:b85384e7d825 379 d7a_com_dump(&g_alp_ctx.buffer[0], (uint8_t)(p - t), KAL_COM_FLOW_AT_CMD);
Jeej 45:b85384e7d825 380
Jeej 45:b85384e7d825 381 d7a_alp_rsp_t* pl;
Jeej 46:665391110051 382 d7a_errors_t status;
Jeej 43:28202405094d 383
Jeej 46:665391110051 384 do
Jeej 45:b85384e7d825 385 {
Jeej 46:665391110051 386 pl = d7a_alp_parse_pl(d7a_alp_wait_pl(60000));
Jeej 46:665391110051 387
Jeej 46:665391110051 388 if (pl == NULL)
Jeej 46:665391110051 389 {
Jeej 46:665391110051 390 status = D7A_ERR_CMD_TO;
Jeej 46:665391110051 391 free_pl(pl);
Jeej 46:665391110051 392 break;
Jeej 46:665391110051 393 }
Jeej 46:665391110051 394
Jeej 46:665391110051 395 ASSERT(pl->tag_status & 0x01, "No tag in payload expected %d\r\n", g_alp_ctx.tag);
Jeej 46:665391110051 396 ASSERT(pl->tag == g_alp_ctx.tag, "Wrong tag %d expected %d\r\n", pl->tag, g_alp_ctx.tag);
Jeej 46:665391110051 397
Jeej 46:665391110051 398 if (pl->tag_status & ALP_CTRL_ERR)
Jeej 45:b85384e7d825 399 {
Jeej 46:665391110051 400 if (pl->nb_status)
Jeej 46:665391110051 401 {
Jeej 46:665391110051 402 status = (d7a_errors_t)pl->status[0].status;
Jeej 46:665391110051 403 }
Jeej 46:665391110051 404 else
Jeej 46:665391110051 405 {
Jeej 46:665391110051 406 status = D7A_ERR_TX_FAILED;
Jeej 46:665391110051 407 }
Jeej 45:b85384e7d825 408 }
Jeej 46:665391110051 409
Jeej 46:665391110051 410 if (pl->data != NULL)
Jeej 45:b85384e7d825 411 {
Jeej 46:665391110051 412 memcpy((void*)buf, (void*)pl->data, pl->length);
Jeej 46:665391110051 413 }
Jeej 46:665391110051 414
Jeej 46:665391110051 415 if (pl->tag_status & ALP_CTRL_EOP)
Jeej 46:665391110051 416 {
Jeej 46:665391110051 417 free_pl(pl);
Jeej 46:665391110051 418 break;
Jeej 45:b85384e7d825 419 }
Jeej 45:b85384e7d825 420
Jeej 45:b85384e7d825 421 free_pl(pl);
Jeej 46:665391110051 422 } while (1);
Jeej 45:b85384e7d825 423
Jeej 45:b85384e7d825 424 return status;
Jeej 43:28202405094d 425 }
Jeej 43:28202405094d 426
Jeej 43:28202405094d 427 void d7a_alp_thread(const void *p)
Jeej 43:28202405094d 428 {
Jeej 43:28202405094d 429 FPRINT("\r\n");
Jeej 43:28202405094d 430 d7a_com_rx_msg_t* pkt;
Jeej 43:28202405094d 431
Jeej 43:28202405094d 432 while (true)
Jeej 43:28202405094d 433 {
Jeej 43:28202405094d 434 pkt = d7a_alp_wait_pkt();
Jeej 43:28202405094d 435 ASSERT(pkt != NULL, "ALP NULL pkt\r\n");
Jeej 43:28202405094d 436
Jeej 43:28202405094d 437 switch(pkt->id)
Jeej 43:28202405094d 438 {
Jeej 43:28202405094d 439 case KAL_COM_FLOW_AT_RESP:
Jeej 46:665391110051 440 PRINT("KAL_COM_FLOW_AT_RESP\r\n");
Jeej 45:b85384e7d825 441
Jeej 45:b85384e7d825 442 d7a_alp_new_pl(pkt);
Jeej 43:28202405094d 443
Jeej 43:28202405094d 444 break;
Jeej 43:28202405094d 445 default:
Jeej 43:28202405094d 446 EPRINT("ALP Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 45:b85384e7d825 447 FREE(pkt);
Jeej 43:28202405094d 448 break;
Jeej 43:28202405094d 449 }
Jeej 43:28202405094d 450 }
Jeej 43:28202405094d 451 }