Send file data through D7A Action Protocol demo.

Dependencies:   modem_ref_helper

Committer:
Jeej
Date:
Thu Oct 11 14:58:29 2018 +0000
Revision:
12:e0dba9c55dff
Parent:
10:daa4b52991b7
Child:
13:475a2286deef
Relaxed modem version check.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 5:4da1ea72e7b4 1 #include "modem_ref_helper.h"
Jeej 0:3058da317f01 2
Jeej 0:3058da317f01 3 extern Queue<void, 8> g_file_modified;
Jeej 0:3058da317f01 4
Jeej 0:3058da317f01 5 // ============================================================}}}
Jeej 0:3058da317f01 6
Jeej 0:3058da317f01 7 // Callbacks to MODEM's ALP requests
Jeej 0:3058da317f01 8 // ============================================================{{{
Jeej 0:3058da317f01 9 void my_read(u8 fid, u32 offset, u32 length, int id)
Jeej 0:3058da317f01 10 {
Jeej 1:0c24fa2e675a 11 u8 data[256];
Jeej 0:3058da317f01 12
Jeej 0:3058da317f01 13 if (ram_fs_read(fid, offset, length, data))
Jeej 0:3058da317f01 14 {
Jeej 1:0c24fa2e675a 15 modem_respond(0, ALP_ERR_FILE_NOT_FOUND, id);
Jeej 0:3058da317f01 16 }
Jeej 1:0c24fa2e675a 17 else
Jeej 1:0c24fa2e675a 18 {
Jeej 1:0c24fa2e675a 19 modem_respond_read(fid, data, offset, length, id);
Jeej 1:0c24fa2e675a 20 }
Jeej 0:3058da317f01 21 }
Jeej 0:3058da317f01 22
Jeej 0:3058da317f01 23 void my_write(u8 fid, void *data, u32 offset, u32 length, int id)
Jeej 0:3058da317f01 24 {
Jeej 5:4da1ea72e7b4 25 alp_errors_t err;
Jeej 2:05e74a02db6c 26
Jeej 5:4da1ea72e7b4 27 if (ram_fs_write(fid, offset, length, (uint8_t*)data))
Jeej 5:4da1ea72e7b4 28 {
Jeej 5:4da1ea72e7b4 29 err = ALP_ERR_FILE_NOT_FOUND;
Jeej 5:4da1ea72e7b4 30 }
Jeej 5:4da1ea72e7b4 31 else
Jeej 5:4da1ea72e7b4 32 {
Jeej 5:4da1ea72e7b4 33 err = ALP_ERR_NONE;
Jeej 5:4da1ea72e7b4 34 g_file_modified.put((void*)fid);
Jeej 5:4da1ea72e7b4 35 }
Jeej 5:4da1ea72e7b4 36
Jeej 5:4da1ea72e7b4 37 modem_respond(0, err, id);
Jeej 0:3058da317f01 38 }
Jeej 0:3058da317f01 39
Jeej 0:3058da317f01 40 void my_read_fprop(u8 fid, int id)
Jeej 0:3058da317f01 41 {
Jeej 0:3058da317f01 42 u8* hdr = (u8*)ram_fs_get_header(fid);
Jeej 0:3058da317f01 43
Jeej 0:3058da317f01 44 if (hdr != NULL)
Jeej 0:3058da317f01 45 {
Jeej 0:3058da317f01 46 modem_respond_fprop(fid, hdr, id);
Jeej 0:3058da317f01 47 }
Jeej 0:3058da317f01 48 else
Jeej 0:3058da317f01 49 {
Jeej 0:3058da317f01 50 modem_respond(0, ALP_ERR_FILE_NOT_FOUND, id);
Jeej 0:3058da317f01 51 }
Jeej 0:3058da317f01 52 }
Jeej 0:3058da317f01 53
Jeej 0:3058da317f01 54 void my_flush(u8 fid, int id)
Jeej 0:3058da317f01 55 {
Jeej 0:3058da317f01 56 // No flush in this file system
Jeej 0:3058da317f01 57 modem_respond(0, ALP_ERR_NONE, id);
Jeej 0:3058da317f01 58 }
Jeej 0:3058da317f01 59
Jeej 0:3058da317f01 60 void my_delete(u8 fid, int id)
Jeej 0:3058da317f01 61 {
Jeej 1:0c24fa2e675a 62 modem_respond(0, (ram_fs_delete(fid))? ALP_ERR_FILE_NOT_FOUND : ALP_ERR_NONE, id);
Jeej 0:3058da317f01 63 }
Jeej 0:3058da317f01 64
Jeej 10:daa4b52991b7 65 void my_udata(void *data, u32 length)
Jeej 10:daa4b52991b7 66 {
Jeej 10:daa4b52991b7 67 uint8_t* p = (uint8_t*)data;
Jeej 10:daa4b52991b7 68 int32_t rem = length;
Jeej 10:daa4b52991b7 69 alp_parsed_chunk_t r;
Jeej 10:daa4b52991b7 70 d7a_sp_res_t* istat;
Jeej 10:daa4b52991b7 71
Jeej 10:daa4b52991b7 72 do {
Jeej 10:daa4b52991b7 73 uint32_t parsed = alp_parse_chunk(&p, &r);
Jeej 10:daa4b52991b7 74 if (!parsed)
Jeej 10:daa4b52991b7 75 {
Jeej 10:daa4b52991b7 76 // Discard the payload in case of parsing error.
Jeej 10:daa4b52991b7 77 PRINT("Parsing error!\r\n");
Jeej 10:daa4b52991b7 78 break;
Jeej 10:daa4b52991b7 79 }
Jeej 10:daa4b52991b7 80 rem -= parsed;
Jeej 10:daa4b52991b7 81
Jeej 10:daa4b52991b7 82 switch (r.type)
Jeej 10:daa4b52991b7 83 {
Jeej 10:daa4b52991b7 84 // Interface status
Jeej 10:daa4b52991b7 85 case ALP_OPCODE_RSP_ISTATUS:
Jeej 10:daa4b52991b7 86 // D7A Interface
Jeej 10:daa4b52991b7 87 if (ALP_ITF_TYPE_D7A == r.meta.itf.type)
Jeej 10:daa4b52991b7 88 {
Jeej 10:daa4b52991b7 89 union {
Jeej 10:daa4b52991b7 90 u8 b[8];
Jeej 10:daa4b52991b7 91 u32 w[2];
Jeej 10:daa4b52991b7 92 } uid;
Jeej 10:daa4b52991b7 93
Jeej 10:daa4b52991b7 94 // ISTATUS can come either alone or together with ALP_OPCODE_RSP_F_DATA
Jeej 10:daa4b52991b7 95 // but there should be only one per payload, moreover it will come first
Jeej 10:daa4b52991b7 96 istat = (d7a_sp_res_t*)r.data;
Jeej 10:daa4b52991b7 97 memcpy(uid.b,istat->addressee.id,8);
Jeej 10:daa4b52991b7 98
Jeej 10:daa4b52991b7 99 PRINT("Got accessed by UID:%08X%08X SNR: %3ddB RXLEV: -%-3ddBm LB: %3ddB\n",
Jeej 10:daa4b52991b7 100 HAL_U32_BYTE_SWAP(uid.w[0]), HAL_U32_BYTE_SWAP(uid.w[1]),
Jeej 10:daa4b52991b7 101 istat->snr, istat->rxlev, istat->lb);
Jeej 10:daa4b52991b7 102 }
Jeej 10:daa4b52991b7 103 else
Jeej 10:daa4b52991b7 104 {
Jeej 10:daa4b52991b7 105 PRINT("Got accessed by unknown Interface 0x%02X\n", r.meta.itf.type);
Jeej 10:daa4b52991b7 106 }
Jeej 10:daa4b52991b7 107 break;
Jeej 10:daa4b52991b7 108 // Data return
Jeej 10:daa4b52991b7 109 case ALP_OPCODE_RSP_F_DATA:
Jeej 10:daa4b52991b7 110 // RSP_F_DATA can come either alone or together with ISTATUS
Jeej 10:daa4b52991b7 111 PRINT("Got UNS File[%3d]@%d %d Bytes\n", r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 10:daa4b52991b7 112 break;
Jeej 10:daa4b52991b7 113 default:
Jeej 10:daa4b52991b7 114 PRINT("Untreated OPCODE %d\n", r.type);
Jeej 10:daa4b52991b7 115 break;
Jeej 10:daa4b52991b7 116 }
Jeej 10:daa4b52991b7 117 } while (rem > 0);
Jeej 5:4da1ea72e7b4 118 }
Jeej 5:4da1ea72e7b4 119
Jeej 0:3058da317f01 120 void my_lqual(u8 ifid, int per)
Jeej 0:3058da317f01 121 {
Jeej 4:45576db9f66c 122 PRINT("Interface File [%3d] LQUAL : %d%% PER\r\n", ifid, per);
Jeej 0:3058da317f01 123 }
Jeej 0:3058da317f01 124
Jeej 0:3058da317f01 125 void my_ldown(u8 ifid)
Jeej 0:3058da317f01 126 {
Jeej 4:45576db9f66c 127 PRINT("Interface File [%3d] LDOWN\r\n", ifid);
Jeej 0:3058da317f01 128 }
Jeej 0:3058da317f01 129
Jeej 0:3058da317f01 130 void my_reset(void)
Jeej 0:3058da317f01 131 {
Jeej 10:daa4b52991b7 132 PRINT("Restarting application...\r\n");
Jeej 10:daa4b52991b7 133 FLUSH();
Jeej 0:3058da317f01 134 NVIC_SystemReset();
Jeej 0:3058da317f01 135 }
Jeej 0:3058da317f01 136
Jeej 0:3058da317f01 137 void my_boot(u8 cause, u16 number)
Jeej 0:3058da317f01 138 {
Jeej 10:daa4b52991b7 139 PRINT("Modem BOOT[%c] #%d\r\n", cause, number);
Jeej 0:3058da317f01 140
Jeej 0:3058da317f01 141 // Modem re-booted, restart APP
Jeej 0:3058da317f01 142 my_reset();
Jeej 10:daa4b52991b7 143 }
Jeej 10:daa4b52991b7 144
Jeej 10:daa4b52991b7 145 void my_busy(u8 busy)
Jeej 10:daa4b52991b7 146 {
Jeej 10:daa4b52991b7 147 if (busy)
Jeej 10:daa4b52991b7 148 {
Jeej 10:daa4b52991b7 149 PRINT("Modem Busy\r\n");
Jeej 10:daa4b52991b7 150
Jeej 10:daa4b52991b7 151 /* Stop report, do not use modem */
Jeej 10:daa4b52991b7 152 /* Wait for modem reboot or modem not busy */
Jeej 10:daa4b52991b7 153 }
Jeej 10:daa4b52991b7 154 else
Jeej 10:daa4b52991b7 155 {
Jeej 10:daa4b52991b7 156 PRINT("Modem not Busy\r\n");
Jeej 10:daa4b52991b7 157
Jeej 10:daa4b52991b7 158 /* Resume reports */
Jeej 10:daa4b52991b7 159 }
Jeej 0:3058da317f01 160 }