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@46:665391110051, 2016-09-01 (annotated)
- 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?
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 | |
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 | } |