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

Dependencies:   modem_ref_helper CRC DebouncedInterrupt

Committer:
Jeej
Date:
Wed Sep 26 13:59:45 2018 +0000
Revision:
8:4592de5f3ac1
Parent:
6:33dfecc85ebf
Child:
9:26cd994b5303
Unify prints.

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 CHUNK_SIZE 128
Jeej 0:a2bbc478f812 13
Jeej 0:a2bbc478f812 14 Semaphore button_user(0);
Jeej 0:a2bbc478f812 15 Semaphore modem_ready(0);
Jeej 0:a2bbc478f812 16 Queue<void, 8> modem_resp[MAX_USER_NB];
Jeej 0:a2bbc478f812 17 Queue<touch_t, 8> g_file_modified;
Jeej 0:a2bbc478f812 18
Jeej 0:a2bbc478f812 19 enum {
Jeej 0:a2bbc478f812 20 MODEM_RESP_NO,
Jeej 0:a2bbc478f812 21 MODEM_RESP_TERMINAL,
Jeej 0:a2bbc478f812 22 MODEM_RESP_ERROR,
Jeej 0:a2bbc478f812 23 MODEM_RESP_ACK,
Jeej 0:a2bbc478f812 24 MODEM_RESP_TIMEOUT,
Jeej 0:a2bbc478f812 25 };
Jeej 0:a2bbc478f812 26
Jeej 1:76a8a3cc5f2e 27 // This describe the upload interface
Jeej 1:76a8a3cc5f2e 28 // Do not modify uncommented parameters
Jeej 0:a2bbc478f812 29 alp_d7a_itf_t my_itf = {
Jeej 0:a2bbc478f812 30 .type = ALP_ITF_TYPE_D7A,
Jeej 0:a2bbc478f812 31 .cfg.to = 0,
Jeej 0:a2bbc478f812 32 .cfg.te = 0,
Jeej 0:a2bbc478f812 33 .cfg.qos.bf.resp = D7A_RESP_PREFERRED,
Jeej 6:33dfecc85ebf 34 .cfg.qos.bf.retry = ALP_RPOL_ONESHOT,
Jeej 1:76a8a3cc5f2e 35 .cfg.addressee.ctrl.bf.nls = D7A_NLS_AES_CCM_64, // Security level
Jeej 0:a2bbc478f812 36 .cfg.addressee.ctrl.bf.idf = D7A_ID_NBID,
Jeej 1:76a8a3cc5f2e 37 .cfg.addressee.xcl.bf = {.s = 0x2, .m = 0x1}, // Gateway access class
Jeej 8:4592de5f3ac1 38 .cfg.addressee.id[0] = D7A_CTF_VAL(4,0),
Jeej 0:a2bbc478f812 39 };
Jeej 0:a2bbc478f812 40
Jeej 8:4592de5f3ac1 41 void print_status(uint8_t id, int status)
Jeej 0:a2bbc478f812 42 {
Jeej 0:a2bbc478f812 43 switch (status)
Jeej 0:a2bbc478f812 44 {
Jeej 0:a2bbc478f812 45 case ALP_ERR_NONE:
Jeej 8:4592de5f3ac1 46 PRINT("Status[%d]: OK\n", id);
Jeej 0:a2bbc478f812 47 break;
Jeej 0:a2bbc478f812 48 default:
Jeej 8:4592de5f3ac1 49 PRINT("Status[%d]: error %d\n", id, status);
Jeej 0:a2bbc478f812 50 break;
Jeej 0:a2bbc478f812 51 }
Jeej 0:a2bbc478f812 52 }
Jeej 0:a2bbc478f812 53
Jeej 1:76a8a3cc5f2e 54 // Response Callback
Jeej 0:a2bbc478f812 55 void my_response_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 8:4592de5f3ac1 56 {
Jeej 8:4592de5f3ac1 57 print_status(id, err);
Jeej 0:a2bbc478f812 58
Jeej 0:a2bbc478f812 59 if (terminal)
Jeej 0:a2bbc478f812 60 {
Jeej 0:a2bbc478f812 61 modem_resp[id].put((void*)MODEM_RESP_TERMINAL);
Jeej 0:a2bbc478f812 62 }
Jeej 0:a2bbc478f812 63 else
Jeej 0:a2bbc478f812 64 {
Jeej 0:a2bbc478f812 65 if (ALP_ERR_NONE == err)
Jeej 0:a2bbc478f812 66 {
Jeej 0:a2bbc478f812 67 modem_resp[id].put((void*)MODEM_RESP_ACK);
Jeej 0:a2bbc478f812 68 }
Jeej 0:a2bbc478f812 69 else
Jeej 0:a2bbc478f812 70 {
Jeej 0:a2bbc478f812 71 modem_resp[id].put((void*)MODEM_RESP_ERROR);
Jeej 0:a2bbc478f812 72 }
Jeej 0:a2bbc478f812 73 }
Jeej 0:a2bbc478f812 74 }
Jeej 0:a2bbc478f812 75
Jeej 0:a2bbc478f812 76 // Interrupt Service Routine on button press.
Jeej 0:a2bbc478f812 77 void button_push_isr( void )
Jeej 0:a2bbc478f812 78 {
Jeej 0:a2bbc478f812 79 button_user.release();
Jeej 0:a2bbc478f812 80 }
Jeej 0:a2bbc478f812 81
Jeej 1:76a8a3cc5f2e 82 // Upload thread
Jeej 0:a2bbc478f812 83 void button_user_thread()
Jeej 0:a2bbc478f812 84 {
Jeej 0:a2bbc478f812 85 osEvent evt;
Jeej 0:a2bbc478f812 86 uint32_t resp;
Jeej 0:a2bbc478f812 87 d7a_sp_res_t istat;
Jeej 1:76a8a3cc5f2e 88 output_file_t* output;
Jeej 0:a2bbc478f812 89 uint32_t sent = 0;
Jeej 0:a2bbc478f812 90
Jeej 0:a2bbc478f812 91 uint8_t id = modem_get_id(my_response_callback);
Jeej 0:a2bbc478f812 92
Jeej 0:a2bbc478f812 93 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:a2bbc478f812 94
Jeej 1:76a8a3cc5f2e 95 // Directly get data pointer to avoid reading file
Jeej 1:76a8a3cc5f2e 96 output = (output_file_t*)ram_fs_get_data(FID_OUTPUT_FILE);
Jeej 1:76a8a3cc5f2e 97
Jeej 1:76a8a3cc5f2e 98 // Update file CRC (Calculate CRC on string without end of string)
Jeej 1:76a8a3cc5f2e 99 output->crc = crc32((char*)output->data, strlen((char*)output->data));
Jeej 1:76a8a3cc5f2e 100
Jeej 0:a2bbc478f812 101 while (true)
Jeej 0:a2bbc478f812 102 {
Jeej 0:a2bbc478f812 103 Timer tim;
Jeej 0:a2bbc478f812 104 bool is_ok;
Jeej 1:76a8a3cc5f2e 105 uint32_t output_length = strlen((char*)output->data) + 1; // +1 as data is a string, send end of string
Jeej 0:a2bbc478f812 106
Jeej 0:a2bbc478f812 107 // Wait for button press
Jeej 1:76a8a3cc5f2e 108 PRINT("Press user button to send file. (%d bytes)\n", output_length);
Jeej 0:a2bbc478f812 109 button_user.wait();
Jeej 0:a2bbc478f812 110
Jeej 1:76a8a3cc5f2e 111 // Update file CRC (Calculate CRC on string without end of string)
Jeej 1:76a8a3cc5f2e 112 output->crc = crc32((char*)output->data, output_length - 1);
Jeej 1:76a8a3cc5f2e 113
Jeej 0:a2bbc478f812 114 sent = 0;
Jeej 0:a2bbc478f812 115 tim.start();
Jeej 0:a2bbc478f812 116
Jeej 0:a2bbc478f812 117 // Send chunks
Jeej 1:76a8a3cc5f2e 118 while (sent < output_length)
Jeej 0:a2bbc478f812 119 {
Jeej 0:a2bbc478f812 120 is_ok = false;
Jeej 1:76a8a3cc5f2e 121 uint32_t chunk_size = MIN(CHUNK_SIZE, output_length - sent);
Jeej 0:a2bbc478f812 122 uint32_t chunk_offset = sent;
Jeej 0:a2bbc478f812 123
Jeej 1:76a8a3cc5f2e 124 PRINT("Sending chunk %4d/%4d (%3d bytes)... ", chunk_offset, output_length, chunk_size);
Jeej 0:a2bbc478f812 125 FLUSH();
Jeej 1:76a8a3cc5f2e 126 modem_send_file_content((uint8_t*)&my_itf, D7_ITF_SIZE(&my_itf), (void*)&istat, FID_OUTPUT_FILE, &(output->data[chunk_offset]), chunk_offset, chunk_size, id);
Jeej 0:a2bbc478f812 127
Jeej 0:a2bbc478f812 128 do
Jeej 0:a2bbc478f812 129 {
Jeej 1:76a8a3cc5f2e 130 evt = modem_resp[id].get(3000);
Jeej 0:a2bbc478f812 131 resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_TIMEOUT;
Jeej 0:a2bbc478f812 132
Jeej 0:a2bbc478f812 133 if (MODEM_RESP_ACK == resp)
Jeej 0:a2bbc478f812 134 {
Jeej 0:a2bbc478f812 135 //PRINT_DATA("ACK UID:", "%02X", istat.addressee.id, 8, " ");
Jeej 1:76a8a3cc5f2e 136 //PRINT("SNR: %ddB RXLEV: %ddBm LB: %ddB\n", istat.snr, -istat.rxlev, istat.lb);
Jeej 0:a2bbc478f812 137
Jeej 0:a2bbc478f812 138 //PRINT("ACK.\n");
Jeej 0:a2bbc478f812 139 is_ok = true;
Jeej 0:a2bbc478f812 140 }
Jeej 0:a2bbc478f812 141 else if (MODEM_RESP_TIMEOUT == resp)
Jeej 0:a2bbc478f812 142 {
Jeej 1:76a8a3cc5f2e 143 PRINT("WAITING...\n");
Jeej 0:a2bbc478f812 144 }
Jeej 0:a2bbc478f812 145 else if (MODEM_RESP_ERROR == resp)
Jeej 0:a2bbc478f812 146 {
Jeej 0:a2bbc478f812 147 //PRINT("ERROR.\n");
Jeej 0:a2bbc478f812 148 break;
Jeej 0:a2bbc478f812 149 }
Jeej 0:a2bbc478f812 150 else if (MODEM_RESP_TERMINAL == resp)
Jeej 0:a2bbc478f812 151 {
Jeej 0:a2bbc478f812 152 //PRINT("DONE.\n");
Jeej 0:a2bbc478f812 153 }
Jeej 0:a2bbc478f812 154
Jeej 0:a2bbc478f812 155 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:a2bbc478f812 156 } while (MODEM_RESP_TERMINAL != resp);
Jeej 0:a2bbc478f812 157
Jeej 0:a2bbc478f812 158 if (is_ok)
Jeej 0:a2bbc478f812 159 {
Jeej 0:a2bbc478f812 160 sent += chunk_size;
Jeej 0:a2bbc478f812 161 PRINT("OK.\n");
Jeej 0:a2bbc478f812 162 }
Jeej 0:a2bbc478f812 163 else
Jeej 0:a2bbc478f812 164 {
Jeej 0:a2bbc478f812 165 PRINT("FAILED.\n");
Jeej 0:a2bbc478f812 166 break;
Jeej 0:a2bbc478f812 167 }
Jeej 0:a2bbc478f812 168 }
Jeej 0:a2bbc478f812 169
Jeej 0:a2bbc478f812 170 double time_s = tim.read();
Jeej 0:a2bbc478f812 171 if (sent)
Jeej 0:a2bbc478f812 172 {
Jeej 0:a2bbc478f812 173 PRINT("%d bytes sent in %.3fs (%d B/s)\n", sent, time_s, (int)((double)sent/time_s));
Jeej 0:a2bbc478f812 174 }
Jeej 0:a2bbc478f812 175
Jeej 0:a2bbc478f812 176 if (is_ok)
Jeej 0:a2bbc478f812 177 {
Jeej 0:a2bbc478f812 178 // Send CRC
Jeej 1:76a8a3cc5f2e 179 PRINT("Sendind CRC 0x%08X\n", output->crc);
Jeej 1:76a8a3cc5f2e 180 modem_send_file_content((uint8_t*)&my_itf, D7_ITF_SIZE(&my_itf), (void*)&istat, FID_OUTPUT_FILE, &(output->crc), offsetof(output_file_t, crc), sizeof_field(output_file_t, crc), id);
Jeej 0:a2bbc478f812 181
Jeej 0:a2bbc478f812 182 do
Jeej 0:a2bbc478f812 183 {
Jeej 0:a2bbc478f812 184 evt = modem_resp[id].get(3000);
Jeej 0:a2bbc478f812 185 resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_TIMEOUT;
Jeej 0:a2bbc478f812 186
Jeej 0:a2bbc478f812 187 if (MODEM_RESP_ACK == resp)
Jeej 0:a2bbc478f812 188 {
Jeej 0:a2bbc478f812 189 PRINT_DATA("ACK UID:", "%02X", istat.addressee.id, 8, " ");
Jeej 1:76a8a3cc5f2e 190 PRINT("SNR: %ddB RXLEV: %ddBm LB: %ddB\n", istat.snr, -istat.rxlev, istat.lb);
Jeej 0:a2bbc478f812 191 }
Jeej 0:a2bbc478f812 192 else if (MODEM_RESP_TIMEOUT == resp)
Jeej 0:a2bbc478f812 193 {
Jeej 1:76a8a3cc5f2e 194 PRINT("WAITING...\n");
Jeej 0:a2bbc478f812 195 }
Jeej 0:a2bbc478f812 196 else if (MODEM_RESP_ERROR == resp)
Jeej 0:a2bbc478f812 197 {
Jeej 0:a2bbc478f812 198 PRINT("ERROR.\n");
Jeej 0:a2bbc478f812 199 break;
Jeej 0:a2bbc478f812 200 }
Jeej 0:a2bbc478f812 201 else if (MODEM_RESP_TERMINAL == resp)
Jeej 0:a2bbc478f812 202 {
Jeej 0:a2bbc478f812 203 PRINT("DONE.\n");
Jeej 0:a2bbc478f812 204 }
Jeej 0:a2bbc478f812 205
Jeej 0:a2bbc478f812 206 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:a2bbc478f812 207 } while (MODEM_RESP_TERMINAL != resp);
Jeej 0:a2bbc478f812 208 }
Jeej 0:a2bbc478f812 209 }
Jeej 0:a2bbc478f812 210 }
Jeej 0:a2bbc478f812 211
Jeej 0:a2bbc478f812 212 void thread_file_modified()
Jeej 0:a2bbc478f812 213 {
Jeej 0:a2bbc478f812 214 touch_t* touch;
Jeej 0:a2bbc478f812 215 osEvent evt;
Jeej 1:76a8a3cc5f2e 216 uint32_t resp;
Jeej 1:76a8a3cc5f2e 217 d7a_sp_res_t istat;
Jeej 0:a2bbc478f812 218 uint8_t chunk[CHUNK_SIZE];
Jeej 0:a2bbc478f812 219
Jeej 0:a2bbc478f812 220 uint8_t id = modem_get_id(my_response_callback);
Jeej 0:a2bbc478f812 221
Jeej 0:a2bbc478f812 222 while (true)
Jeej 0:a2bbc478f812 223 {
Jeej 0:a2bbc478f812 224 evt = g_file_modified.get();
Jeej 0:a2bbc478f812 225 touch = (evt.status == osEventMessage)? (touch_t*)evt.value.p : NULL;
Jeej 0:a2bbc478f812 226 ASSERT(touch != NULL, "NULL touch pointer!\n");
Jeej 0:a2bbc478f812 227
Jeej 0:a2bbc478f812 228 switch (touch->fid)
Jeej 0:a2bbc478f812 229 {
Jeej 1:76a8a3cc5f2e 230 case FID_OUTPUT_FILE:
Jeej 1:76a8a3cc5f2e 231 output_file_t* output;
Jeej 1:76a8a3cc5f2e 232 uint32_t output_length;
Jeej 1:76a8a3cc5f2e 233
Jeej 1:76a8a3cc5f2e 234 // Directly get data pointer to avoid reading file
Jeej 1:76a8a3cc5f2e 235 output = (output_file_t*)ram_fs_get_data(FID_OUTPUT_FILE);
Jeej 1:76a8a3cc5f2e 236
Jeej 1:76a8a3cc5f2e 237 output_length = strlen((char*)output->data);
Jeej 1:76a8a3cc5f2e 238
Jeej 1:76a8a3cc5f2e 239 // Update file CRC (Calculate CRC on string without end of string)
Jeej 1:76a8a3cc5f2e 240 output->crc = crc32((char*)output->data, output_length);
Jeej 1:76a8a3cc5f2e 241
Jeej 1:76a8a3cc5f2e 242 PRINT("NEW OUTPUT CRC 0x%08X (on %d bytes)\n", output->crc, output_length);
Jeej 1:76a8a3cc5f2e 243 break;
Jeej 0:a2bbc478f812 244 case FID_INPUT_FILE:
Jeej 1:76a8a3cc5f2e 245 input_file_t* input;
Jeej 1:76a8a3cc5f2e 246 uint32_t input_length;
Jeej 1:76a8a3cc5f2e 247 uint32_t crc;
Jeej 1:76a8a3cc5f2e 248
Jeej 1:76a8a3cc5f2e 249 // Directly get data pointer to avoid reading file
Jeej 1:76a8a3cc5f2e 250 input = (input_file_t*)ram_fs_get_data(FID_INPUT_FILE);
Jeej 1:76a8a3cc5f2e 251
Jeej 1:76a8a3cc5f2e 252 input_length = strlen((char*)input->data);
Jeej 1:76a8a3cc5f2e 253
Jeej 1:76a8a3cc5f2e 254 // Calculate CRC
Jeej 1:76a8a3cc5f2e 255 crc = crc32((char*)input->data, input_length);
Jeej 0:a2bbc478f812 256
Jeej 0:a2bbc478f812 257 // Check if CRC has been updated
Jeej 1:76a8a3cc5f2e 258 if ((offsetof(input_file_t, crc) == touch->offset) && (sizeof_field(input_file_t, crc) == touch->length))
Jeej 0:a2bbc478f812 259 {
Jeej 1:76a8a3cc5f2e 260 PRINT("INPUT CRC 0x%08X CRC 0x%08X (on %d bytes)\n", input->crc, crc, input_length);
Jeej 0:a2bbc478f812 261
Jeej 1:76a8a3cc5f2e 262 if (input->crc != crc)
Jeej 0:a2bbc478f812 263 {
Jeej 0:a2bbc478f812 264 // delete CRC
Jeej 1:76a8a3cc5f2e 265 input->crc = 0;
Jeej 0:a2bbc478f812 266 }
Jeej 0:a2bbc478f812 267
Jeej 0:a2bbc478f812 268 // Send CRC as confirmation
Jeej 1:76a8a3cc5f2e 269 PRINT("COMFIRM CRC 0x%08X\n", input->crc);
Jeej 1:76a8a3cc5f2e 270 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 271
Jeej 0:a2bbc478f812 272 do
Jeej 0:a2bbc478f812 273 {
Jeej 0:a2bbc478f812 274 evt = modem_resp[id].get(3000);
Jeej 0:a2bbc478f812 275 resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_TIMEOUT;
Jeej 0:a2bbc478f812 276
Jeej 0:a2bbc478f812 277 if (MODEM_RESP_ACK == resp)
Jeej 0:a2bbc478f812 278 {
Jeej 0:a2bbc478f812 279 PRINT_DATA("ACK UID:", "%02X", istat.addressee.id, 8, " ");
Jeej 1:76a8a3cc5f2e 280 PRINT("SNR: %ddB RXLEV: %ddBm LB: %ddB\n", istat.snr, -istat.rxlev, istat.lb);
Jeej 0:a2bbc478f812 281 }
Jeej 0:a2bbc478f812 282 else if (MODEM_RESP_TIMEOUT == resp)
Jeej 0:a2bbc478f812 283 {
Jeej 1:76a8a3cc5f2e 284 PRINT("WAITING...\n");
Jeej 0:a2bbc478f812 285 }
Jeej 0:a2bbc478f812 286 else if (MODEM_RESP_ERROR == resp)
Jeej 0:a2bbc478f812 287 {
Jeej 0:a2bbc478f812 288 PRINT("ERROR.\n");
Jeej 0:a2bbc478f812 289 break;
Jeej 0:a2bbc478f812 290 }
Jeej 0:a2bbc478f812 291 else if (MODEM_RESP_TERMINAL == resp)
Jeej 0:a2bbc478f812 292 {
Jeej 0:a2bbc478f812 293 PRINT("DONE.\n");
Jeej 0:a2bbc478f812 294 }
Jeej 0:a2bbc478f812 295
Jeej 0:a2bbc478f812 296 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:a2bbc478f812 297 } while (MODEM_RESP_TERMINAL != resp);
Jeej 0:a2bbc478f812 298 }
Jeej 1:76a8a3cc5f2e 299 else
Jeej 1:76a8a3cc5f2e 300 {
Jeej 1:76a8a3cc5f2e 301 PRINT("Got chunk %4d/%4d (%3d bytes)\n", touch->offset, sizeof_field(input_file_t, data), touch->length);
Jeej 1:76a8a3cc5f2e 302 ram_fs_read(touch->fid, touch->offset, touch->length, chunk);
Jeej 1:76a8a3cc5f2e 303 //PRINT("%s\n", chunk);
Jeej 1:76a8a3cc5f2e 304 //PRINT_DATA("chunk end:", "%02X", &(chunk[touch->length-4]), 4, "\n");
Jeej 1:76a8a3cc5f2e 305
Jeej 1:76a8a3cc5f2e 306 PRINT("NEW INPUT CRC 0x%08X (on %d bytes)\n", crc, input_length);
Jeej 1:76a8a3cc5f2e 307 }
Jeej 0:a2bbc478f812 308 break;
Jeej 0:a2bbc478f812 309 default:
Jeej 0:a2bbc478f812 310 PRINT("TOUCH FID %d OFF %d LEN %d\n", touch->fid, touch->offset, touch->length);
Jeej 0:a2bbc478f812 311 break;
Jeej 0:a2bbc478f812 312 }
Jeej 0:a2bbc478f812 313
Jeej 0:a2bbc478f812 314 FREE(touch);
Jeej 0:a2bbc478f812 315 }
Jeej 0:a2bbc478f812 316 }
Jeej 0:a2bbc478f812 317
Jeej 0:a2bbc478f812 318 modem_callbacks_t callbacks = {
Jeej 0:a2bbc478f812 319 .read = my_read,
Jeej 0:a2bbc478f812 320 .write = my_write,
Jeej 0:a2bbc478f812 321 .read_fprop = my_read_fprop,
Jeej 0:a2bbc478f812 322 .flush = my_flush,
Jeej 0:a2bbc478f812 323 .remove = my_delete,
Jeej 0:a2bbc478f812 324 .udata = my_udata,
Jeej 0:a2bbc478f812 325 .lqual = my_lqual,
Jeej 0:a2bbc478f812 326 .ldown = my_ldown,
Jeej 0:a2bbc478f812 327 .reset = my_reset,
Jeej 6:33dfecc85ebf 328 .boot = my_boot,
Jeej 6:33dfecc85ebf 329 .busy = my_busy,
Jeej 0:a2bbc478f812 330 };
Jeej 0:a2bbc478f812 331
Jeej 0:a2bbc478f812 332 // Callback
Jeej 0:a2bbc478f812 333 void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 8:4592de5f3ac1 334 {
Jeej 8:4592de5f3ac1 335 print_status(id, err);
Jeej 1:76a8a3cc5f2e 336
Jeej 0:a2bbc478f812 337 if (terminal)
Jeej 0:a2bbc478f812 338 {
Jeej 0:a2bbc478f812 339 modem_ready.release();
Jeej 0:a2bbc478f812 340 }
Jeej 0:a2bbc478f812 341 }
Jeej 0:a2bbc478f812 342
Jeej 0:a2bbc478f812 343 /*** Main function ------------------------------------------------------------- ***/
Jeej 0:a2bbc478f812 344 int main() {
Jeej 0:a2bbc478f812 345 // Start & initialize
Jeej 0:a2bbc478f812 346 #ifdef DEBUG_LED
Jeej 0:a2bbc478f812 347 DBG_OPEN(DEBUG_LED);
Jeej 0:a2bbc478f812 348 #else
Jeej 0:a2bbc478f812 349 DBG_OPEN(NC);
Jeej 0:a2bbc478f812 350 #endif
Jeej 0:a2bbc478f812 351 PRINT("\n"
Jeej 0:a2bbc478f812 352 "-----------------------------------------\n"
Jeej 0:a2bbc478f812 353 "------------- Demo Big File -------------\n"
Jeej 0:a2bbc478f812 354 "-----------------------------------------\n");
Jeej 1:76a8a3cc5f2e 355
Jeej 0:a2bbc478f812 356 modem_helper_open(&callbacks);
Jeej 0:a2bbc478f812 357
Jeej 0:a2bbc478f812 358 uint8_t id = modem_get_id(my_main_callback);
Jeej 0:a2bbc478f812 359
Jeej 6:33dfecc85ebf 360 // Put modem to listen to downlink access class
Jeej 6:33dfecc85ebf 361 d7a_xcl_t xcl = { .bf.s = 0, .bf.m = 0x1 };
Jeej 6:33dfecc85ebf 362 modem_write_file(D7A_FID_DLL_CFG, (void*)&xcl, offsetof(d7a_dll_cfg_t, xcl), sizeof(d7a_xcl_t), id);
Jeej 0:a2bbc478f812 363 modem_ready.wait();
Jeej 0:a2bbc478f812 364
Jeej 0:a2bbc478f812 365 PRINT("Register Files\n");
Jeej 0:a2bbc478f812 366 // HOST Revision is a local file. Uses D7AActP Notification.
Jeej 0:a2bbc478f812 367 modem_update_file(FID_HOST_REV, (alp_file_header_t*)&h_rev, (uint8_t*)&f_rev);
Jeej 1:76a8a3cc5f2e 368 modem_update_file(FID_OUTPUT_FILE, (alp_file_header_t*)&h_output_file, (uint8_t*)&f_output_file);
Jeej 0:a2bbc478f812 369 modem_update_file(FID_INPUT_FILE, (alp_file_header_t*)&h_input_file, (uint8_t*)&f_input_file);
Jeej 0:a2bbc478f812 370
Jeej 0:a2bbc478f812 371 PRINT("Start D7A Stack\n");
Jeej 0:a2bbc478f812 372 modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS, true, id);
Jeej 0:a2bbc478f812 373 modem_ready.wait();
Jeej 0:a2bbc478f812 374
Jeej 0:a2bbc478f812 375 PRINT("Notify Modem Version\n");
Jeej 0:a2bbc478f812 376 modem_notify_file(D7A_FID_FIRMWARE_VERSION, 0, SIZE_HOST_REV, id);
Jeej 0:a2bbc478f812 377 modem_ready.wait();
Jeej 0:a2bbc478f812 378
Jeej 0:a2bbc478f812 379 PRINT("Notify Host Version\n");
Jeej 0:a2bbc478f812 380 modem_notify_file(FID_HOST_REV, 0, SIZE_HOST_REV, id);
Jeej 0:a2bbc478f812 381 modem_ready.wait();
Jeej 0:a2bbc478f812 382
Jeej 0:a2bbc478f812 383 // id no longer needed
Jeej 0:a2bbc478f812 384 modem_free_id(id);
Jeej 0:a2bbc478f812 385
Jeej 0:a2bbc478f812 386 // Start file modified thread
Jeej 0:a2bbc478f812 387 Thread th_file_modified(osPriorityNormal, 1024, NULL);
Jeej 0:a2bbc478f812 388 osStatus status = th_file_modified.start(thread_file_modified);
Jeej 0:a2bbc478f812 389 ASSERT(status == osOK, "Failed to start thread_file_modified (err: %d)\r\n", status);
Jeej 0:a2bbc478f812 390
Jeej 0:a2bbc478f812 391 #ifdef DEBUG_BUTTON
Jeej 0:a2bbc478f812 392 DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
Jeej 0:a2bbc478f812 393 user_interrupt.attach(button_push_isr, IRQ_FALL, 500, true);
Jeej 0:a2bbc478f812 394
Jeej 0:a2bbc478f812 395 Thread but_th(osPriorityNormal, 4096, NULL);
Jeej 0:a2bbc478f812 396 status = but_th.start(button_user_thread);
Jeej 0:a2bbc478f812 397 ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status);
Jeej 0:a2bbc478f812 398 #else
Jeej 0:a2bbc478f812 399 #error You need a button to use this APP as is
Jeej 0:a2bbc478f812 400 #endif
Jeej 0:a2bbc478f812 401
Jeej 0:a2bbc478f812 402 #ifdef DEBUG_LED
Jeej 0:a2bbc478f812 403 DigitalOut my_led(DEBUG_LED);
Jeej 0:a2bbc478f812 404 #endif
Jeej 0:a2bbc478f812 405
Jeej 0:a2bbc478f812 406 // Set main task to lowest priority
Jeej 0:a2bbc478f812 407 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:a2bbc478f812 408 while(true)
Jeej 0:a2bbc478f812 409 {
Jeej 0:a2bbc478f812 410 Thread::wait(500);
Jeej 0:a2bbc478f812 411 #ifdef DEBUG_LED
Jeej 0:a2bbc478f812 412 my_led = !my_led;
Jeej 0:a2bbc478f812 413 #endif
Jeej 0:a2bbc478f812 414 }
Jeej 0:a2bbc478f812 415 }