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:
Wed Dec 13 14:29:47 2017 +0000
Revision:
17:bb9069b32b22
Parent:
16:2b479d684110
Child:
20:8e6a7f4e06a1
Added some prints

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