Complete sensor demo.

Dependencies:   modem_ref_helper CRC X_NUCLEO_IKS01A1 DebouncedInterrupt

Committer:
Jeej
Date:
Tue Aug 20 14:09:08 2019 +0000
Revision:
16:58edbf31a37c
Parent:
15:1271f3566b98
Child:
18:51b15d8bf2fe
WizziCom now uses DMA instead of interrupts.

Who changed what in which revision?

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