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:
Mon Jun 04 15:32:10 2018 +0000
Revision:
31:b258f6398278
Parent:
28:d3b2889f9fab
Child:
36:7cea3c6d7a63
Updated to v5.1.174

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 31:b258f6398278 10 #define MODEM_VERSION_MINOR 1
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 }