Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Sep 08 10:44:05 2016 +0000
Revision:
57:fd9c8b67ffdc
Parent:
56:da34fc11e760
Child:
58:38a366236bda
Fixed Distant write bug.

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