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
modem_ref_helper.cpp@23:4ef5c82089a3, 2018-01-31 (annotated)
- Committer:
- Jeej
- Date:
- Wed Jan 31 11:25:36 2018 +0000
- Revision:
- 23:4ef5c82089a3
- Parent:
- 22:dccf7ff5fa7e
- Child:
- 28:d3b2889f9fab
Updated bad revision message.
Who changed what in which revision?
User | Revision | Line number | New 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 | 15:c90efeb6bd6a | 9 | #define MODEM_VERSION_MAJOR 4 |
Jeej | 22:dccf7ff5fa7e | 10 | #define MODEM_VERSION_MINOR 10 |
Jeej | 21:21a74abd5cb5 | 11 | #define MODEM_VERSION_PATCH 0 |
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 | 0:e9dd36a15d07 | 16 | static void modem_print_status(int status) |
Jeej | 0:e9dd36a15d07 | 17 | { |
Jeej | 0:e9dd36a15d07 | 18 | switch (status) |
Jeej | 0:e9dd36a15d07 | 19 | { |
Jeej | 0:e9dd36a15d07 | 20 | case ALP_ERR_NONE: |
Jeej | 0:e9dd36a15d07 | 21 | HELPER_PRINT("Status: OK\n"); |
Jeej | 0:e9dd36a15d07 | 22 | break; |
Jeej | 0:e9dd36a15d07 | 23 | default: |
Jeej | 0:e9dd36a15d07 | 24 | HELPER_PRINT("Status: error %d\n", status); |
Jeej | 0:e9dd36a15d07 | 25 | break; |
Jeej | 0:e9dd36a15d07 | 26 | } |
Jeej | 0:e9dd36a15d07 | 27 | } |
Jeej | 0:e9dd36a15d07 | 28 | |
Jeej | 0:e9dd36a15d07 | 29 | static void modem_print_resp(int status) |
Jeej | 0:e9dd36a15d07 | 30 | { |
Jeej | 0:e9dd36a15d07 | 31 | switch (status) |
Jeej | 0:e9dd36a15d07 | 32 | { |
Jeej | 0:e9dd36a15d07 | 33 | case ALP_ERR_NONE: |
Jeej | 0:e9dd36a15d07 | 34 | HELPER_PRINT("Resp: OK\n"); |
Jeej | 0:e9dd36a15d07 | 35 | break; |
Jeej | 0:e9dd36a15d07 | 36 | case ALP_ERR_FILE_EXIST: |
Jeej | 0:e9dd36a15d07 | 37 | HELPER_PRINT("Resp: Already registered\n"); |
Jeej | 0:e9dd36a15d07 | 38 | break; |
Jeej | 0:e9dd36a15d07 | 39 | default: |
Jeej | 0:e9dd36a15d07 | 40 | HELPER_PRINT("Resp: error %d\n", status); |
Jeej | 0:e9dd36a15d07 | 41 | break; |
Jeej | 0:e9dd36a15d07 | 42 | } |
Jeej | 0:e9dd36a15d07 | 43 | } |
Jeej | 0:e9dd36a15d07 | 44 | |
Jeej | 1:0ec0bae00588 | 45 | int my_alp_itf_d7a_cfg_size(d7a_sp_cfg_t* cfg) |
Jeej | 1:0ec0bae00588 | 46 | { |
Jeej | 1:0ec0bae00588 | 47 | int size = sizeof(d7a_sp_cfg_t) - sizeof(d7a_addressee_t); |
Jeej | 1:0ec0bae00588 | 48 | size += D7A_ADDR_LEN(cfg->addressee.ctrl); |
Jeej | 1:0ec0bae00588 | 49 | return size; |
Jeej | 1:0ec0bae00588 | 50 | } |
Jeej | 1:0ec0bae00588 | 51 | |
Jeej | 0:e9dd36a15d07 | 52 | // ============================================================}}} |
Jeej | 0:e9dd36a15d07 | 53 | |
Jeej | 0:e9dd36a15d07 | 54 | // Serial adapters to WizziLab's own architecture |
Jeej | 0:e9dd36a15d07 | 55 | // ============================================================{{{ |
Jeej | 0:e9dd36a15d07 | 56 | |
Jeej | 1:0ec0bae00588 | 57 | static void modem_serial_input(WizziCom* com, WizziComPacket_t* pkt) |
Jeej | 0:e9dd36a15d07 | 58 | { |
Jeej | 0:e9dd36a15d07 | 59 | modem_input(wizzicom_type_to_flow(pkt->type), pkt->data, pkt->length); |
Jeej | 0:e9dd36a15d07 | 60 | FREE(pkt); |
Jeej | 0:e9dd36a15d07 | 61 | } |
Jeej | 0:e9dd36a15d07 | 62 | |
Jeej | 1:0ec0bae00588 | 63 | static int modem_serial_send(uint8_t* data1, uint8_t size1, uint8_t* data2, uint8_t size2) |
Jeej | 0:e9dd36a15d07 | 64 | { |
Jeej | 0:e9dd36a15d07 | 65 | (void)size1; |
Jeej | 0:e9dd36a15d07 | 66 | |
Jeej | 0:e9dd36a15d07 | 67 | // Retrieve Flow ID from header and send packet |
Jeej | 0:e9dd36a15d07 | 68 | g_modem_com->send((WizziComPacketType)wizzicom_flow_to_type(data1[4]), size2, data2); |
Jeej | 0:e9dd36a15d07 | 69 | |
Jeej | 0:e9dd36a15d07 | 70 | return (size1 + size2); |
Jeej | 0:e9dd36a15d07 | 71 | } |
Jeej | 0:e9dd36a15d07 | 72 | |
Jeej | 23:4ef5c82089a3 | 73 | // Callback for id User |
Jeej | 0:e9dd36a15d07 | 74 | static void my_main_callback(uint8_t terminal, int8_t err, uint8_t id) |
Jeej | 0:e9dd36a15d07 | 75 | { |
Jeej | 0:e9dd36a15d07 | 76 | (void)id; |
Jeej | 0:e9dd36a15d07 | 77 | |
Jeej | 0:e9dd36a15d07 | 78 | if (terminal) |
Jeej | 0:e9dd36a15d07 | 79 | { |
Jeej | 0:e9dd36a15d07 | 80 | modem_print_status(err); |
Jeej | 0:e9dd36a15d07 | 81 | g_modem_ready[id].release(); |
Jeej | 0:e9dd36a15d07 | 82 | } |
Jeej | 0:e9dd36a15d07 | 83 | else |
Jeej | 0:e9dd36a15d07 | 84 | { |
Jeej | 0:e9dd36a15d07 | 85 | modem_print_resp(err); |
Jeej | 0:e9dd36a15d07 | 86 | } |
Jeej | 0:e9dd36a15d07 | 87 | } |
Jeej | 0:e9dd36a15d07 | 88 | |
Jeej | 0:e9dd36a15d07 | 89 | // Misc |
Jeej | 0:e9dd36a15d07 | 90 | // ============================================================{{{ |
Jeej | 0:e9dd36a15d07 | 91 | |
Jeej | 0:e9dd36a15d07 | 92 | void modem_update_file(uint8_t fid, alp_file_header_t* header, uint8_t* data) |
Jeej | 0:e9dd36a15d07 | 93 | { |
Jeej | 0:e9dd36a15d07 | 94 | alp_file_header_t remote_header; |
Jeej | 23:4ef5c82089a3 | 95 | uint8_t id = modem_get_id(my_main_callback); |
Jeej | 0:e9dd36a15d07 | 96 | |
Jeej | 0:e9dd36a15d07 | 97 | memset(&remote_header, 0, sizeof(alp_file_header_t)); |
Jeej | 0:e9dd36a15d07 | 98 | |
Jeej | 0:e9dd36a15d07 | 99 | // Read remote header |
Jeej | 23:4ef5c82089a3 | 100 | modem_read_fprop(fid, &remote_header, id); |
Jeej | 23:4ef5c82089a3 | 101 | g_modem_ready[id].wait(); |
Jeej | 0:e9dd36a15d07 | 102 | |
Jeej | 0:e9dd36a15d07 | 103 | // Add file in local file system |
Jeej | 0:e9dd36a15d07 | 104 | ram_fs_new(fid, (uint8_t*)header, data); |
Jeej | 0:e9dd36a15d07 | 105 | |
Jeej | 0:e9dd36a15d07 | 106 | // Update file |
Jeej | 0:e9dd36a15d07 | 107 | if (memcmp(&remote_header, header, sizeof(alp_file_header_t))) |
Jeej | 0:e9dd36a15d07 | 108 | { |
Jeej | 0:e9dd36a15d07 | 109 | HELPER_PRINT("Updating file %d\n", fid); |
Jeej | 0:e9dd36a15d07 | 110 | // Delete |
Jeej | 23:4ef5c82089a3 | 111 | modem_delete_file(fid, id); |
Jeej | 23:4ef5c82089a3 | 112 | g_modem_ready[id].wait(); |
Jeej | 0:e9dd36a15d07 | 113 | // Restore in local file system |
Jeej | 0:e9dd36a15d07 | 114 | ram_fs_new(fid, (uint8_t*)header, data); |
Jeej | 0:e9dd36a15d07 | 115 | // Re-create |
Jeej | 0:e9dd36a15d07 | 116 | if (data) |
Jeej | 0:e9dd36a15d07 | 117 | { |
Jeej | 23:4ef5c82089a3 | 118 | modem_declare_file(fid, header, true, id); |
Jeej | 0:e9dd36a15d07 | 119 | } |
Jeej | 0:e9dd36a15d07 | 120 | else |
Jeej | 0:e9dd36a15d07 | 121 | { |
Jeej | 23:4ef5c82089a3 | 122 | modem_create_file(fid, header, id); |
Jeej | 0:e9dd36a15d07 | 123 | } |
Jeej | 23:4ef5c82089a3 | 124 | g_modem_ready[id].wait(); |
Jeej | 0:e9dd36a15d07 | 125 | } |
Jeej | 0:e9dd36a15d07 | 126 | else |
Jeej | 0:e9dd36a15d07 | 127 | { |
Jeej | 0:e9dd36a15d07 | 128 | HELPER_PRINT("File %d up to date\n", fid); |
Jeej | 0:e9dd36a15d07 | 129 | } |
Jeej | 0:e9dd36a15d07 | 130 | |
Jeej | 23:4ef5c82089a3 | 131 | modem_free_id(id); |
Jeej | 0:e9dd36a15d07 | 132 | } |
Jeej | 0:e9dd36a15d07 | 133 | |
Jeej | 12:04c32f2e03b7 | 134 | Semaphore boot(0); |
Jeej | 12:04c32f2e03b7 | 135 | void my_startup_boot(u8 cause, u16 number) |
Jeej | 12:04c32f2e03b7 | 136 | { |
Jeej | 12:04c32f2e03b7 | 137 | HELPER_PRINT("Modem BOOT[%c] #%d\r\n", cause, number); |
Jeej | 12:04c32f2e03b7 | 138 | boot.release(); |
Jeej | 12:04c32f2e03b7 | 139 | } |
Jeej | 12:04c32f2e03b7 | 140 | |
Jeej | 0:e9dd36a15d07 | 141 | void modem_helper_open(modem_callbacks_t* callbacks) |
Jeej | 0:e9dd36a15d07 | 142 | { |
Jeej | 0:e9dd36a15d07 | 143 | static union { |
Jeej | 0:e9dd36a15d07 | 144 | uint8_t b[8]; |
Jeej | 0:e9dd36a15d07 | 145 | uint32_t w[2]; |
Jeej | 0:e9dd36a15d07 | 146 | } uid; |
Jeej | 0:e9dd36a15d07 | 147 | revision_t rev; |
Jeej | 12:04c32f2e03b7 | 148 | |
Jeej | 12:04c32f2e03b7 | 149 | // Override boot callback to catch the first boot message |
Jeej | 12:04c32f2e03b7 | 150 | modem_callbacks_t boot_callbacks = { |
Jeej | 12:04c32f2e03b7 | 151 | .read = NULL, |
Jeej | 12:04c32f2e03b7 | 152 | .write = NULL, |
Jeej | 12:04c32f2e03b7 | 153 | .read_fprop = NULL, |
Jeej | 12:04c32f2e03b7 | 154 | .flush = NULL, |
Jeej | 12:04c32f2e03b7 | 155 | .remove = NULL, |
Jeej | 12:04c32f2e03b7 | 156 | .udata = NULL, |
Jeej | 12:04c32f2e03b7 | 157 | .lqual = NULL, |
Jeej | 12:04c32f2e03b7 | 158 | .ldown = NULL, |
Jeej | 12:04c32f2e03b7 | 159 | .reset = NULL, |
Jeej | 12:04c32f2e03b7 | 160 | .boot = my_startup_boot |
Jeej | 12:04c32f2e03b7 | 161 | }; |
Jeej | 0:e9dd36a15d07 | 162 | |
Jeej | 0:e9dd36a15d07 | 163 | // Open modem Com port |
Jeej | 20:8e6a7f4e06a1 | 164 | g_modem_com = new WizziCom(MODEM_PIN_RX, MODEM_PIN_TX, MODEM_PIN_IRQ_IN, MODEM_PIN_IRQ_OUT); |
Jeej | 0:e9dd36a15d07 | 165 | |
Jeej | 12:04c32f2e03b7 | 166 | // Hardware reset |
Jeej | 12:04c32f2e03b7 | 167 | DigitalOut reset_low(MODEM_PIN_RESET, 0); |
Jeej | 12:04c32f2e03b7 | 168 | Thread::wait(100); |
Jeej | 12:04c32f2e03b7 | 169 | |
Jeej | 12:04c32f2e03b7 | 170 | // Open driver to catch boot packet |
Jeej | 12:04c32f2e03b7 | 171 | modem_open(NULL, &boot_callbacks); |
Jeej | 12:04c32f2e03b7 | 172 | |
Jeej | 1:0ec0bae00588 | 173 | // Redirect All Port traffic to modem_serial_input |
Jeej | 1:0ec0bae00588 | 174 | g_modem_com->attach(modem_serial_input, WizziComPacketUntreated); |
Jeej | 12:04c32f2e03b7 | 175 | |
Jeej | 12:04c32f2e03b7 | 176 | // Release reset |
Jeej | 12:04c32f2e03b7 | 177 | DigitalIn reset_release(MODEM_PIN_RESET); |
Jeej | 12:04c32f2e03b7 | 178 | |
Jeej | 12:04c32f2e03b7 | 179 | // Wait for first boot packet |
Jeej | 20:8e6a7f4e06a1 | 180 | HELPER_PRINT("Waiting boot packet...\n"); |
Jeej | 12:04c32f2e03b7 | 181 | boot.wait(); |
Jeej | 12:04c32f2e03b7 | 182 | |
Jeej | 12:04c32f2e03b7 | 183 | // Re-open with user callbacks |
Jeej | 12:04c32f2e03b7 | 184 | modem_close(); |
Jeej | 1:0ec0bae00588 | 185 | modem_open(modem_serial_send, callbacks); |
Jeej | 0:e9dd36a15d07 | 186 | |
Jeej | 23:4ef5c82089a3 | 187 | uint8_t id = modem_get_id(my_main_callback); |
Jeej | 0:e9dd36a15d07 | 188 | |
Jeej | 23:4ef5c82089a3 | 189 | HELPER_PRINT("Start Modem Process (id=%d)\n", id); |
Jeej | 0:e9dd36a15d07 | 190 | Thread::wait(1000); |
Jeej | 0:e9dd36a15d07 | 191 | |
Jeej | 23:4ef5c82089a3 | 192 | modem_read_file(D7A_FID_UID, uid.b, 0, 8, id); |
Jeej | 23:4ef5c82089a3 | 193 | g_modem_ready[id].wait(); |
Jeej | 0:e9dd36a15d07 | 194 | |
Jeej | 23:4ef5c82089a3 | 195 | modem_read_file(D7A_FID_FIRMWARE_VERSION, (uint8_t*)&rev, 0, sizeof(revision_t), id); |
Jeej | 23:4ef5c82089a3 | 196 | g_modem_ready[id].wait(); |
Jeej | 0:e9dd36a15d07 | 197 | |
Jeej | 0:e9dd36a15d07 | 198 | PRINT("------------ D7A Modem infos ------------\r\n"); |
Jeej | 0:e9dd36a15d07 | 199 | PRINT_DATA(" - UID: ", "%02X", uid.b, 8, "\r\n"); |
Jeej | 0:e9dd36a15d07 | 200 | PRINT(" - Manufacturer ID: %08X\r\n", rev.manufacturer_id); |
Jeej | 0:e9dd36a15d07 | 201 | PRINT(" - Device ID: %08X\r\n", rev.device_id); |
Jeej | 0:e9dd36a15d07 | 202 | PRINT(" - Hardware version: %08X\r\n", rev.hw_version); |
Jeej | 8:95ba5519a9f7 | 203 | 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 | 204 | PRINT(" - CUP max size: %d\r\n", rev.cup_max_size); |
Jeej | 0:e9dd36a15d07 | 205 | PRINT("-----------------------------------------\r\n"); |
Jeej | 0:e9dd36a15d07 | 206 | |
Jeej | 0:e9dd36a15d07 | 207 | // Check version |
Jeej | 21:21a74abd5cb5 | 208 | uint32_t rev_sum1 = (rev.fw_version.major << 24) | (rev.fw_version.minor << 16) | rev.fw_version.patch; |
Jeej | 21:21a74abd5cb5 | 209 | uint32_t rev_sum2 = (MODEM_VERSION_MAJOR << 24) | (MODEM_VERSION_MINOR << 16) | MODEM_VERSION_PATCH; |
Jeej | 21:21a74abd5cb5 | 210 | if (rev_sum1 < rev_sum2) |
Jeej | 0:e9dd36a15d07 | 211 | { |
Jeej | 23:4ef5c82089a3 | 212 | PRINT("\r\nYou need a modem at version %d.%d.%d or above to use this Driver.\r\n" |
Jeej | 23:4ef5c82089a3 | 213 | "You can:\r\n" |
Jeej | 23:4ef5c82089a3 | 214 | " - Check modem updates on the Dash7Board:\r\n" |
Jeej | 23:4ef5c82089a3 | 215 | " Go to your site's version manager.\r\n" |
Jeej | 23:4ef5c82089a3 | 216 | " - Check modem updates by importing:\r\n" |
Jeej | 23:4ef5c82089a3 | 217 | " https://developer.mbed.org/teams/WizziLab/code/D7A_WM_Updater\r\n" |
Jeej | 23:4ef5c82089a3 | 218 | " - Choose the right 'modem_ref_helper' revision.\r\n" |
Jeej | 23:4ef5c82089a3 | 219 | " Right click on modem_ref_helper -> Revision.\r\n" |
Jeej | 21:21a74abd5cb5 | 220 | , MODEM_VERSION_MAJOR, MODEM_VERSION_MINOR, MODEM_VERSION_PATCH); |
Jeej | 23:4ef5c82089a3 | 221 | |
Jeej | 0:e9dd36a15d07 | 222 | Thread::wait(osWaitForever); |
Jeej | 0:e9dd36a15d07 | 223 | } |
Jeej | 0:e9dd36a15d07 | 224 | |
Jeej | 23:4ef5c82089a3 | 225 | modem_free_id(id); |
Jeej | 0:e9dd36a15d07 | 226 | } |