Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of d7a_1x by
src/d7a_alp.cpp@57:fd9c8b67ffdc, 2016-09-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |