Helper library to use modem_ref driver.

Dependencies:   WizziCom WizziDebug ram_fs modem_ref

Dependents:   D7A_Localisation D7A_1x_demo_send_file_data_and_forget D7A_1x_demo_CodeUpgradeProtocol D7A_1x_demo_LoRaWAN ... more

Committer:
Jeej
Date:
Thu Oct 04 11:44:36 2018 +0000
Revision:
43:90c9221c1430
Parent:
36:7cea3c6d7a63
Child:
44:7563b8e53e1d
Added Error print function.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:e9dd36a15d07 1 #include "modem_ref_helper.h"
Jeej 0:e9dd36a15d07 2
Jeej 0:e9dd36a15d07 3 #if 0
Jeej 0:e9dd36a15d07 4 #define HELPER_PRINT(...) PRINT(__VA_ARGS__)
Jeej 0:e9dd36a15d07 5 #else
Jeej 0:e9dd36a15d07 6 #define HELPER_PRINT(...);
Jeej 0:e9dd36a15d07 7 #endif
Jeej 0:e9dd36a15d07 8
Jeej 28:d3b2889f9fab 9 #define MODEM_VERSION_MAJOR 5
Jeej 36:7cea3c6d7a63 10 #define MODEM_VERSION_MINOR 2
Jeej 43:90c9221c1430 11 #define MODEM_VERSION_PATCH 310
Jeej 15:c90efeb6bd6a 12
Jeej 0:e9dd36a15d07 13 static WizziCom* g_modem_com;
Jeej 0:e9dd36a15d07 14 static Semaphore g_modem_ready[MAX_USER_NB];
Jeej 0:e9dd36a15d07 15
Jeej 43:90c9221c1430 16 void modem_print_error(uint8_t itf, int8_t error)
Jeej 0:e9dd36a15d07 17 {
Jeej 43:90c9221c1430 18 if (ALP_ERR_ITF_START >= error && ALP_ERR_ITF_END <= error)
Jeej 0:e9dd36a15d07 19 {
Jeej 43:90c9221c1430 20 error -= ALP_ERR_ITF_START;
Jeej 43:90c9221c1430 21 // Interface specific error
Jeej 43:90c9221c1430 22 if (ALP_ITF_TYPE_HOST == itf)
Jeej 43:90c9221c1430 23 {
Jeej 43:90c9221c1430 24 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 43:90c9221c1430 25 }
Jeej 43:90c9221c1430 26 else if (ALP_ITF_TYPE_COM == itf)
Jeej 43:90c9221c1430 27 {
Jeej 43:90c9221c1430 28 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 43:90c9221c1430 29 }
Jeej 43:90c9221c1430 30 else if (ALP_ITF_TYPE_D7A == itf)
Jeej 43:90c9221c1430 31 {
Jeej 43:90c9221c1430 32 PRINT("ITF[%02X] ", itf);
Jeej 43:90c9221c1430 33 switch (error)
Jeej 43:90c9221c1430 34 {
Jeej 43:90c9221c1430 35 /// No error
Jeej 43:90c9221c1430 36 case D7A_ERROR_NO: // = 0,
Jeej 43:90c9221c1430 37 PRINT("D7A_ERROR_NO\r\n");
Jeej 43:90c9221c1430 38 break;
Jeej 43:90c9221c1430 39 /// Resource busy
Jeej 43:90c9221c1430 40 case D7A_ERROR_BUSY: // = -1,
Jeej 43:90c9221c1430 41 PRINT("D7A_ERROR_BUSY\r\n");
Jeej 43:90c9221c1430 42 break;
Jeej 43:90c9221c1430 43 /// Bad parameter
Jeej 43:90c9221c1430 44 case D7A_ERROR_BAD_PARAM: // = -2,
Jeej 43:90c9221c1430 45 PRINT("D7A_ERROR_BAD_PARAM\r\n");
Jeej 43:90c9221c1430 46 break;
Jeej 43:90c9221c1430 47 /// Duty cycle limit overflow
Jeej 43:90c9221c1430 48 case D7A_ERROR_DUTY_CYCLE: // = -3,
Jeej 43:90c9221c1430 49 PRINT("D7A_ERROR_DUTY_CYCLE\r\n");
Jeej 43:90c9221c1430 50 break;
Jeej 43:90c9221c1430 51 /// CCA timeout
Jeej 43:90c9221c1430 52 case D7A_ERROR_CCA_TO: // = -4,
Jeej 43:90c9221c1430 53 PRINT("D7A_ERROR_CCA_TO\r\n");
Jeej 43:90c9221c1430 54 break;
Jeej 43:90c9221c1430 55 /// Security frame counter overflow
Jeej 43:90c9221c1430 56 case D7A_ERROR_NLS_KEY: // = -5,
Jeej 43:90c9221c1430 57 PRINT("D7A_ERROR_NLS_KEY\r\n");
Jeej 43:90c9221c1430 58 break;
Jeej 43:90c9221c1430 59 /// TX stream underflow
Jeej 43:90c9221c1430 60 case D7A_ERROR_TX_UDF: // = -6,
Jeej 43:90c9221c1430 61 PRINT("D7A_ERROR_TX_UDF\r\n");
Jeej 43:90c9221c1430 62 break;
Jeej 43:90c9221c1430 63 /// RX stream overflow
Jeej 43:90c9221c1430 64 case D7A_ERROR_RX_OVF: // = -7,
Jeej 43:90c9221c1430 65 PRINT("D7A_ERROR_RX_OVF\r\n");
Jeej 43:90c9221c1430 66 break;
Jeej 43:90c9221c1430 67 /// RX checksum
Jeej 43:90c9221c1430 68 case D7A_ERROR_RX_CRC: // = -8,
Jeej 43:90c9221c1430 69 PRINT("D7A_ERROR_RX_CRC\r\n");
Jeej 43:90c9221c1430 70 break;
Jeej 43:90c9221c1430 71 /// Abort
Jeej 43:90c9221c1430 72 case D7A_ERROR_ABORT: // = -9,
Jeej 43:90c9221c1430 73 PRINT("D7A_ERROR_ABORT\r\n");
Jeej 43:90c9221c1430 74 break;
Jeej 43:90c9221c1430 75 /// No ACK received
Jeej 43:90c9221c1430 76 case D7A_ERROR_NO_ACK: // = -10,
Jeej 43:90c9221c1430 77 PRINT("D7A_ERROR_NO_ACK\r\n");
Jeej 43:90c9221c1430 78 break;
Jeej 43:90c9221c1430 79 /// RX timeout
Jeej 43:90c9221c1430 80 case D7A_ERROR_RX_TO: // = -11,
Jeej 43:90c9221c1430 81 PRINT("D7A_ERROR_RX_TO\r\n");
Jeej 43:90c9221c1430 82 break;
Jeej 43:90c9221c1430 83 default:
Jeej 43:90c9221c1430 84 PRINT("Unknown Error %d\r\n", error);
Jeej 43:90c9221c1430 85 break;
Jeej 43:90c9221c1430 86 }
Jeej 43:90c9221c1430 87 }
Jeej 43:90c9221c1430 88 else if (ALP_ITF_TYPE_LWAN == itf)
Jeej 43:90c9221c1430 89 {
Jeej 43:90c9221c1430 90 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 43:90c9221c1430 91 }
Jeej 43:90c9221c1430 92 else
Jeej 43:90c9221c1430 93 {
Jeej 43:90c9221c1430 94 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 43:90c9221c1430 95 }
Jeej 0:e9dd36a15d07 96 }
Jeej 43:90c9221c1430 97 else
Jeej 0:e9dd36a15d07 98 {
Jeej 43:90c9221c1430 99 PRINT("ALP: ");
Jeej 43:90c9221c1430 100 switch (error)
Jeej 43:90c9221c1430 101 {
Jeej 43:90c9221c1430 102 // Not really errors, more like status
Jeej 43:90c9221c1430 103 case ALP_ERR_ITF_FULL: // 0x02: For interfaces supporting buffering, indicates buffer reached maximum capacity (no data loss)
Jeej 43:90c9221c1430 104 PRINT("ALP_ERR_ITF_FULL\r\n");
Jeej 43:90c9221c1430 105 break;
Jeej 43:90c9221c1430 106 case ALP_ERR_PARTIAL_COMPLETION: // 0x01: Action received and partially completed at response. To be completed after response
Jeej 43:90c9221c1430 107 PRINT("ALP_ERR_PARTIAL_COMPLETION\r\n");
Jeej 43:90c9221c1430 108 break;
Jeej 43:90c9221c1430 109
Jeej 43:90c9221c1430 110 // ALP Errors
Jeej 43:90c9221c1430 111 case ALP_ERR_NONE: // 0x00: Action completed (OK)
Jeej 43:90c9221c1430 112 PRINT("ALP_ERR_NONE\r\n");
Jeej 43:90c9221c1430 113 break;
Jeej 43:90c9221c1430 114 case ALP_ERR_FILE_NOT_FOUND: // 0xFF: Error access file: File ID does not exist
Jeej 43:90c9221c1430 115 PRINT("ALP_ERR_FILE_NOT_FOUND\r\n");
Jeej 43:90c9221c1430 116 break;
Jeej 43:90c9221c1430 117 case ALP_ERR_FILE_EXIST: // 0xFE: Error create file: File ID already exists
Jeej 43:90c9221c1430 118 PRINT("ALP_ERR_FILE_EXIST\r\n");
Jeej 43:90c9221c1430 119 break;
Jeej 43:90c9221c1430 120 case ALP_ERR_FILE_NOT_RESTORABLE: // 0xFD: Error restore file: File is not restorable
Jeej 43:90c9221c1430 121 PRINT("ALP_ERR_FILE_NOT_RESTORABLEr\n");
Jeej 43:90c9221c1430 122 break;
Jeej 43:90c9221c1430 123 case ALP_ERR_PERMISSION_DENIED: // 0xFC: Error access file: Insufficient permissions
Jeej 43:90c9221c1430 124 PRINT("ALP_ERR_PERMISSION_DENIED\r\n");
Jeej 43:90c9221c1430 125 break;
Jeej 43:90c9221c1430 126 case ALP_ERR_LENGTH_OVERFLOW: // 0xFB: Error create file: Supplied length (in header) is beyond file limits
Jeej 43:90c9221c1430 127 PRINT("ALP_ERR_LENGTH_OVERFLOW\r\n");
Jeej 43:90c9221c1430 128 break;
Jeej 43:90c9221c1430 129 case ALP_ERR_ALLOC_OVERFLOW: // 0xFA: Error create file: Supplied allocation (in header) is beyond file limits
Jeej 43:90c9221c1430 130 PRINT("ALP_ERR_ALLOC_OVERFLOW\r\n");
Jeej 43:90c9221c1430 131 break;
Jeej 43:90c9221c1430 132 case ALP_ERR_OFFSET_OVERFLOW: // 0xF9: Error write: Supplied start offset is out of bounds of file allocation
Jeej 43:90c9221c1430 133 PRINT("ALP_ERR_OFFSET_OVERFLOW\r\n");
Jeej 43:90c9221c1430 134 break;
Jeej 43:90c9221c1430 135 case ALP_ERR_WRITE_OVERFLOW: // 0xF8: Error complete write: Supplied data goes beyond file allocation
Jeej 43:90c9221c1430 136 PRINT("ALP_ERR_WRITE_OVERFLOW\r\n");
Jeej 43:90c9221c1430 137 break;
Jeej 43:90c9221c1430 138 case ALP_ERR_WRITE_ERROR: // 0xF7: Error write: impossible to write in storage location
Jeej 43:90c9221c1430 139 PRINT("ALP_ERR_WRITE_ERROR\r\n");
Jeej 43:90c9221c1430 140 break;
Jeej 43:90c9221c1430 141 case ALP_ERR_OPERATION_UNKNOWN: // 0xF6: Error unknown Operation
Jeej 43:90c9221c1430 142 PRINT("ALP_ERR_OPERATION_UNKNOWN\r\n");
Jeej 43:90c9221c1430 143 break;
Jeej 43:90c9221c1430 144 case ALP_ERR_OPERAND_INCOMPLETE: // 0xF5: Error incomplete Operand
Jeej 43:90c9221c1430 145 PRINT("ALP_ERR_OPERAND_INCOMPLETE\r\n");
Jeej 43:90c9221c1430 146 break;
Jeej 43:90c9221c1430 147 case ALP_ERR_OPERAND_WRONG_FORMAT: // 0xF4: Error wrong Operand format
Jeej 43:90c9221c1430 148 PRINT("ALP_ERR_OPERAND_WRONG_FORMAT\r\n");
Jeej 43:90c9221c1430 149 break;
Jeej 43:90c9221c1430 150 case ALP_ERR_ITF_INVALID: // 0xF3: Error invalid interface
Jeej 43:90c9221c1430 151 PRINT("ALP_ERR_ITF_INVALID\r\n");
Jeej 43:90c9221c1430 152 break;
Jeej 43:90c9221c1430 153 case ALP_ERR_ITF_OVERFLOW: // 0xF2: Error interface overflown (i.e. resources exhausted, buffer full with data discarded)
Jeej 43:90c9221c1430 154 PRINT("ALP_ERR_ITF_OVERFLOW\r\n");
Jeej 43:90c9221c1430 155 break;
Jeej 43:90c9221c1430 156 case ALP_ERR_QUERY_FAIL: // 0xF1: (Group of) Query result was false (Informative error code).
Jeej 43:90c9221c1430 157 PRINT("ALP_ERR_QUERY_FAIL\r\n");
Jeej 43:90c9221c1430 158 break;
Jeej 43:90c9221c1430 159
Jeej 43:90c9221c1430 160 // Other Errors
Jeej 43:90c9221c1430 161 case ALP_ERR_UNKNOWN: // 0x80: Unknown error
Jeej 43:90c9221c1430 162 PRINT("ALP_ERR_UNKNOWN\r\n");
Jeej 43:90c9221c1430 163 break;
Jeej 43:90c9221c1430 164 case ALP_ERR_FS_TIMEOUT: // 0x81: Internal FS Error
Jeej 43:90c9221c1430 165 PRINT("ALP_ERR_FS_TIMEOUT\r\n");
Jeej 43:90c9221c1430 166 break;
Jeej 43:90c9221c1430 167 case ALP_ERR_ITF_UNKNOWN: // 0x82: Unknown Interface
Jeej 43:90c9221c1430 168 PRINT("ALP_ERR_ITF_UNKNOWN\r\n");
Jeej 43:90c9221c1430 169 break;
Jeej 43:90c9221c1430 170 case ALP_ERR_ITF_TIMEOUT: // 0x83: Internal ITF Error
Jeej 43:90c9221c1430 171 PRINT("ALP_ERR_ITF_TIMEOUT\r\n");
Jeej 43:90c9221c1430 172 break;
Jeej 43:90c9221c1430 173 default:
Jeej 43:90c9221c1430 174 PRINT("Unknown Error %d\r\n", error);
Jeej 43:90c9221c1430 175 break;
Jeej 43:90c9221c1430 176 }
Jeej 0:e9dd36a15d07 177 }
Jeej 0:e9dd36a15d07 178 }
Jeej 0:e9dd36a15d07 179
Jeej 1:0ec0bae00588 180 int my_alp_itf_d7a_cfg_size(d7a_sp_cfg_t* cfg)
Jeej 1:0ec0bae00588 181 {
Jeej 1:0ec0bae00588 182 int size = sizeof(d7a_sp_cfg_t) - sizeof(d7a_addressee_t);
Jeej 1:0ec0bae00588 183 size += D7A_ADDR_LEN(cfg->addressee.ctrl);
Jeej 1:0ec0bae00588 184 return size;
Jeej 1:0ec0bae00588 185 }
Jeej 1:0ec0bae00588 186
Jeej 0:e9dd36a15d07 187 // ============================================================}}}
Jeej 0:e9dd36a15d07 188
Jeej 0:e9dd36a15d07 189 // Serial adapters to WizziLab's own architecture
Jeej 0:e9dd36a15d07 190 // ============================================================{{{
Jeej 0:e9dd36a15d07 191
Jeej 1:0ec0bae00588 192 static void modem_serial_input(WizziCom* com, WizziComPacket_t* pkt)
Jeej 0:e9dd36a15d07 193 {
Jeej 0:e9dd36a15d07 194 modem_input(wizzicom_type_to_flow(pkt->type), pkt->data, pkt->length);
Jeej 0:e9dd36a15d07 195 FREE(pkt);
Jeej 0:e9dd36a15d07 196 }
Jeej 0:e9dd36a15d07 197
Jeej 1:0ec0bae00588 198 static int modem_serial_send(uint8_t* data1, uint8_t size1, uint8_t* data2, uint8_t size2)
Jeej 0:e9dd36a15d07 199 {
Jeej 0:e9dd36a15d07 200 (void)size1;
Jeej 0:e9dd36a15d07 201
Jeej 0:e9dd36a15d07 202 // Retrieve Flow ID from header and send packet
Jeej 0:e9dd36a15d07 203 g_modem_com->send((WizziComPacketType)wizzicom_flow_to_type(data1[4]), size2, data2);
Jeej 0:e9dd36a15d07 204
Jeej 0:e9dd36a15d07 205 return (size1 + size2);
Jeej 0:e9dd36a15d07 206 }
Jeej 0:e9dd36a15d07 207
Jeej 23:4ef5c82089a3 208 // Callback for id User
Jeej 0:e9dd36a15d07 209 static void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:e9dd36a15d07 210 {
Jeej 0:e9dd36a15d07 211 (void)id;
Jeej 0:e9dd36a15d07 212
Jeej 0:e9dd36a15d07 213 if (terminal)
Jeej 0:e9dd36a15d07 214 {
Jeej 0:e9dd36a15d07 215 g_modem_ready[id].release();
Jeej 0:e9dd36a15d07 216 }
Jeej 0:e9dd36a15d07 217 }
Jeej 0:e9dd36a15d07 218
Jeej 0:e9dd36a15d07 219 // Misc
Jeej 0:e9dd36a15d07 220 // ============================================================{{{
Jeej 0:e9dd36a15d07 221
Jeej 0:e9dd36a15d07 222 void modem_update_file(uint8_t fid, alp_file_header_t* header, uint8_t* data)
Jeej 0:e9dd36a15d07 223 {
Jeej 0:e9dd36a15d07 224 alp_file_header_t remote_header;
Jeej 23:4ef5c82089a3 225 uint8_t id = modem_get_id(my_main_callback);
Jeej 0:e9dd36a15d07 226
Jeej 0:e9dd36a15d07 227 memset(&remote_header, 0, sizeof(alp_file_header_t));
Jeej 0:e9dd36a15d07 228
Jeej 0:e9dd36a15d07 229 // Read remote header
Jeej 23:4ef5c82089a3 230 modem_read_fprop(fid, &remote_header, id);
Jeej 23:4ef5c82089a3 231 g_modem_ready[id].wait();
Jeej 0:e9dd36a15d07 232
Jeej 0:e9dd36a15d07 233 // Add file in local file system
Jeej 0:e9dd36a15d07 234 ram_fs_new(fid, (uint8_t*)header, data);
Jeej 0:e9dd36a15d07 235
Jeej 0:e9dd36a15d07 236 // Update file
Jeej 0:e9dd36a15d07 237 if (memcmp(&remote_header, header, sizeof(alp_file_header_t)))
Jeej 0:e9dd36a15d07 238 {
Jeej 0:e9dd36a15d07 239 HELPER_PRINT("Updating file %d\n", fid);
Jeej 0:e9dd36a15d07 240 // Delete
Jeej 23:4ef5c82089a3 241 modem_delete_file(fid, id);
Jeej 23:4ef5c82089a3 242 g_modem_ready[id].wait();
Jeej 0:e9dd36a15d07 243 // Restore in local file system
Jeej 0:e9dd36a15d07 244 ram_fs_new(fid, (uint8_t*)header, data);
Jeej 0:e9dd36a15d07 245 // Re-create
Jeej 0:e9dd36a15d07 246 if (data)
Jeej 0:e9dd36a15d07 247 {
Jeej 23:4ef5c82089a3 248 modem_declare_file(fid, header, true, id);
Jeej 0:e9dd36a15d07 249 }
Jeej 0:e9dd36a15d07 250 else
Jeej 0:e9dd36a15d07 251 {
Jeej 23:4ef5c82089a3 252 modem_create_file(fid, header, id);
Jeej 0:e9dd36a15d07 253 }
Jeej 23:4ef5c82089a3 254 g_modem_ready[id].wait();
Jeej 0:e9dd36a15d07 255 }
Jeej 0:e9dd36a15d07 256 else
Jeej 0:e9dd36a15d07 257 {
Jeej 0:e9dd36a15d07 258 HELPER_PRINT("File %d up to date\n", fid);
Jeej 0:e9dd36a15d07 259 }
Jeej 0:e9dd36a15d07 260
Jeej 23:4ef5c82089a3 261 modem_free_id(id);
Jeej 0:e9dd36a15d07 262 }
Jeej 0:e9dd36a15d07 263
Jeej 12:04c32f2e03b7 264 Semaphore boot(0);
Jeej 12:04c32f2e03b7 265 void my_startup_boot(u8 cause, u16 number)
Jeej 12:04c32f2e03b7 266 {
Jeej 12:04c32f2e03b7 267 HELPER_PRINT("Modem BOOT[%c] #%d\r\n", cause, number);
Jeej 12:04c32f2e03b7 268 boot.release();
Jeej 12:04c32f2e03b7 269 }
Jeej 12:04c32f2e03b7 270
Jeej 0:e9dd36a15d07 271 void modem_helper_open(modem_callbacks_t* callbacks)
Jeej 0:e9dd36a15d07 272 {
Jeej 0:e9dd36a15d07 273 static union {
Jeej 0:e9dd36a15d07 274 uint8_t b[8];
Jeej 0:e9dd36a15d07 275 uint32_t w[2];
Jeej 0:e9dd36a15d07 276 } uid;
Jeej 0:e9dd36a15d07 277 revision_t rev;
Jeej 12:04c32f2e03b7 278
Jeej 12:04c32f2e03b7 279 // Override boot callback to catch the first boot message
Jeej 12:04c32f2e03b7 280 modem_callbacks_t boot_callbacks = {
Jeej 12:04c32f2e03b7 281 .read = NULL,
Jeej 12:04c32f2e03b7 282 .write = NULL,
Jeej 12:04c32f2e03b7 283 .read_fprop = NULL,
Jeej 12:04c32f2e03b7 284 .flush = NULL,
Jeej 12:04c32f2e03b7 285 .remove = NULL,
Jeej 12:04c32f2e03b7 286 .udata = NULL,
Jeej 12:04c32f2e03b7 287 .lqual = NULL,
Jeej 12:04c32f2e03b7 288 .ldown = NULL,
Jeej 12:04c32f2e03b7 289 .reset = NULL,
Jeej 12:04c32f2e03b7 290 .boot = my_startup_boot
Jeej 12:04c32f2e03b7 291 };
Jeej 0:e9dd36a15d07 292
Jeej 0:e9dd36a15d07 293 // Open modem Com port
Jeej 20:8e6a7f4e06a1 294 g_modem_com = new WizziCom(MODEM_PIN_RX, MODEM_PIN_TX, MODEM_PIN_IRQ_IN, MODEM_PIN_IRQ_OUT);
Jeej 0:e9dd36a15d07 295
Jeej 12:04c32f2e03b7 296 // Hardware reset
Jeej 12:04c32f2e03b7 297 DigitalOut reset_low(MODEM_PIN_RESET, 0);
Jeej 12:04c32f2e03b7 298 Thread::wait(100);
Jeej 12:04c32f2e03b7 299
Jeej 12:04c32f2e03b7 300 // Open driver to catch boot packet
Jeej 12:04c32f2e03b7 301 modem_open(NULL, &boot_callbacks);
Jeej 12:04c32f2e03b7 302
Jeej 1:0ec0bae00588 303 // Redirect All Port traffic to modem_serial_input
Jeej 1:0ec0bae00588 304 g_modem_com->attach(modem_serial_input, WizziComPacketUntreated);
Jeej 12:04c32f2e03b7 305
Jeej 12:04c32f2e03b7 306 // Release reset
Jeej 12:04c32f2e03b7 307 DigitalIn reset_release(MODEM_PIN_RESET);
Jeej 12:04c32f2e03b7 308
Jeej 12:04c32f2e03b7 309 // Wait for first boot packet
Jeej 20:8e6a7f4e06a1 310 HELPER_PRINT("Waiting boot packet...\n");
Jeej 12:04c32f2e03b7 311 boot.wait();
Jeej 12:04c32f2e03b7 312
Jeej 12:04c32f2e03b7 313 // Re-open with user callbacks
Jeej 12:04c32f2e03b7 314 modem_close();
Jeej 1:0ec0bae00588 315 modem_open(modem_serial_send, callbacks);
Jeej 0:e9dd36a15d07 316
Jeej 23:4ef5c82089a3 317 uint8_t id = modem_get_id(my_main_callback);
Jeej 0:e9dd36a15d07 318
Jeej 23:4ef5c82089a3 319 HELPER_PRINT("Start Modem Process (id=%d)\n", id);
Jeej 0:e9dd36a15d07 320 Thread::wait(1000);
Jeej 0:e9dd36a15d07 321
Jeej 23:4ef5c82089a3 322 modem_read_file(D7A_FID_UID, uid.b, 0, 8, id);
Jeej 23:4ef5c82089a3 323 g_modem_ready[id].wait();
Jeej 0:e9dd36a15d07 324
Jeej 23:4ef5c82089a3 325 modem_read_file(D7A_FID_FIRMWARE_VERSION, (uint8_t*)&rev, 0, sizeof(revision_t), id);
Jeej 23:4ef5c82089a3 326 g_modem_ready[id].wait();
Jeej 0:e9dd36a15d07 327
Jeej 0:e9dd36a15d07 328 PRINT("------------ D7A Modem infos ------------\r\n");
Jeej 0:e9dd36a15d07 329 PRINT_DATA(" - UID: ", "%02X", uid.b, 8, "\r\n");
Jeej 0:e9dd36a15d07 330 PRINT(" - Manufacturer ID: %08X\r\n", rev.manufacturer_id);
Jeej 0:e9dd36a15d07 331 PRINT(" - Device ID: %08X\r\n", rev.device_id);
Jeej 0:e9dd36a15d07 332 PRINT(" - Hardware version: %08X\r\n", rev.hw_version);
Jeej 8:95ba5519a9f7 333 PRINT(" - Firmware version: v%d.%d.%d [%02X]\r\n", rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch, rev.fw_version.id);
Jeej 9:5d850e56ac20 334 PRINT(" - CUP max size: %d\r\n", rev.cup_max_size);
Jeej 0:e9dd36a15d07 335 PRINT("-----------------------------------------\r\n");
Jeej 0:e9dd36a15d07 336
Jeej 0:e9dd36a15d07 337 // Check version
Jeej 21:21a74abd5cb5 338 uint32_t rev_sum1 = (rev.fw_version.major << 24) | (rev.fw_version.minor << 16) | rev.fw_version.patch;
Jeej 21:21a74abd5cb5 339 uint32_t rev_sum2 = (MODEM_VERSION_MAJOR << 24) | (MODEM_VERSION_MINOR << 16) | MODEM_VERSION_PATCH;
Jeej 21:21a74abd5cb5 340 if (rev_sum1 < rev_sum2)
Jeej 0:e9dd36a15d07 341 {
Jeej 23:4ef5c82089a3 342 PRINT("\r\nYou need a modem at version %d.%d.%d or above to use this Driver.\r\n"
Jeej 23:4ef5c82089a3 343 "You can:\r\n"
Jeej 23:4ef5c82089a3 344 " - Check modem updates on the Dash7Board:\r\n"
Jeej 23:4ef5c82089a3 345 " Go to your site's version manager.\r\n"
Jeej 23:4ef5c82089a3 346 " - Check modem updates by importing:\r\n"
Jeej 23:4ef5c82089a3 347 " https://developer.mbed.org/teams/WizziLab/code/D7A_WM_Updater\r\n"
Jeej 23:4ef5c82089a3 348 " - Choose the right 'modem_ref_helper' revision.\r\n"
Jeej 23:4ef5c82089a3 349 " Right click on modem_ref_helper -> Revision.\r\n"
Jeej 21:21a74abd5cb5 350 , MODEM_VERSION_MAJOR, MODEM_VERSION_MINOR, MODEM_VERSION_PATCH);
Jeej 23:4ef5c82089a3 351
Jeej 0:e9dd36a15d07 352 Thread::wait(osWaitForever);
Jeej 0:e9dd36a15d07 353 }
Jeej 0:e9dd36a15d07 354
Jeej 23:4ef5c82089a3 355 modem_free_id(id);
Jeej 0:e9dd36a15d07 356 }