Sending and reception of big data file (1kB example)

Dependencies:   modem_ref_helper CRC DebouncedInterrupt

Committer:
Jeej
Date:
Thu Dec 14 14:22:40 2017 +0000
Revision:
0:a2bbc478f812
Child:
1:76a8a3cc5f2e
Sanity commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:a2bbc478f812 1 // @autor: jeremie@wizzilab.com
Jeej 0:a2bbc478f812 2 // @date: 2017-12-14
Jeej 0:a2bbc478f812 3
Jeej 0:a2bbc478f812 4 #include "DebouncedInterrupt.h"
Jeej 0:a2bbc478f812 5 #include "modem_ref_helper.h"
Jeej 0:a2bbc478f812 6 #include "modem_callbacks.h"
Jeej 0:a2bbc478f812 7 #include "files.h"
Jeej 0:a2bbc478f812 8 #include "crc.h"
Jeej 0:a2bbc478f812 9
Jeej 0:a2bbc478f812 10 #define MIN(a,b) ((a<b)?a:b)
Jeej 0:a2bbc478f812 11
Jeej 0:a2bbc478f812 12 #define MY_POLICY_IDX 0
Jeej 0:a2bbc478f812 13 #define FID_OUTPUT_FILE 200
Jeej 0:a2bbc478f812 14 #define CHUNK_SIZE 128
Jeej 0:a2bbc478f812 15
Jeej 0:a2bbc478f812 16 Semaphore button_user(0);
Jeej 0:a2bbc478f812 17 Semaphore modem_ready(0);
Jeej 0:a2bbc478f812 18 Queue<void, 8> modem_resp[MAX_USER_NB];
Jeej 0:a2bbc478f812 19 Queue<touch_t, 8> g_file_modified;
Jeej 0:a2bbc478f812 20
Jeej 0:a2bbc478f812 21 enum {
Jeej 0:a2bbc478f812 22 MODEM_RESP_NO,
Jeej 0:a2bbc478f812 23 MODEM_RESP_TERMINAL,
Jeej 0:a2bbc478f812 24 MODEM_RESP_ERROR,
Jeej 0:a2bbc478f812 25 MODEM_RESP_ACK,
Jeej 0:a2bbc478f812 26 MODEM_RESP_TIMEOUT,
Jeej 0:a2bbc478f812 27 };
Jeej 0:a2bbc478f812 28
Jeej 0:a2bbc478f812 29 const input_file_t output_file = {
Jeej 0:a2bbc478f812 30 .data = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec id pulvinar est. Mauris pretium arcu at facilisis rutrum. Nulla facilisi. "
Jeej 0:a2bbc478f812 31 "Quisque auctor, massa et gravida semper, libero dui varius est, quis ornare dolor odio a turpis. Suspendisse in turpis vel risus porta "
Jeej 0:a2bbc478f812 32 "aliquet et a nibh. Mauris vehicula purus ut risus convallis, id luctus erat tincidunt. Aenean vitae gravida nisi. Nulla eleifend lorem "
Jeej 0:a2bbc478f812 33 "purus, non sagittis neque accumsan molestie.\n"
Jeej 0:a2bbc478f812 34 "\n"
Jeej 0:a2bbc478f812 35 "Praesent interdum semper viverra. Cras ut sodales quam. Etiam vitae orci sit amet lorem semper commodo. Phasellus elementum nec dui eget "
Jeej 0:a2bbc478f812 36 "pellentesque. Proin eget dignissim nibh. In iaculis imperdiet enim, consequat gravida mi varius sed. Suspendisse eu elementum justo. "
Jeej 0:a2bbc478f812 37 "Donec non mauris odio. Sed aliquet vestibulum risus non ultricies. Integer mollis neque id magna gravida auctor. Cras at auctor velit. "
Jeej 0:a2bbc478f812 38 "Vivamus tempor dui purus, id commodo arcu iaculis a. Curabitur hendrerit, nibh sit amet gravida porttitor, leo magna gravida ex, non "
Jeej 0:a2bbc478f812 39 "porta ligula quam ac risus. Maur",
Jeej 0:a2bbc478f812 40 // Used only to know size and offset
Jeej 0:a2bbc478f812 41 .crc = 0,
Jeej 0:a2bbc478f812 42 }
Jeej 0:a2bbc478f812 43
Jeej 0:a2bbc478f812 44
Jeej 0:a2bbc478f812 45
Jeej 0:a2bbc478f812 46 alp_retry_policy_t my_policy = {
Jeej 0:a2bbc478f812 47 .meta.procedure = 0,
Jeej 0:a2bbc478f812 48 .meta.respond = true,
Jeej 0:a2bbc478f812 49 .meta.persistant = false,
Jeej 0:a2bbc478f812 50 .meta.bulk = false,
Jeej 0:a2bbc478f812 51 .depth = 1,
Jeej 0:a2bbc478f812 52 .retries = 0,
Jeej 0:a2bbc478f812 53 .slot_time = 0
Jeej 0:a2bbc478f812 54 };
Jeej 0:a2bbc478f812 55
Jeej 0:a2bbc478f812 56 alp_d7a_itf_t my_itf = {
Jeej 0:a2bbc478f812 57 .type = ALP_ITF_TYPE_D7A,
Jeej 0:a2bbc478f812 58 .cfg.to = 0,
Jeej 0:a2bbc478f812 59 .cfg.te = 0,
Jeej 0:a2bbc478f812 60 .cfg.qos.bf.resp = D7A_RESP_PREFERRED,
Jeej 0:a2bbc478f812 61 .cfg.qos.bf.retry = MY_POLICY_IDX,
Jeej 0:a2bbc478f812 62 .cfg.qos.bf.record = 0,
Jeej 0:a2bbc478f812 63 .cfg.qos.bf.stop_on_err = 0,
Jeej 0:a2bbc478f812 64 .cfg.addressee.ctrl.bf.nls = D7A_NLS_AES_CCM_64,
Jeej 0:a2bbc478f812 65 .cfg.addressee.ctrl.bf.idf = D7A_ID_NBID,
Jeej 0:a2bbc478f812 66 .cfg.addressee.xcl.bf = {.s = 0x0, .m = 0x1},// XXX D7A_XCL_GW,
Jeej 0:a2bbc478f812 67 .cfg.addressee.id[0] = 4,
Jeej 0:a2bbc478f812 68 };
Jeej 0:a2bbc478f812 69
Jeej 0:a2bbc478f812 70 void print_resp(uint8_t id, int status)
Jeej 0:a2bbc478f812 71 {
Jeej 0:a2bbc478f812 72 switch (status)
Jeej 0:a2bbc478f812 73 {
Jeej 0:a2bbc478f812 74 case ALP_ERR_NONE:
Jeej 0:a2bbc478f812 75 //PRINT("Resp[%d]: OK\n", id);
Jeej 0:a2bbc478f812 76 break;
Jeej 0:a2bbc478f812 77 case ALP_ERR_FILE_EXIST:
Jeej 0:a2bbc478f812 78 PRINT("Resp[%d]: Already registered\n", id);
Jeej 0:a2bbc478f812 79 break;
Jeej 0:a2bbc478f812 80 default:
Jeej 0:a2bbc478f812 81 PRINT("Resp[%d]: error %d\n", id, status);
Jeej 0:a2bbc478f812 82 break;
Jeej 0:a2bbc478f812 83 }
Jeej 0:a2bbc478f812 84 }
Jeej 0:a2bbc478f812 85
Jeej 0:a2bbc478f812 86 // Callback for broadcast read
Jeej 0:a2bbc478f812 87 void my_response_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:a2bbc478f812 88 {
Jeej 0:a2bbc478f812 89 (void)id;
Jeej 0:a2bbc478f812 90
Jeej 0:a2bbc478f812 91 print_resp(id, err);
Jeej 0:a2bbc478f812 92
Jeej 0:a2bbc478f812 93 if (terminal)
Jeej 0:a2bbc478f812 94 {
Jeej 0:a2bbc478f812 95 modem_resp[id].put((void*)MODEM_RESP_TERMINAL);
Jeej 0:a2bbc478f812 96 }
Jeej 0:a2bbc478f812 97 else
Jeej 0:a2bbc478f812 98 {
Jeej 0:a2bbc478f812 99 if (ALP_ERR_NONE == err)
Jeej 0:a2bbc478f812 100 {
Jeej 0:a2bbc478f812 101 modem_resp[id].put((void*)MODEM_RESP_ACK);
Jeej 0:a2bbc478f812 102 }
Jeej 0:a2bbc478f812 103 else
Jeej 0:a2bbc478f812 104 {
Jeej 0:a2bbc478f812 105 modem_resp[id].put((void*)MODEM_RESP_ERROR);
Jeej 0:a2bbc478f812 106 }
Jeej 0:a2bbc478f812 107 }
Jeej 0:a2bbc478f812 108 }
Jeej 0:a2bbc478f812 109
Jeej 0:a2bbc478f812 110 // Interrupt Service Routine on button press.
Jeej 0:a2bbc478f812 111 void button_push_isr( void )
Jeej 0:a2bbc478f812 112 {
Jeej 0:a2bbc478f812 113 button_user.release();
Jeej 0:a2bbc478f812 114 }
Jeej 0:a2bbc478f812 115
Jeej 0:a2bbc478f812 116 void button_user_thread()
Jeej 0:a2bbc478f812 117 {
Jeej 0:a2bbc478f812 118 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:a2bbc478f812 119
Jeej 0:a2bbc478f812 120 osEvent evt;
Jeej 0:a2bbc478f812 121 uint32_t resp;
Jeej 0:a2bbc478f812 122 d7a_sp_res_t istat;
Jeej 0:a2bbc478f812 123 uint32_t sent = 0;
Jeej 0:a2bbc478f812 124 uint8_t chunk[CHUNK_SIZE];
Jeej 0:a2bbc478f812 125
Jeej 0:a2bbc478f812 126 uint8_t id = modem_get_id(my_response_callback);
Jeej 0:a2bbc478f812 127
Jeej 0:a2bbc478f812 128 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:a2bbc478f812 129
Jeej 0:a2bbc478f812 130 while (true)
Jeej 0:a2bbc478f812 131 {
Jeej 0:a2bbc478f812 132 Timer tim;
Jeej 0:a2bbc478f812 133 bool is_ok;
Jeej 0:a2bbc478f812 134
Jeej 0:a2bbc478f812 135 // Calculate CRC
Jeej 0:a2bbc478f812 136 uint32_t crc = calculate_crc32(output_file, sizeof(output_file));
Jeej 0:a2bbc478f812 137
Jeej 0:a2bbc478f812 138 // Wait for button press
Jeej 0:a2bbc478f812 139 PRINT("Press user button to send file.\n");
Jeej 0:a2bbc478f812 140 button_user.wait();
Jeej 0:a2bbc478f812 141
Jeej 0:a2bbc478f812 142 sent = 0;
Jeej 0:a2bbc478f812 143 tim.start();
Jeej 0:a2bbc478f812 144
Jeej 0:a2bbc478f812 145 // Send chunks
Jeej 0:a2bbc478f812 146 while (sent < sizeof(output_file))
Jeej 0:a2bbc478f812 147 {
Jeej 0:a2bbc478f812 148 is_ok = false;
Jeej 0:a2bbc478f812 149 uint32_t chunk_size = MIN(sizeof(chunk), sizeof(output_file) - sent);
Jeej 0:a2bbc478f812 150 uint32_t chunk_offset = sent;
Jeej 0:a2bbc478f812 151
Jeej 0:a2bbc478f812 152 memcpy(chunk, &(output_file[chunk_offset]), chunk_size);
Jeej 0:a2bbc478f812 153
Jeej 0:a2bbc478f812 154 PRINT("Sending chunk %4d/%4d (%3d bytes)... ", chunk_offset, sizeof(output_file), chunk_size);
Jeej 0:a2bbc478f812 155 FLUSH();
Jeej 0:a2bbc478f812 156 modem_send_file_content((uint8_t*)&my_itf, D7_ITF_SIZE(&my_itf), (void*)&istat, FID_OUTPUT_FILE, chunk, chunk_offset, chunk_size, id);
Jeej 0:a2bbc478f812 157
Jeej 0:a2bbc478f812 158 do
Jeej 0:a2bbc478f812 159 {
Jeej 0:a2bbc478f812 160 evt = modem_resp.get(3000);
Jeej 0:a2bbc478f812 161 resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_TIMEOUT;
Jeej 0:a2bbc478f812 162
Jeej 0:a2bbc478f812 163 if (MODEM_RESP_ACK == resp)
Jeej 0:a2bbc478f812 164 {
Jeej 0:a2bbc478f812 165 //PRINT_DATA("ACK UID:", "%02X", istat.addressee.id, 8, " ");
Jeej 0:a2bbc478f812 166 //PRINT("SNR:%d dB RXLEV:%d dBm LB:%d dB\n", istat.snr, -istat.rxlev, istat.lb);
Jeej 0:a2bbc478f812 167
Jeej 0:a2bbc478f812 168 //PRINT("ACK.\n");
Jeej 0:a2bbc478f812 169 is_ok = true;
Jeej 0:a2bbc478f812 170 }
Jeej 0:a2bbc478f812 171 else if (MODEM_RESP_TIMEOUT == resp)
Jeej 0:a2bbc478f812 172 {
Jeej 0:a2bbc478f812 173 PRINT("TIMEOUT.\n");
Jeej 0:a2bbc478f812 174 }
Jeej 0:a2bbc478f812 175 else if (MODEM_RESP_ERROR == resp)
Jeej 0:a2bbc478f812 176 {
Jeej 0:a2bbc478f812 177 //PRINT("ERROR.\n");
Jeej 0:a2bbc478f812 178 break;
Jeej 0:a2bbc478f812 179 }
Jeej 0:a2bbc478f812 180 else if (MODEM_RESP_TERMINAL == resp)
Jeej 0:a2bbc478f812 181 {
Jeej 0:a2bbc478f812 182 //PRINT("DONE.\n");
Jeej 0:a2bbc478f812 183 }
Jeej 0:a2bbc478f812 184
Jeej 0:a2bbc478f812 185 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:a2bbc478f812 186 } while (MODEM_RESP_TERMINAL != resp);
Jeej 0:a2bbc478f812 187
Jeej 0:a2bbc478f812 188 if (is_ok)
Jeej 0:a2bbc478f812 189 {
Jeej 0:a2bbc478f812 190 sent += chunk_size;
Jeej 0:a2bbc478f812 191 PRINT("OK.\n");
Jeej 0:a2bbc478f812 192 }
Jeej 0:a2bbc478f812 193 else
Jeej 0:a2bbc478f812 194 {
Jeej 0:a2bbc478f812 195 PRINT("FAILED.\n");
Jeej 0:a2bbc478f812 196 break;
Jeej 0:a2bbc478f812 197 }
Jeej 0:a2bbc478f812 198 }
Jeej 0:a2bbc478f812 199
Jeej 0:a2bbc478f812 200 double time_s = tim.read();
Jeej 0:a2bbc478f812 201 if (sent)
Jeej 0:a2bbc478f812 202 {
Jeej 0:a2bbc478f812 203 PRINT("%d bytes sent in %.3fs (%d B/s)\n", sent, time_s, (int)((double)sent/time_s));
Jeej 0:a2bbc478f812 204 }
Jeej 0:a2bbc478f812 205
Jeej 0:a2bbc478f812 206 if (is_ok)
Jeej 0:a2bbc478f812 207 {
Jeej 0:a2bbc478f812 208 // Send CRC
Jeej 0:a2bbc478f812 209 PRINT("Sendind CRC 0x%08X\n", crc);
Jeej 0:a2bbc478f812 210 modem_send_file_content((uint8_t*)&my_itf, D7_ITF_SIZE(&my_itf), (void*)&istat, FID_OUTPUT_FILE, &crc, offsetof(input_file_t, crc), sizeof_field(input_file_t, crc), id);
Jeej 0:a2bbc478f812 211
Jeej 0:a2bbc478f812 212 do
Jeej 0:a2bbc478f812 213 {
Jeej 0:a2bbc478f812 214 evt = modem_resp[id].get(3000);
Jeej 0:a2bbc478f812 215 resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_TIMEOUT;
Jeej 0:a2bbc478f812 216
Jeej 0:a2bbc478f812 217 if (MODEM_RESP_ACK == resp)
Jeej 0:a2bbc478f812 218 {
Jeej 0:a2bbc478f812 219 PRINT_DATA("ACK UID:", "%02X", istat.addressee.id, 8, " ");
Jeej 0:a2bbc478f812 220 PRINT("SNR:%d dB RXLEV:%d dBm LB:%d dB\n", istat.snr, -istat.rxlev, istat.lb);
Jeej 0:a2bbc478f812 221 }
Jeej 0:a2bbc478f812 222 else if (MODEM_RESP_TIMEOUT == resp)
Jeej 0:a2bbc478f812 223 {
Jeej 0:a2bbc478f812 224 PRINT("TIMEOUT.\n");
Jeej 0:a2bbc478f812 225 }
Jeej 0:a2bbc478f812 226 else if (MODEM_RESP_ERROR == resp)
Jeej 0:a2bbc478f812 227 {
Jeej 0:a2bbc478f812 228 PRINT("ERROR.\n");
Jeej 0:a2bbc478f812 229 break;
Jeej 0:a2bbc478f812 230 }
Jeej 0:a2bbc478f812 231 else if (MODEM_RESP_TERMINAL == resp)
Jeej 0:a2bbc478f812 232 {
Jeej 0:a2bbc478f812 233 PRINT("DONE.\n");
Jeej 0:a2bbc478f812 234 }
Jeej 0:a2bbc478f812 235
Jeej 0:a2bbc478f812 236 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:a2bbc478f812 237 } while (MODEM_RESP_TERMINAL != resp);
Jeej 0:a2bbc478f812 238 }
Jeej 0:a2bbc478f812 239 }
Jeej 0:a2bbc478f812 240 }
Jeej 0:a2bbc478f812 241
Jeej 0:a2bbc478f812 242 void thread_file_modified()
Jeej 0:a2bbc478f812 243 {
Jeej 0:a2bbc478f812 244 touch_t* touch;
Jeej 0:a2bbc478f812 245 osEvent evt;
Jeej 0:a2bbc478f812 246 uint8_t chunk[CHUNK_SIZE];
Jeej 0:a2bbc478f812 247
Jeej 0:a2bbc478f812 248 uint8_t id = modem_get_id(my_response_callback);
Jeej 0:a2bbc478f812 249
Jeej 0:a2bbc478f812 250 while (true)
Jeej 0:a2bbc478f812 251 {
Jeej 0:a2bbc478f812 252 evt = g_file_modified.get();
Jeej 0:a2bbc478f812 253 touch = (evt.status == osEventMessage)? (touch_t*)evt.value.p : NULL;
Jeej 0:a2bbc478f812 254 ASSERT(touch != NULL, "NULL touch pointer!\n");
Jeej 0:a2bbc478f812 255
Jeej 0:a2bbc478f812 256 switch (touch->fid)
Jeej 0:a2bbc478f812 257 {
Jeej 0:a2bbc478f812 258 case FID_INPUT_FILE:
Jeej 0:a2bbc478f812 259 PRINT("Got chunk %4d/%4d (%3d bytes)\n", touch->offset, sizeof_field(input_file_t, data), touch->length);
Jeej 0:a2bbc478f812 260 ram_fs_read(touch->fid, touch->offset, touch->length, chunk);
Jeej 0:a2bbc478f812 261 PRINT("%s\n", chunk);
Jeej 0:a2bbc478f812 262
Jeej 0:a2bbc478f812 263 // Check if CRC has been updated
Jeej 0:a2bbc478f812 264 if ((touch->offset == offsetof(input_file_t, crc)) && (touch->length == sizeof_field(input_file_t, crc)))
Jeej 0:a2bbc478f812 265 {
Jeej 0:a2bbc478f812 266 input_file_t input;
Jeej 0:a2bbc478f812 267
Jeej 0:a2bbc478f812 268 // Read file
Jeej 0:a2bbc478f812 269 ram_fs_read(touch->fid, 0, sizeof(input_file_t), input);
Jeej 0:a2bbc478f812 270
Jeej 0:a2bbc478f812 271 // Calculate and compare CRC
Jeej 0:a2bbc478f812 272 uint32_t crc = calculate_crc32(input.data, strlen(input.data));
Jeej 0:a2bbc478f812 273
Jeej 0:a2bbc478f812 274 PRINT("INPUT CRC 0x%08X CRC 0x%08X\n", input.crc, crc);
Jeej 0:a2bbc478f812 275
Jeej 0:a2bbc478f812 276 if (input.crc != crc)
Jeej 0:a2bbc478f812 277 {
Jeej 0:a2bbc478f812 278 // delete CRC
Jeej 0:a2bbc478f812 279 input.crc = 0;
Jeej 0:a2bbc478f812 280 }
Jeej 0:a2bbc478f812 281
Jeej 0:a2bbc478f812 282 // Send CRC as confirmation
Jeej 0:a2bbc478f812 283 PRINT("COMFIRM CRC 0x%08X\n", input.crc);
Jeej 0:a2bbc478f812 284 modem_send_file_content((uint8_t*)&my_itf, D7_ITF_SIZE(&my_itf), (void*)&istat, FID_INPUT_FILE, &input.crc, offsetof(input_file_t, crc), sizeof_field(input_file_t, crc), id);
Jeej 0:a2bbc478f812 285
Jeej 0:a2bbc478f812 286 do
Jeej 0:a2bbc478f812 287 {
Jeej 0:a2bbc478f812 288 evt = modem_resp[id].get(3000);
Jeej 0:a2bbc478f812 289 resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_TIMEOUT;
Jeej 0:a2bbc478f812 290
Jeej 0:a2bbc478f812 291 if (MODEM_RESP_ACK == resp)
Jeej 0:a2bbc478f812 292 {
Jeej 0:a2bbc478f812 293 PRINT_DATA("ACK UID:", "%02X", istat.addressee.id, 8, " ");
Jeej 0:a2bbc478f812 294 PRINT("SNR:%d dB RXLEV:%d dBm LB:%d dB\n", istat.snr, -istat.rxlev, istat.lb);
Jeej 0:a2bbc478f812 295 }
Jeej 0:a2bbc478f812 296 else if (MODEM_RESP_TIMEOUT == resp)
Jeej 0:a2bbc478f812 297 {
Jeej 0:a2bbc478f812 298 PRINT("TIMEOUT.\n");
Jeej 0:a2bbc478f812 299 }
Jeej 0:a2bbc478f812 300 else if (MODEM_RESP_ERROR == resp)
Jeej 0:a2bbc478f812 301 {
Jeej 0:a2bbc478f812 302 PRINT("ERROR.\n");
Jeej 0:a2bbc478f812 303 break;
Jeej 0:a2bbc478f812 304 }
Jeej 0:a2bbc478f812 305 else if (MODEM_RESP_TERMINAL == resp)
Jeej 0:a2bbc478f812 306 {
Jeej 0:a2bbc478f812 307 PRINT("DONE.\n");
Jeej 0:a2bbc478f812 308 }
Jeej 0:a2bbc478f812 309
Jeej 0:a2bbc478f812 310 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:a2bbc478f812 311 } while (MODEM_RESP_TERMINAL != resp);
Jeej 0:a2bbc478f812 312 }
Jeej 0:a2bbc478f812 313 break;
Jeej 0:a2bbc478f812 314 default:
Jeej 0:a2bbc478f812 315 PRINT("TOUCH FID %d OFF %d LEN %d\n", touch->fid, touch->offset, touch->length);
Jeej 0:a2bbc478f812 316 break;
Jeej 0:a2bbc478f812 317 }
Jeej 0:a2bbc478f812 318
Jeej 0:a2bbc478f812 319 FREE(touch);
Jeej 0:a2bbc478f812 320 }
Jeej 0:a2bbc478f812 321 }
Jeej 0:a2bbc478f812 322
Jeej 0:a2bbc478f812 323 modem_callbacks_t callbacks = {
Jeej 0:a2bbc478f812 324 .read = my_read,
Jeej 0:a2bbc478f812 325 .write = my_write,
Jeej 0:a2bbc478f812 326 .read_fprop = my_read_fprop,
Jeej 0:a2bbc478f812 327 .flush = my_flush,
Jeej 0:a2bbc478f812 328 .remove = my_delete,
Jeej 0:a2bbc478f812 329 .udata = my_udata,
Jeej 0:a2bbc478f812 330 .lqual = my_lqual,
Jeej 0:a2bbc478f812 331 .ldown = my_ldown,
Jeej 0:a2bbc478f812 332 .reset = my_reset,
Jeej 0:a2bbc478f812 333 .boot = my_boot
Jeej 0:a2bbc478f812 334 };
Jeej 0:a2bbc478f812 335
Jeej 0:a2bbc478f812 336 // Callback
Jeej 0:a2bbc478f812 337 void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:a2bbc478f812 338 {
Jeej 0:a2bbc478f812 339 (void)id;
Jeej 0:a2bbc478f812 340
Jeej 0:a2bbc478f812 341 if (terminal)
Jeej 0:a2bbc478f812 342 {
Jeej 0:a2bbc478f812 343 print_status(err);
Jeej 0:a2bbc478f812 344 modem_ready.release();
Jeej 0:a2bbc478f812 345 }
Jeej 0:a2bbc478f812 346 else
Jeej 0:a2bbc478f812 347 {
Jeej 0:a2bbc478f812 348 print_resp(err);
Jeej 0:a2bbc478f812 349 }
Jeej 0:a2bbc478f812 350 }
Jeej 0:a2bbc478f812 351
Jeej 0:a2bbc478f812 352 /*** Main function ------------------------------------------------------------- ***/
Jeej 0:a2bbc478f812 353 int main() {
Jeej 0:a2bbc478f812 354 // Start & initialize
Jeej 0:a2bbc478f812 355 #ifdef DEBUG_LED
Jeej 0:a2bbc478f812 356 DBG_OPEN(DEBUG_LED);
Jeej 0:a2bbc478f812 357 #else
Jeej 0:a2bbc478f812 358 DBG_OPEN(NC);
Jeej 0:a2bbc478f812 359 #endif
Jeej 0:a2bbc478f812 360 PRINT("\n"
Jeej 0:a2bbc478f812 361 "-----------------------------------------\n"
Jeej 0:a2bbc478f812 362 "------------- Demo Big File -------------\n"
Jeej 0:a2bbc478f812 363 "-----------------------------------------\n");
Jeej 0:a2bbc478f812 364
Jeej 0:a2bbc478f812 365 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:a2bbc478f812 366
Jeej 0:a2bbc478f812 367 modem_helper_open(&callbacks);
Jeej 0:a2bbc478f812 368
Jeej 0:a2bbc478f812 369 uint8_t id = modem_get_id(my_main_callback);
Jeej 0:a2bbc478f812 370
Jeej 0:a2bbc478f812 371 // Set custom retry policy
Jeej 0:a2bbc478f812 372 // XXX Won't work the first time as we need to reboot the modem for the changes to be applied
Jeej 0:a2bbc478f812 373
Jeej 0:a2bbc478f812 374 modem_write_file(WM_FID_ALP_CFG, &my_policy, MY_POLICY_IDX * sizeof(alp_retry_policy_t), sizeof(alp_retry_policy_t), id);
Jeej 0:a2bbc478f812 375 modem_ready.wait();
Jeej 0:a2bbc478f812 376 modem_flush_file(WM_FID_ALP_CFG, id);
Jeej 0:a2bbc478f812 377 modem_ready.wait();
Jeej 0:a2bbc478f812 378
Jeej 0:a2bbc478f812 379 PRINT("Register Files\n");
Jeej 0:a2bbc478f812 380 // HOST Revision is a local file. Uses D7AActP Notification.
Jeej 0:a2bbc478f812 381 modem_update_file(FID_HOST_REV, (alp_file_header_t*)&h_rev, (uint8_t*)&f_rev);
Jeej 0:a2bbc478f812 382 modem_update_file(FID_INPUT_FILE, (alp_file_header_t*)&h_input_file, (uint8_t*)&f_input_file);
Jeej 0:a2bbc478f812 383
Jeej 0:a2bbc478f812 384 PRINT("Start D7A Stack\n");
Jeej 0:a2bbc478f812 385 modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS, true, id);
Jeej 0:a2bbc478f812 386 modem_ready.wait();
Jeej 0:a2bbc478f812 387
Jeej 0:a2bbc478f812 388 PRINT("Notify Modem Version\n");
Jeej 0:a2bbc478f812 389 modem_notify_file(D7A_FID_FIRMWARE_VERSION, 0, SIZE_HOST_REV, id);
Jeej 0:a2bbc478f812 390 modem_ready.wait();
Jeej 0:a2bbc478f812 391
Jeej 0:a2bbc478f812 392 PRINT("Notify Host Version\n");
Jeej 0:a2bbc478f812 393 modem_notify_file(FID_HOST_REV, 0, SIZE_HOST_REV, id);
Jeej 0:a2bbc478f812 394 modem_ready.wait();
Jeej 0:a2bbc478f812 395
Jeej 0:a2bbc478f812 396 // id no longer needed
Jeej 0:a2bbc478f812 397 modem_free_id(id);
Jeej 0:a2bbc478f812 398
Jeej 0:a2bbc478f812 399 // Start file modified thread
Jeej 0:a2bbc478f812 400 Thread th_file_modified(osPriorityNormal, 1024, NULL);
Jeej 0:a2bbc478f812 401 osStatus status = th_file_modified.start(thread_file_modified);
Jeej 0:a2bbc478f812 402 ASSERT(status == osOK, "Failed to start thread_file_modified (err: %d)\r\n", status);
Jeej 0:a2bbc478f812 403
Jeej 0:a2bbc478f812 404 #ifdef DEBUG_BUTTON
Jeej 0:a2bbc478f812 405 DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
Jeej 0:a2bbc478f812 406 user_interrupt.attach(button_push_isr, IRQ_FALL, 500, true);
Jeej 0:a2bbc478f812 407
Jeej 0:a2bbc478f812 408 Thread but_th(osPriorityNormal, 4096, NULL);
Jeej 0:a2bbc478f812 409 status = but_th.start(button_user_thread);
Jeej 0:a2bbc478f812 410 ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status);
Jeej 0:a2bbc478f812 411 #else
Jeej 0:a2bbc478f812 412 #error You need a button to use this APP as is
Jeej 0:a2bbc478f812 413 #endif
Jeej 0:a2bbc478f812 414
Jeej 0:a2bbc478f812 415 #ifdef DEBUG_LED
Jeej 0:a2bbc478f812 416 DigitalOut my_led(DEBUG_LED);
Jeej 0:a2bbc478f812 417 #endif
Jeej 0:a2bbc478f812 418
Jeej 0:a2bbc478f812 419 // Set main task to lowest priority
Jeej 0:a2bbc478f812 420 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:a2bbc478f812 421 while(true)
Jeej 0:a2bbc478f812 422 {
Jeej 0:a2bbc478f812 423 Thread::wait(500);
Jeej 0:a2bbc478f812 424 #ifdef DEBUG_LED
Jeej 0:a2bbc478f812 425 my_led = !my_led;
Jeej 0:a2bbc478f812 426 #endif
Jeej 0:a2bbc478f812 427 }
Jeej 0:a2bbc478f812 428 }