Dash7Board Code Upgrade Protocol demonstration code.

Dependencies:   modem_ref_helper CRC

Committer:
Jeej
Date:
Tue Feb 27 11:06:42 2018 +0000
Revision:
1:dd4e18b267a1
Parent:
0:5589104abba0
Child:
2:49acddddec25
Added Busy URC and callback

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:5589104abba0 1 #include "modem_ref_helper.h"
Jeej 0:5589104abba0 2 #include "files.h"
Jeej 0:5589104abba0 3 #include "fast_crc32.h"
Jeej 0:5589104abba0 4
Jeej 0:5589104abba0 5 #define SERIAL_MAX_PACKET_SIZE (255)
Jeej 0:5589104abba0 6
Jeej 0:5589104abba0 7 uint32_t stream_crc = 0;
Jeej 0:5589104abba0 8
Jeej 0:5589104abba0 9 // ============================================================}}}
Jeej 0:5589104abba0 10
Jeej 0:5589104abba0 11 // Callbacks to MODEM's ALP requests
Jeej 0:5589104abba0 12 // ============================================================{{{
Jeej 0:5589104abba0 13 void my_read(u8 fid, u32 offset, u32 length, int id)
Jeej 0:5589104abba0 14 {
Jeej 0:5589104abba0 15 u8 data[SERIAL_MAX_PACKET_SIZE];
Jeej 0:5589104abba0 16
Jeej 0:5589104abba0 17 ASSERT((ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE(offset, length)) <= SERIAL_MAX_PACKET_SIZE,
Jeej 0:5589104abba0 18 "Read response too big for serial protocol (%d/%dmax)\r\n", length, ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE(offset,SERIAL_MAX_PACKET_SIZE));
Jeej 0:5589104abba0 19
Jeej 0:5589104abba0 20 if (ram_fs_read(fid, offset, length, data))
Jeej 0:5589104abba0 21 {
Jeej 0:5589104abba0 22 modem_respond(0, ALP_ERR_FILE_NOT_FOUND, id);
Jeej 0:5589104abba0 23 }
Jeej 0:5589104abba0 24 else
Jeej 0:5589104abba0 25 {
Jeej 0:5589104abba0 26 modem_respond_read(fid, data, offset, length, id);
Jeej 0:5589104abba0 27 }
Jeej 0:5589104abba0 28 }
Jeej 0:5589104abba0 29
Jeej 0:5589104abba0 30 void my_write(u8 fid, void *data, u32 offset, u32 length, int id)
Jeej 0:5589104abba0 31 {
Jeej 0:5589104abba0 32 if (!ram_fs_write(fid, offset, length, (uint8_t*)data) || FID_APP_CUP_CODE == fid)
Jeej 0:5589104abba0 33 {
Jeej 0:5589104abba0 34 touch_t* touch = (touch_t*)MALLOC(sizeof(touch_t));
Jeej 0:5589104abba0 35
Jeej 0:5589104abba0 36 if (FID_APP_CUP_CODE == fid)
Jeej 0:5589104abba0 37 {
Jeej 0:5589104abba0 38 // Calculate crc on chunk
Jeej 0:5589104abba0 39 stream_crc = crc32_fast(data, length, stream_crc);
Jeej 0:5589104abba0 40
Jeej 0:5589104abba0 41 /************************/
Jeej 0:5589104abba0 42 /* Save the chunk data. */
Jeej 0:5589104abba0 43 /************************/
Jeej 0:5589104abba0 44 }
Jeej 0:5589104abba0 45
Jeej 0:5589104abba0 46 touch->fid = fid;
Jeej 0:5589104abba0 47 touch->offset = offset;
Jeej 0:5589104abba0 48 touch->length = length;
Jeej 0:5589104abba0 49
Jeej 0:5589104abba0 50 g_file_modified.put(touch);
Jeej 0:5589104abba0 51
Jeej 0:5589104abba0 52 modem_respond(0, ALP_ERR_NONE, id);
Jeej 0:5589104abba0 53 }
Jeej 0:5589104abba0 54 else
Jeej 0:5589104abba0 55 {
Jeej 0:5589104abba0 56 modem_respond(0, ALP_ERR_FILE_NOT_FOUND, id);
Jeej 0:5589104abba0 57 }
Jeej 0:5589104abba0 58 }
Jeej 0:5589104abba0 59
Jeej 0:5589104abba0 60 void my_read_fprop(u8 fid, int id)
Jeej 0:5589104abba0 61 {
Jeej 0:5589104abba0 62 u8* hdr = (u8*)ram_fs_get_header(fid);
Jeej 0:5589104abba0 63
Jeej 0:5589104abba0 64 if (hdr != NULL)
Jeej 0:5589104abba0 65 {
Jeej 0:5589104abba0 66 modem_respond_fprop(fid, hdr, id);
Jeej 0:5589104abba0 67 }
Jeej 0:5589104abba0 68 else
Jeej 0:5589104abba0 69 {
Jeej 0:5589104abba0 70 modem_respond(0, ALP_ERR_FILE_NOT_FOUND, id);
Jeej 0:5589104abba0 71 }
Jeej 0:5589104abba0 72 }
Jeej 0:5589104abba0 73
Jeej 0:5589104abba0 74 void my_flush(u8 fid, int id)
Jeej 0:5589104abba0 75 {
Jeej 0:5589104abba0 76 // No flush in this file system
Jeej 0:5589104abba0 77 modem_respond(0, ALP_ERR_NONE, id);
Jeej 0:5589104abba0 78 }
Jeej 0:5589104abba0 79
Jeej 0:5589104abba0 80 void my_delete(u8 fid, int id)
Jeej 0:5589104abba0 81 {
Jeej 0:5589104abba0 82 modem_respond(0, ALP_ERR_FILE_NOT_FOUND, id);
Jeej 0:5589104abba0 83 }
Jeej 0:5589104abba0 84
Jeej 0:5589104abba0 85 void my_udata(u8 fid, void *data, u32 offset, u32 length, u8 i_type, u8 i_length, u8* i_data)
Jeej 0:5589104abba0 86 {
Jeej 0:5589104abba0 87 (void)data;
Jeej 0:5589104abba0 88 (void)i_length;
Jeej 0:5589104abba0 89 PRINT("Got UNS File[%3d]@%d %d Bytes\r\n",fid,offset,length);
Jeej 0:5589104abba0 90 if (i_type == ALP_ITF_TYPE_D7A)
Jeej 0:5589104abba0 91 {
Jeej 0:5589104abba0 92 static union {
Jeej 0:5589104abba0 93 u8 b[8];
Jeej 0:5589104abba0 94 u32 w[2];
Jeej 0:5589104abba0 95 } uid;
Jeej 0:5589104abba0 96 d7a_sp_res_t* istat = (d7a_sp_res_t*) i_data;
Jeej 0:5589104abba0 97 memcpy(uid.b,istat->addressee.id,8);
Jeej 0:5589104abba0 98 PRINT("From UID: %08X%08X (rxlev:%d lb:%d)\r\n",
Jeej 0:5589104abba0 99 HAL_U32_BYTE_SWAP(uid.w[0]), HAL_U32_BYTE_SWAP(uid.w[1]),
Jeej 0:5589104abba0 100 istat->rxlev, istat->lb);
Jeej 0:5589104abba0 101 }
Jeej 0:5589104abba0 102 }
Jeej 0:5589104abba0 103
Jeej 0:5589104abba0 104 void my_lqual(u8 ifid, int per)
Jeej 0:5589104abba0 105 {
Jeej 0:5589104abba0 106 PRINT("Interface File [%3d] LQUAL : %d%% PER\r\n", ifid, per);
Jeej 0:5589104abba0 107 }
Jeej 0:5589104abba0 108
Jeej 0:5589104abba0 109 void my_ldown(u8 ifid)
Jeej 0:5589104abba0 110 {
Jeej 0:5589104abba0 111 PRINT("Interface File [%3d] LDOWN\r\n", ifid);
Jeej 0:5589104abba0 112 }
Jeej 0:5589104abba0 113
Jeej 0:5589104abba0 114 void my_reset(void)
Jeej 0:5589104abba0 115 {
Jeej 0:5589104abba0 116 PRINT("Restarting application...\r\n");
Jeej 0:5589104abba0 117 FLUSH();
Jeej 0:5589104abba0 118 NVIC_SystemReset();
Jeej 0:5589104abba0 119 }
Jeej 0:5589104abba0 120
Jeej 0:5589104abba0 121 void my_boot(u8 cause, u16 number)
Jeej 0:5589104abba0 122 {
Jeej 0:5589104abba0 123 PRINT("Modem BOOT[%c] #%d\r\n", cause, number);
Jeej 0:5589104abba0 124
Jeej 0:5589104abba0 125 // Modem re-booted, restart APP
Jeej 0:5589104abba0 126 my_reset();
Jeej 1:dd4e18b267a1 127 }
Jeej 1:dd4e18b267a1 128
Jeej 1:dd4e18b267a1 129 void my_busy(u8 busy)
Jeej 1:dd4e18b267a1 130 {
Jeej 1:dd4e18b267a1 131 if (busy)
Jeej 1:dd4e18b267a1 132 {
Jeej 1:dd4e18b267a1 133 PRINT("Modem Busy\r\n");
Jeej 1:dd4e18b267a1 134
Jeej 1:dd4e18b267a1 135 /* Stop application */
Jeej 1:dd4e18b267a1 136 /* Wait for modem reboot or modem not busy */
Jeej 1:dd4e18b267a1 137 }
Jeej 1:dd4e18b267a1 138 else
Jeej 1:dd4e18b267a1 139 {
Jeej 1:dd4e18b267a1 140 PRINT("Modem not Busy\r\n");
Jeej 1:dd4e18b267a1 141
Jeej 1:dd4e18b267a1 142 /* Resume application */
Jeej 1:dd4e18b267a1 143 }
Jeej 0:5589104abba0 144 }