Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Committer:
Jeej
Date:
Fri Oct 01 08:46:44 2021 +0000
Revision:
65:c7749f9b6009
Parent:
63:544a488a06d3
Child:
67:e458db8402dc
commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 1:40ead20ecb14 1 #include "mbed.h"
Jeej 1:40ead20ecb14 2 #include "WizziDebug.h"
Jeej 1:40ead20ecb14 3
Jeej 0:027760f45e2c 4 #include "modem_ref.h"
Jeej 13:10589aaf8853 5 #include "kal_crypto.h"
Jeej 41:6f83174ffed4 6 #include "kal_codec.h"
Jeej 56:67e3d9608403 7 #include "d7a_1x_fs.h"
Jeej 0:027760f45e2c 8
Jeej 39:bc4fccf2d84b 9 #if 0
Jeej 57:5444cfda9889 10 #define REF_PRINT(...) PRINT(__VA_ARGS__)
Jeej 57:5444cfda9889 11 #define URC_PRINT(...) PRINT(__VA_ARGS__)
Jeej 4:8f031be3ff7d 12 #else
Jeej 57:5444cfda9889 13 #define REF_PRINT(...);
Jeej 57:5444cfda9889 14 #define URC_PRINT(...);
Jeej 4:8f031be3ff7d 15 #endif
Jeej 4:8f031be3ff7d 16
Jeej 0:027760f45e2c 17 typedef struct {
Jeej 0:027760f45e2c 18 action_callback_t* cb;
Jeej 57:5444cfda9889 19 alp_payload_t** alp_rsp;
Jeej 56:67e3d9608403 20 } modem_ref_user_t;
Jeej 0:027760f45e2c 21
Jeej 0:027760f45e2c 22 typedef struct {
Jeej 57:5444cfda9889 23 fx_serial_send_t* send;
Jeej 56:67e3d9608403 24 modem_ref_callbacks_t* cb;
Jeej 56:67e3d9608403 25 modem_ref_user_t user[MAX_USER_NB];
Jeej 57:5444cfda9889 26 u8 state;
Jeej 56:67e3d9608403 27 } modem_ref_ctx_t;
Jeej 57:5444cfda9889 28
Jeej 56:67e3d9608403 29 static modem_ref_ctx_t g_modem;
Jeej 0:027760f45e2c 30
Jeej 0:027760f45e2c 31 #define STATE_OPEN 0xab
Jeej 0:027760f45e2c 32 #define STATE_CLOSED 0
Jeej 0:027760f45e2c 33
Jeej 0:027760f45e2c 34 // Flows
Jeej 0:027760f45e2c 35 #define WC_FLOWID_CMD 0x10
Jeej 0:027760f45e2c 36 #define WC_FLOWID_ALP 0x20
Jeej 0:027760f45e2c 37 #define WC_FLOWID_SYS 0x30
Jeej 0:027760f45e2c 38
Jeej 0:027760f45e2c 39 // Sub-Flows
Jeej 0:027760f45e2c 40 #define WC_FLOW_ALP_CMD 0x20
Jeej 0:027760f45e2c 41 #define WC_FLOW_ALP_RESP 0x21
Jeej 0:027760f45e2c 42 #define WC_FLOW_ALP_UNS 0x22
Jeej 0:027760f45e2c 43 #define WC_FLOW_SYS_RST 0x30
Jeej 0:027760f45e2c 44 #define WC_FLOW_SYS_PING 0x34
Jeej 0:027760f45e2c 45 #define WC_FLOW_SYS_PONG 0x35
Jeej 0:027760f45e2c 46 #define WC_FLOW_SYS_CFG 0x36
Jeej 0:027760f45e2c 47 #define WC_FLOW_SYS_XON 0x39
Jeej 0:027760f45e2c 48 #define WC_FLOW_SYS_XOFF 0x3a
Jeej 0:027760f45e2c 49 #define WC_FLOW_SYS_XACK 0x3b
Jeej 0:027760f45e2c 50
Jeej 0:027760f45e2c 51 // Misc CMD...
Jeej 0:027760f45e2c 52 #define WM_BOOT 0x81
Jeej 0:027760f45e2c 53
Jeej 57:5444cfda9889 54 #define PKT_MAX_SIZE 255
Jeej 57:5444cfda9889 55 static void serial_send(WizziComPacketType type, alp_payload_t* alp)
Jeej 57:5444cfda9889 56 {
Jeej 57:5444cfda9889 57 u8 buf[PKT_MAX_SIZE];
Jeej 59:3b38b5f499db 58
Jeej 63:544a488a06d3 59 //PRINT("<--\n");
Jeej 63:544a488a06d3 60 //alp_payload_print(alp);
Jeej 59:3b38b5f499db 61
Jeej 65:c7749f9b6009 62 u32 len = alp_payload_to_buf(alp, buf, PKT_MAX_SIZE);
Jeej 61:820395fc5572 63
Jeej 61:820395fc5572 64 ASSERT(g_modem.send != NULL, "NULL send function!\r\n");
Jeej 57:5444cfda9889 65 g_modem.send(type, buf, len);
Jeej 59:3b38b5f499db 66
Jeej 59:3b38b5f499db 67 alp_payload_free(alp);
Jeej 57:5444cfda9889 68 }
Jeej 57:5444cfda9889 69
Jeej 62:75d819d68e5f 70 static void call_fs_user_cb(alp_payload_t* alp)
Jeej 46:9b83866cef2c 71 {
Jeej 57:5444cfda9889 72 alp_parsed_chunk_t r;
Jeej 62:75d819d68e5f 73 u8* p;
Jeej 65:c7749f9b6009 74 int id = -1;
Jeej 62:75d819d68e5f 75 u32 action = 0;
Jeej 57:5444cfda9889 76
Jeej 62:75d819d68e5f 77 while (alp != NULL)
Jeej 57:5444cfda9889 78 {
Jeej 62:75d819d68e5f 79 p = alp->d;
Jeej 62:75d819d68e5f 80 alp_parse_chunk(&p, &r);
Jeej 62:75d819d68e5f 81
Jeej 62:75d819d68e5f 82 switch (r.type)
Jeej 62:75d819d68e5f 83 {
Jeej 62:75d819d68e5f 84 case ALP_OPCODE_TAG:
Jeej 62:75d819d68e5f 85 id = r.meta.tag.id;
Jeej 62:75d819d68e5f 86 REF_PRINT("ACT %d: TAG[%d] ID:%d ERR:%d EOP:%d\n", action, id, r.meta.tag.err, r.meta.tag.eop);
Jeej 62:75d819d68e5f 87 break;
Jeej 62:75d819d68e5f 88 case ALP_OPCODE_F_RD_DATA:
Jeej 62:75d819d68e5f 89 REF_PRINT("ACT %d: F_RD_DATA[%d] @%d %d bytes\n", action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 62:75d819d68e5f 90 if (g_modem.cb->read)
Jeej 62:75d819d68e5f 91 {
Jeej 62:75d819d68e5f 92 g_modem.cb->read(action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length, id);
Jeej 62:75d819d68e5f 93 }
Jeej 62:75d819d68e5f 94 break;
Jeej 62:75d819d68e5f 95 case ALP_OPCODE_F_WR_DATA:
Jeej 62:75d819d68e5f 96 REF_PRINT("ACT %d: F_WR_DATA[%d] @%d %d bytes\n", action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 62:75d819d68e5f 97 if (g_modem.cb->write)
Jeej 62:75d819d68e5f 98 {
Jeej 62:75d819d68e5f 99 g_modem.cb->write(action, r.meta.f_data.fid, r.data, r.meta.f_data.offset, r.meta.f_data.length, id);
Jeej 62:75d819d68e5f 100 }
Jeej 62:75d819d68e5f 101 break;
Jeej 62:75d819d68e5f 102 case ALP_OPCODE_F_RD_PROP:
Jeej 62:75d819d68e5f 103 REF_PRINT("ACT %d: F_RD_PROP[%d]\n", action, r.meta.f_data.fid);
Jeej 62:75d819d68e5f 104 if (g_modem.cb->read_fprop)
Jeej 62:75d819d68e5f 105 {
Jeej 62:75d819d68e5f 106 g_modem.cb->read_fprop(action, r.meta.f_data.fid, id);
Jeej 62:75d819d68e5f 107 }
Jeej 62:75d819d68e5f 108 break;
Jeej 62:75d819d68e5f 109 case ALP_OPCODE_F_DELETE:
Jeej 62:75d819d68e5f 110 REF_PRINT("ACT %d: F_DELETE[%d]\n", action, r.meta.f_data.fid);
Jeej 62:75d819d68e5f 111 if (g_modem.cb->remove)
Jeej 62:75d819d68e5f 112 {
Jeej 62:75d819d68e5f 113 g_modem.cb->remove(action, r.meta.f_data.fid, id);
Jeej 62:75d819d68e5f 114 }
Jeej 62:75d819d68e5f 115 break;
Jeej 62:75d819d68e5f 116 case ALP_OPCODE_F_FLUSH:
Jeej 62:75d819d68e5f 117 REF_PRINT("ACT %d: F_FLUSH[%d]\n", action, r.meta.f_data.fid);
Jeej 62:75d819d68e5f 118 if (g_modem.cb->flush)
Jeej 62:75d819d68e5f 119 {
Jeej 62:75d819d68e5f 120 g_modem.cb->flush(action, r.meta.f_data.fid, id);
Jeej 62:75d819d68e5f 121 }
Jeej 62:75d819d68e5f 122 break;
Jeej 62:75d819d68e5f 123 default:
Jeej 62:75d819d68e5f 124 ASSERT(false, "ASSERT: Unsupported ALP File Operation: %d\n", r.type);
Jeej 62:75d819d68e5f 125 break;
Jeej 62:75d819d68e5f 126 }
Jeej 62:75d819d68e5f 127
Jeej 62:75d819d68e5f 128 ASSERT(id >= 0, "ASSERT: Wrong id %d\n", id);
Jeej 62:75d819d68e5f 129
Jeej 62:75d819d68e5f 130 action++;
Jeej 62:75d819d68e5f 131
Jeej 62:75d819d68e5f 132 alp = alp->next;
Jeej 57:5444cfda9889 133 }
Jeej 46:9b83866cef2c 134 }
Jeej 0:027760f45e2c 135
Jeej 57:5444cfda9889 136 void modem_ref_input(u8 flowid, u8* payload, u8 size)
Jeej 0:027760f45e2c 137 {
Jeej 0:027760f45e2c 138 alp_parsed_chunk_t r;
Jeej 0:027760f45e2c 139 int id = -1;
Jeej 57:5444cfda9889 140 s8 err = ALP_ERR_NONE;
Jeej 57:5444cfda9889 141 u8 eop;
Jeej 65:c7749f9b6009 142 alp_payload_t* alp = NULL;
Jeej 41:6f83174ffed4 143
Jeej 57:5444cfda9889 144 REF_PRINT("input 0x%x/%d Bytes\n", flowid, size);
Jeej 0:027760f45e2c 145 switch (flowid)
Jeej 0:027760f45e2c 146 {
Jeej 0:027760f45e2c 147 case WC_FLOW_ALP_UNS:
Jeej 0:027760f45e2c 148 case WC_FLOW_ALP_CMD:
Jeej 58:8d58e5cb4037 149
Jeej 57:5444cfda9889 150 // pre-parse payload
Jeej 65:c7749f9b6009 151 alp = alp_payload_parse(payload, size);
Jeej 58:8d58e5cb4037 152
Jeej 63:544a488a06d3 153 //PRINT("-->\n");
Jeej 63:544a488a06d3 154 //alp_payload_print(alp);
Jeej 57:5444cfda9889 155
Jeej 57:5444cfda9889 156 if (ALP_OPCODE_TAG == (alp->d[0] & 0x3F))
Jeej 0:027760f45e2c 157 {
Jeej 57:5444cfda9889 158 // Payload starts with a tag, this must be a FS command
Jeej 57:5444cfda9889 159 call_fs_user_cb(alp);
Jeej 63:544a488a06d3 160 alp_payload_free(alp);
Jeej 0:027760f45e2c 161 }
Jeej 0:027760f45e2c 162 else
Jeej 0:027760f45e2c 163 {
Jeej 57:5444cfda9889 164 // else this is a 'real' URC (or ISTATUS if enabled on modem)
Jeej 63:544a488a06d3 165 if (g_modem.cb->udata)
Jeej 63:544a488a06d3 166 {
Jeej 63:544a488a06d3 167 // XXX All URCs go to the user
Jeej 63:544a488a06d3 168 g_modem.cb->udata(alp);
Jeej 63:544a488a06d3 169 }
Jeej 63:544a488a06d3 170 else
Jeej 63:544a488a06d3 171 {
Jeej 63:544a488a06d3 172 alp_payload_free(alp);
Jeej 63:544a488a06d3 173 }
Jeej 57:5444cfda9889 174 }
Jeej 56:67e3d9608403 175
Jeej 0:027760f45e2c 176 break;
Jeej 0:027760f45e2c 177 case WC_FLOW_ALP_RESP:
Jeej 57:5444cfda9889 178
Jeej 57:5444cfda9889 179 // pre-parse payload
Jeej 65:c7749f9b6009 180 alp = alp_payload_parse(payload, size);
Jeej 58:8d58e5cb4037 181
Jeej 63:544a488a06d3 182 //PRINT("-->\n");
Jeej 63:544a488a06d3 183 //alp_payload_print(alp);
Jeej 57:5444cfda9889 184
Jeej 65:c7749f9b6009 185 alp_payload_parse_chunk(alp, &r);
Jeej 57:5444cfda9889 186
Jeej 0:027760f45e2c 187 // This should always be a TAG'ed response as we tag our requests
Jeej 57:5444cfda9889 188 ASSERT((r.type == ALP_OPCODE_RSP_TAG), "ASSERT: expecting RESP_TAG got 0x%02X\n", r.type);
Jeej 57:5444cfda9889 189
Jeej 1:40ead20ecb14 190 id = r.meta.tag.id;
Jeej 1:40ead20ecb14 191 eop = r.meta.tag.eop;
Jeej 58:8d58e5cb4037 192
Jeej 65:c7749f9b6009 193 if (NULL == g_modem.user[id].cb)
Jeej 58:8d58e5cb4037 194 {
Jeej 58:8d58e5cb4037 195 PRINT("WARNING: NULL Callback for ID %d\n", id);
Jeej 58:8d58e5cb4037 196 alp_payload_print(alp);
Jeej 58:8d58e5cb4037 197 alp_payload_free(alp);
Jeej 58:8d58e5cb4037 198 break;
Jeej 58:8d58e5cb4037 199 }
Jeej 58:8d58e5cb4037 200 //ASSERT(g_modem.user[id].cb != NULL, "ASSERT: NULL Callback for ID %d\n", id);
Jeej 65:c7749f9b6009 201
Jeej 58:8d58e5cb4037 202 if (g_modem.user[id].alp_rsp)
Jeej 58:8d58e5cb4037 203 {
Jeej 58:8d58e5cb4037 204 // Give the remaining of the payload to the user to deal with
Jeej 58:8d58e5cb4037 205 *(g_modem.user[id].alp_rsp) = alp_payload_append(*(g_modem.user[id].alp_rsp), alp);
Jeej 58:8d58e5cb4037 206 }
Jeej 58:8d58e5cb4037 207 else
Jeej 58:8d58e5cb4037 208 {
Jeej 58:8d58e5cb4037 209 // Discard payload
Jeej 58:8d58e5cb4037 210 alp_payload_free(alp);
Jeej 58:8d58e5cb4037 211 }
Jeej 58:8d58e5cb4037 212
Jeej 1:40ead20ecb14 213 if(eop)
Jeej 1:40ead20ecb14 214 { // This is mainly for debug, catch old pointers
Jeej 2:bcf269540633 215 //g_modem.user[id].data = NULL;
Jeej 2:bcf269540633 216 //g_modem.user[id].istatus= NULL;
Jeej 20:17852941b19e 217 REF_PRINT("EOP\n");
Jeej 65:c7749f9b6009 218
Jeej 65:c7749f9b6009 219 // User Callback
Jeej 65:c7749f9b6009 220 g_modem.user[id].cb(id);
Jeej 1:40ead20ecb14 221 }
Jeej 65:c7749f9b6009 222
Jeej 0:027760f45e2c 223 break;
Jeej 0:027760f45e2c 224 case WC_FLOW_SYS_RST:
Jeej 0:027760f45e2c 225 // 'Software' reset request
Jeej 31:517fc900afba 226 if (g_modem.cb->reset)
Jeej 31:517fc900afba 227 {
Jeej 31:517fc900afba 228 g_modem.cb->reset();
Jeej 31:517fc900afba 229 }
Jeej 0:027760f45e2c 230 break;
Jeej 0:027760f45e2c 231 case WC_FLOWID_CMD:
Jeej 65:c7749f9b6009 232 if (WM_BOOT == payload[0])
Jeej 0:027760f45e2c 233 {
Jeej 31:517fc900afba 234 if (g_modem.cb->boot)
Jeej 31:517fc900afba 235 {
Jeej 65:c7749f9b6009 236 uint8_t cause = payload[1];
Jeej 65:c7749f9b6009 237 uint16_t nb_boot = HAL_TO_U16(payload[4], payload[3]);
Jeej 65:c7749f9b6009 238
Jeej 56:67e3d9608403 239 g_modem.cb->boot(cause, nb_boot);
Jeej 31:517fc900afba 240 }
Jeej 0:027760f45e2c 241 }
Jeej 0:027760f45e2c 242 else
Jeej 0:027760f45e2c 243 {
Jeej 65:c7749f9b6009 244 REF_PRINT("Unsupported CMD :0x%x\n", payload[0]);
Jeej 0:027760f45e2c 245 }
Jeej 0:027760f45e2c 246 break;
Jeej 57:5444cfda9889 247 default:
Jeej 56:67e3d9608403 248 REF_PRINT("Unsupported WC Flowid:0x%x / %d Bytes\n", flowid, size);
Jeej 0:027760f45e2c 249 break;
Jeej 0:027760f45e2c 250 }
Jeej 0:027760f45e2c 251 }
Jeej 0:027760f45e2c 252
Jeej 57:5444cfda9889 253 static u32 modem_ref_add_root_permission(u8* p, u8* root_key, u8* action, u32 action_size)
Jeej 13:10589aaf8853 254 {
Jeej 57:5444cfda9889 255 u8 hash[32];
Jeej 13:10589aaf8853 256
Jeej 13:10589aaf8853 257 // Calculate hash on action
Jeej 13:10589aaf8853 258 kal_sha256_init();
Jeej 13:10589aaf8853 259 kal_sha256_update(action, action_size);
Jeej 56:67e3d9608403 260 kal_sha256_update(root_key, D7A_FS_ROOT_KEY_SIZE);
Jeej 13:10589aaf8853 261 kal_sha256_final(hash);
Jeej 13:10589aaf8853 262 // Prepend Permission-request...
Jeej 56:67e3d9608403 263 ALP_ACTION_PERM_REQ(p, false, ALP_PERM_REQ_ROOT, ALP_WIZZILAB_AUTH_PROTOCOL_ID);
Jeej 13:10589aaf8853 264 // ... and hash
Jeej 56:67e3d9608403 265 memcpy(p, hash, ALP_ACTION_PERM_REQ_TOKEN_SIZE);
Jeej 13:10589aaf8853 266
Jeej 13:10589aaf8853 267 return ALP_ACTION_PERM_REQ_OFFSET;
Jeej 13:10589aaf8853 268 }
Jeej 13:10589aaf8853 269
Jeej 56:67e3d9608403 270 int modem_ref_get_id(action_callback_t* cb)
Jeej 0:027760f45e2c 271 {
Jeej 0:027760f45e2c 272 int i;
Jeej 56:67e3d9608403 273 // Use rolling ids
Jeej 57:5444cfda9889 274 static u8 rolling;
Jeej 56:67e3d9608403 275
Jeej 56:67e3d9608403 276 for(i = 0; i < MAX_USER_NB; i++)
Jeej 0:027760f45e2c 277 {
Jeej 56:67e3d9608403 278 int id = (i + rolling) % MAX_USER_NB;
Jeej 56:67e3d9608403 279
Jeej 56:67e3d9608403 280 if (g_modem.user[id].cb == NULL)
Jeej 0:027760f45e2c 281 {
Jeej 56:67e3d9608403 282 g_modem.user[id].cb = cb;
Jeej 56:67e3d9608403 283 rolling++;
Jeej 58:8d58e5cb4037 284 //PRINT("Get ID:%d/0x%08x\n", id, cb);
Jeej 56:67e3d9608403 285 return id;
Jeej 0:027760f45e2c 286 }
Jeej 0:027760f45e2c 287 }
Jeej 56:67e3d9608403 288 ASSERT(i < MAX_USER_NB, "ASSERT: out of users\n");
Jeej 0:027760f45e2c 289 return -1;
Jeej 0:027760f45e2c 290 }
Jeej 0:027760f45e2c 291
Jeej 57:5444cfda9889 292 int modem_ref_free_id(u8 id)
Jeej 0:027760f45e2c 293 {
Jeej 0:027760f45e2c 294 if (id < MAX_USER_NB)
Jeej 0:027760f45e2c 295 {
Jeej 0:027760f45e2c 296 g_modem.user[id].cb = NULL;
Jeej 58:8d58e5cb4037 297 //PRINT("Free ID:%d\n", id);
Jeej 0:027760f45e2c 298 return id;
Jeej 0:027760f45e2c 299 }
Jeej 0:027760f45e2c 300 return -1;
Jeej 0:027760f45e2c 301 }
Jeej 0:027760f45e2c 302
Jeej 56:67e3d9608403 303 void modem_ref_open(fx_serial_send_t* send, modem_ref_callbacks_t* callbacks)
Jeej 0:027760f45e2c 304 {
Jeej 0:027760f45e2c 305 if (g_modem.state != STATE_OPEN)
Jeej 0:027760f45e2c 306 {
Jeej 57:5444cfda9889 307 g_modem.send = send;
Jeej 0:027760f45e2c 308 g_modem.cb = callbacks;
Jeej 56:67e3d9608403 309 memset(g_modem.user, 0, (MAX_USER_NB * sizeof(modem_ref_user_t)));
Jeej 0:027760f45e2c 310
Jeej 56:67e3d9608403 311 REF_PRINT("Open Modem - Max users:%d\n", MAX_USER_NB);
Jeej 0:027760f45e2c 312
Jeej 0:027760f45e2c 313 g_modem.state = STATE_OPEN;
Jeej 0:027760f45e2c 314 }
Jeej 0:027760f45e2c 315 }
Jeej 0:027760f45e2c 316
Jeej 56:67e3d9608403 317 void modem_ref_close(void)
Jeej 0:027760f45e2c 318 {
Jeej 0:027760f45e2c 319 if (g_modem.state == STATE_OPEN)
Jeej 0:027760f45e2c 320 {
Jeej 0:027760f45e2c 321 g_modem.state = STATE_CLOSED;
Jeej 0:027760f45e2c 322 }
Jeej 0:027760f45e2c 323 }
Jeej 0:027760f45e2c 324
Jeej 56:67e3d9608403 325 void modem_ref_reset(void)
Jeej 6:581caeee80e8 326 {
Jeej 57:5444cfda9889 327 serial_send(WizziComPacketSysReset, NULL);
Jeej 13:10589aaf8853 328 }
Jeej 13:10589aaf8853 329
Jeej 61:820395fc5572 330 void modem_ref_set_boot_cb(fx_boot_t* boot_cb)
Jeej 61:820395fc5572 331 {
Jeej 61:820395fc5572 332 g_modem.cb->boot = boot_cb;
Jeej 61:820395fc5572 333 }
Jeej 61:820395fc5572 334
Jeej 57:5444cfda9889 335 void modem_ref_alp(void* itf, alp_payload_t* alp_user, alp_payload_t** alp_rsp, int id)
Jeej 13:10589aaf8853 336 {
Jeej 57:5444cfda9889 337 alp_payload_t* alp = NULL;
Jeej 57:5444cfda9889 338
Jeej 57:5444cfda9889 339 if (alp_rsp)
Jeej 57:5444cfda9889 340 {
Jeej 57:5444cfda9889 341 // Expecting a response
Jeej 0:027760f45e2c 342
Jeej 57:5444cfda9889 343 // Make sure pointer value is NULL
Jeej 57:5444cfda9889 344 *alp_rsp = NULL;
Jeej 57:5444cfda9889 345 }
Jeej 57:5444cfda9889 346
Jeej 57:5444cfda9889 347 // response pointer
Jeej 57:5444cfda9889 348 g_modem.user[id].alp_rsp = alp_rsp;
Jeej 0:027760f45e2c 349
Jeej 56:67e3d9608403 350 // Always a tag
Jeej 56:67e3d9608403 351 alp = alp_payload_tag(alp, id);
Jeej 41:6f83174ffed4 352
Jeej 56:67e3d9608403 353 // Forward on itf if any
Jeej 56:67e3d9608403 354 if (itf)
Jeej 56:67e3d9608403 355 {
Jeej 56:67e3d9608403 356 alp = alp_payload_forward(alp, itf);
Jeej 17:b4ea2a912fd3 357 // NOP action to get istats on ACKs
Jeej 60:08efaaca0e83 358 alp = alp_payload_nop(alp, false);
Jeej 17:b4ea2a912fd3 359 }
Jeej 56:67e3d9608403 360
Jeej 56:67e3d9608403 361 // Add user payload
Jeej 57:5444cfda9889 362 alp = alp_payload_append(alp, alp_user);
Jeej 56:67e3d9608403 363
Jeej 56:67e3d9608403 364 // Send to modem
Jeej 57:5444cfda9889 365 serial_send(WizziComPacketAlpUns, alp);
Jeej 0:027760f45e2c 366 }
Jeej 0:027760f45e2c 367
Jeej 57:5444cfda9889 368 static void _modem_ref_rsp(alp_payload_t* alp_user, u8 err, int id)
Jeej 1:40ead20ecb14 369 {
Jeej 57:5444cfda9889 370 alp_payload_t* alp = NULL;
Jeej 56:67e3d9608403 371
Jeej 57:5444cfda9889 372 // response pointer
Jeej 57:5444cfda9889 373 g_modem.user[id].alp_rsp = NULL;
Jeej 1:40ead20ecb14 374
Jeej 56:67e3d9608403 375 // Always a tag
Jeej 56:67e3d9608403 376 alp = alp_payload_rsp_tag(alp, id, true, err);
Jeej 56:67e3d9608403 377
Jeej 56:67e3d9608403 378 // Add user payload
Jeej 57:5444cfda9889 379 alp = alp_payload_append(alp, alp_user);
Jeej 56:67e3d9608403 380
Jeej 56:67e3d9608403 381 // Send to modem
Jeej 60:08efaaca0e83 382 serial_send(WizziComPacketAlpResp, alp);
Jeej 18:a11302a76e96 383 }
Jeej 18:a11302a76e96 384
Jeej 57:5444cfda9889 385 void modem_ref_respond(u8 action, s8 status, int id)
Jeej 56:67e3d9608403 386 {
Jeej 57:5444cfda9889 387 alp_payload_t* alp = NULL;
Jeej 0:027760f45e2c 388
Jeej 56:67e3d9608403 389 alp = alp_payload_rsp_status(alp, action, status);
Jeej 56:67e3d9608403 390
Jeej 56:67e3d9608403 391 _modem_ref_rsp(alp, (status < ALP_ERR_NONE)? true: false, id);
Jeej 0:027760f45e2c 392 }
Jeej 0:027760f45e2c 393
Jeej 57:5444cfda9889 394 void modem_ref_respond_fprop(u8 fid, alp_file_header_t* hdr, int id)
Jeej 0:027760f45e2c 395 {
Jeej 57:5444cfda9889 396 alp_payload_t* alp = NULL;
Jeej 0:027760f45e2c 397
Jeej 56:67e3d9608403 398 alp = alp_payload_rsp_fprop(alp, fid, hdr);
Jeej 56:67e3d9608403 399
Jeej 56:67e3d9608403 400 _modem_ref_rsp(alp, false, id);
Jeej 0:027760f45e2c 401 }
Jeej 0:027760f45e2c 402
Jeej 57:5444cfda9889 403 void modem_ref_respond_read(u8 fid, void* data, u32 offset, u32 length, int id)
Jeej 0:027760f45e2c 404 {
Jeej 57:5444cfda9889 405 alp_payload_t* alp = NULL;
Jeej 56:67e3d9608403 406
Jeej 56:67e3d9608403 407 alp = alp_payload_rsp_f_data(alp, fid, data, offset, length);
Jeej 56:67e3d9608403 408
Jeej 56:67e3d9608403 409 _modem_ref_rsp(alp, false, id);
Jeej 13:10589aaf8853 410 }