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 11 14:32:03 2018 +0000
Revision:
45:382159015b55
Parent:
44:7563b8e53e1d
Child:
47:cf88f0f370cb
Relaxed version check to use modem from 5.0.36 in order to be able to update them via the dash7board.

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