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 Jan 27 14:45:43 2021 +0000
Revision:
68:b2dd7309da44
Child:
69:8f2fe2426ef9
Sanity commit. Do not use.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 68:b2dd7309da44 1 #include "modem_d7a.h"
Jeej 68:b2dd7309da44 2
Jeej 68:b2dd7309da44 3 #if 0
Jeej 68:b2dd7309da44 4 #define HELPER_PRINT(...) PRINT(__VA_ARGS__)
Jeej 68:b2dd7309da44 5 #else
Jeej 68:b2dd7309da44 6 #define HELPER_PRINT(...);
Jeej 68:b2dd7309da44 7 #endif
Jeej 68:b2dd7309da44 8
Jeej 68:b2dd7309da44 9 #define MODEM_VERSION_MAJOR 5
Jeej 68:b2dd7309da44 10 #define MODEM_VERSION_MINOR 6
Jeej 68:b2dd7309da44 11 #define MODEM_VERSION_PATCH 0
Jeej 68:b2dd7309da44 12 #define MODEM_DEVICE_ID 0x00001001
Jeej 68:b2dd7309da44 13
Jeej 68:b2dd7309da44 14
Jeej 68:b2dd7309da44 15 typedef struct{
Jeej 68:b2dd7309da44 16 Semaphore s;
Jeej 68:b2dd7309da44 17 int8_t err;
Jeej 68:b2dd7309da44 18 } modem_lwan_ctx_t;
Jeej 68:b2dd7309da44 19
Jeej 68:b2dd7309da44 20 static modem_lwan_ctx_t g_ctx[MAX_USER_NB];
Jeej 68:b2dd7309da44 21 static WizziCom* g_modem_com;
Jeej 68:b2dd7309da44 22
Jeej 68:b2dd7309da44 23 // Callback for id User
Jeej 68:b2dd7309da44 24 static void modem_cb(uint8_t terminal, int8_t err, uint8_t id)
Jeej 68:b2dd7309da44 25 {
Jeej 68:b2dd7309da44 26 (void)id;
Jeej 68:b2dd7309da44 27
Jeej 68:b2dd7309da44 28 g_ctx[id].err = err;
Jeej 68:b2dd7309da44 29
Jeej 68:b2dd7309da44 30 if (terminal)
Jeej 68:b2dd7309da44 31 {
Jeej 68:b2dd7309da44 32 g_ctx[id].s.release();
Jeej 68:b2dd7309da44 33 }
Jeej 68:b2dd7309da44 34 }
Jeej 68:b2dd7309da44 35
Jeej 68:b2dd7309da44 36 static int g_boot_nb;
Jeej 68:b2dd7309da44 37 static int g_read_nb;
Jeej 68:b2dd7309da44 38 static int g_swr_nb;
Jeej 68:b2dd7309da44 39 static int g_hwr_nb;
Jeej 68:b2dd7309da44 40 static int g_pwc_nb;
Jeej 68:b2dd7309da44 41 static int g_fail_nb;
Jeej 68:b2dd7309da44 42
Jeej 68:b2dd7309da44 43 int modem_wait_resp(Semaphore* s, uint32_t timeout, char* function, uint32_t line)
Jeej 68:b2dd7309da44 44 {
Jeej 68:b2dd7309da44 45 if (!s->try_acquire_for(timeout))
Jeej 68:b2dd7309da44 46 {
Jeej 68:b2dd7309da44 47 PRINT("%s:%d: Modem resp timeout after %d ms\n", function, line, timeout);
Jeej 68:b2dd7309da44 48 return -1;
Jeej 68:b2dd7309da44 49 }
Jeej 68:b2dd7309da44 50
Jeej 68:b2dd7309da44 51 return 0;
Jeej 68:b2dd7309da44 52 }
Jeej 68:b2dd7309da44 53
Jeej 68:b2dd7309da44 54 int my_alp_itf_d7a_cfg_size(d7a_sp_cfg_t* cfg)
Jeej 68:b2dd7309da44 55 {
Jeej 68:b2dd7309da44 56 int size = sizeof(d7a_sp_cfg_t) - sizeof(d7a_addressee_t);
Jeej 68:b2dd7309da44 57 size += D7A_ADDR_LEN(cfg->addressee.ctrl);
Jeej 68:b2dd7309da44 58 return size;
Jeej 68:b2dd7309da44 59 }
Jeej 68:b2dd7309da44 60
Jeej 68:b2dd7309da44 61 // ============================================================}}}
Jeej 68:b2dd7309da44 62
Jeej 68:b2dd7309da44 63 // Serial adapters to WizziLab's own architecture
Jeej 68:b2dd7309da44 64 // ============================================================{{{
Jeej 68:b2dd7309da44 65
Jeej 68:b2dd7309da44 66 static void modem_serial_input(WizziCom* com, WizziComPacket_t* pkt)
Jeej 68:b2dd7309da44 67 {
Jeej 68:b2dd7309da44 68 modem_ref_input(wizzicom_type_to_flow(pkt->type), pkt->data, pkt->length);
Jeej 68:b2dd7309da44 69 }
Jeej 68:b2dd7309da44 70
Jeej 68:b2dd7309da44 71 static int modem_serial_send(uint8_t* data1, uint8_t size1, uint8_t* data2, uint8_t size2)
Jeej 68:b2dd7309da44 72 {
Jeej 68:b2dd7309da44 73 (void)size1;
Jeej 68:b2dd7309da44 74
Jeej 68:b2dd7309da44 75 // Retrieve Flow ID from header and send packet
Jeej 68:b2dd7309da44 76 g_modem_com->send((WizziComPacketType)wizzicom_flow_to_type(data1[4]), size2, data2);
Jeej 68:b2dd7309da44 77
Jeej 68:b2dd7309da44 78 return (size1 + size2);
Jeej 68:b2dd7309da44 79 }
Jeej 68:b2dd7309da44 80
Jeej 68:b2dd7309da44 81 Semaphore boot(0);
Jeej 68:b2dd7309da44 82 void my_startup_boot(u8 cause, u16 number)
Jeej 68:b2dd7309da44 83 {
Jeej 68:b2dd7309da44 84 HELPER_PRINT("Modem BOOT[%c] #%d\r\n", cause, number);
Jeej 68:b2dd7309da44 85 boot.release();
Jeej 68:b2dd7309da44 86 }
Jeej 68:b2dd7309da44 87
Jeej 68:b2dd7309da44 88 int modem_open(modem_ref_callbacks_t* callbacks)
Jeej 68:b2dd7309da44 89 {
Jeej 68:b2dd7309da44 90 static union {
Jeej 68:b2dd7309da44 91 uint8_t b[8];
Jeej 68:b2dd7309da44 92 uint32_t w[2];
Jeej 68:b2dd7309da44 93 } uid;
Jeej 68:b2dd7309da44 94 revision_t rev;
Jeej 68:b2dd7309da44 95 int err;
Jeej 68:b2dd7309da44 96
Jeej 68:b2dd7309da44 97 g_boot_nb++;
Jeej 68:b2dd7309da44 98
Jeej 68:b2dd7309da44 99 // Override boot callback to catch the first boot message
Jeej 68:b2dd7309da44 100 modem_ref_callbacks_t boot_callbacks = {
Jeej 68:b2dd7309da44 101 .read = NULL,
Jeej 68:b2dd7309da44 102 .write = NULL,
Jeej 68:b2dd7309da44 103 .read_fprop = NULL,
Jeej 68:b2dd7309da44 104 .flush = NULL,
Jeej 68:b2dd7309da44 105 .remove = NULL,
Jeej 68:b2dd7309da44 106 .udata = NULL,
Jeej 68:b2dd7309da44 107 .lqual = NULL,
Jeej 68:b2dd7309da44 108 .ldown = NULL,
Jeej 68:b2dd7309da44 109 .reset = NULL,
Jeej 68:b2dd7309da44 110 .boot = my_startup_boot,
Jeej 68:b2dd7309da44 111 .busy = NULL,
Jeej 68:b2dd7309da44 112 .itf_busy = NULL,
Jeej 68:b2dd7309da44 113 };
Jeej 68:b2dd7309da44 114
Jeej 68:b2dd7309da44 115 // Open modem Com port
Jeej 68:b2dd7309da44 116 g_modem_com = new WizziCom(MODEM_PIN_RX, MODEM_PIN_TX, MODEM_PIN_IRQ_IN, MODEM_PIN_IRQ_OUT);
Jeej 68:b2dd7309da44 117
Jeej 68:b2dd7309da44 118 // open with user callbacks
Jeej 68:b2dd7309da44 119 modem_ref_open(modem_serial_send, callbacks);
Jeej 68:b2dd7309da44 120
Jeej 68:b2dd7309da44 121 // Redirect All Port traffic to modem_serial_input
Jeej 68:b2dd7309da44 122 g_modem_com->attach(modem_serial_input, WizziComPacketUntreated);
Jeej 68:b2dd7309da44 123
Jeej 68:b2dd7309da44 124 // Wait for modem power up
Jeej 68:b2dd7309da44 125 ThisThread::sleep_for(100);
Jeej 68:b2dd7309da44 126
Jeej 68:b2dd7309da44 127 // Try reading UID
Jeej 68:b2dd7309da44 128 err = modem_read_file(D7A_FID_UID, uid.b, 0, 8);
Jeej 68:b2dd7309da44 129
Jeej 68:b2dd7309da44 130 if (ALP_ERR_NONE > err)
Jeej 68:b2dd7309da44 131 {
Jeej 68:b2dd7309da44 132 PRINT("Trying software reset...\n");
Jeej 68:b2dd7309da44 133
Jeej 68:b2dd7309da44 134 // Open driver to catch boot packet
Jeej 68:b2dd7309da44 135 modem_ref_close();
Jeej 68:b2dd7309da44 136 modem_ref_open(NULL, &boot_callbacks);
Jeej 68:b2dd7309da44 137
Jeej 68:b2dd7309da44 138 // Try software reset
Jeej 68:b2dd7309da44 139 g_modem_com->send(WizziComPacketSysReset, 0, NULL);
Jeej 68:b2dd7309da44 140
Jeej 68:b2dd7309da44 141 if (!boot.try_acquire_for(1000))
Jeej 68:b2dd7309da44 142 {
Jeej 68:b2dd7309da44 143 PRINT("Trying hardware reset...\n");
Jeej 68:b2dd7309da44 144
Jeej 68:b2dd7309da44 145 // Assert reset pin
Jeej 68:b2dd7309da44 146 DigitalOut reset_low(MODEM_PIN_RESET, 0);
Jeej 68:b2dd7309da44 147 ThisThread::sleep_for(100);
Jeej 68:b2dd7309da44 148
Jeej 68:b2dd7309da44 149 // Release reset pin
Jeej 68:b2dd7309da44 150 DigitalIn reset_release(MODEM_PIN_RESET);
Jeej 68:b2dd7309da44 151
Jeej 68:b2dd7309da44 152 if (!boot.try_acquire_for(1000))
Jeej 68:b2dd7309da44 153 {
Jeej 68:b2dd7309da44 154 // Modem not responding!
Jeej 68:b2dd7309da44 155 PRINT("Trying power cycle.\n");
Jeej 68:b2dd7309da44 156
Jeej 68:b2dd7309da44 157 // Assert power pin
Jeej 68:b2dd7309da44 158 DigitalOut power_high(D12, 1);
Jeej 68:b2dd7309da44 159 ThisThread::sleep_for(1000);
Jeej 68:b2dd7309da44 160
Jeej 68:b2dd7309da44 161 // Release reset pin
Jeej 68:b2dd7309da44 162 DigitalIn power_release(D12);
Jeej 68:b2dd7309da44 163
Jeej 68:b2dd7309da44 164 if (!boot.try_acquire_for(1000))
Jeej 68:b2dd7309da44 165 {
Jeej 68:b2dd7309da44 166 // Modem not responding!
Jeej 68:b2dd7309da44 167 g_fail_nb++;
Jeej 68:b2dd7309da44 168 PRINT("Failed to open modem.\n");
Jeej 68:b2dd7309da44 169 return -1;
Jeej 68:b2dd7309da44 170 }
Jeej 68:b2dd7309da44 171 else
Jeej 68:b2dd7309da44 172 {
Jeej 68:b2dd7309da44 173 g_pwc_nb++;
Jeej 68:b2dd7309da44 174 PRINT("Modem is up after power cycle.\n");
Jeej 68:b2dd7309da44 175 }
Jeej 68:b2dd7309da44 176 }
Jeej 68:b2dd7309da44 177 else
Jeej 68:b2dd7309da44 178 {
Jeej 68:b2dd7309da44 179 g_hwr_nb++;
Jeej 68:b2dd7309da44 180 PRINT("Modem is up after hardware reset.\n");
Jeej 68:b2dd7309da44 181 }
Jeej 68:b2dd7309da44 182 }
Jeej 68:b2dd7309da44 183 else
Jeej 68:b2dd7309da44 184 {
Jeej 68:b2dd7309da44 185 g_swr_nb++;
Jeej 68:b2dd7309da44 186 PRINT("Modem is up after software reset.\n");
Jeej 68:b2dd7309da44 187 }
Jeej 68:b2dd7309da44 188 }
Jeej 68:b2dd7309da44 189 else
Jeej 68:b2dd7309da44 190 {
Jeej 68:b2dd7309da44 191 g_read_nb++;
Jeej 68:b2dd7309da44 192 PRINT("Modem is up.\n");
Jeej 68:b2dd7309da44 193 }
Jeej 68:b2dd7309da44 194
Jeej 68:b2dd7309da44 195 PRINT("Boot stats: boot:%d read:%d swr:%d hwr:%d pwc:%d fail:%d\n", g_boot_nb, g_read_nb, g_swr_nb, g_hwr_nb, g_pwc_nb, g_fail_nb);
Jeej 68:b2dd7309da44 196
Jeej 68:b2dd7309da44 197 // Re-open with user callbacks
Jeej 68:b2dd7309da44 198 modem_ref_close();
Jeej 68:b2dd7309da44 199 modem_ref_open(modem_serial_send, callbacks);
Jeej 68:b2dd7309da44 200
Jeej 68:b2dd7309da44 201 HELPER_PRINT("Start Modem Process (id=%d)\n", id);
Jeej 68:b2dd7309da44 202 ThisThread::sleep_for(1000);
Jeej 68:b2dd7309da44 203
Jeej 68:b2dd7309da44 204 modem_read_file(D7A_FID_UID, uid.b, 0, 8);
Jeej 68:b2dd7309da44 205 modem_read_file(D7A_FID_FIRMWARE_VERSION, (uint8_t*)&rev, 0, sizeof(revision_t));
Jeej 68:b2dd7309da44 206
Jeej 68:b2dd7309da44 207 PRINT("------------ D7A Modem infos ------------\r\n");
Jeej 68:b2dd7309da44 208 PRINT_DATA(" - UID: ", "%02X", uid.b, 8, "\r\n");
Jeej 68:b2dd7309da44 209 PRINT(" - Manufacturer ID: %08X\r\n", rev.manufacturer_id);
Jeej 68:b2dd7309da44 210 PRINT(" - Device ID: %08X\r\n", rev.device_id);
Jeej 68:b2dd7309da44 211 PRINT(" - Hardware version: %08X\r\n", rev.hw_version);
Jeej 68:b2dd7309da44 212 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 68:b2dd7309da44 213 PRINT(" - CUP max size: %d\r\n", rev.cup_max_size);
Jeej 68:b2dd7309da44 214 PRINT("-----------------------------------------\r\n");
Jeej 68:b2dd7309da44 215
Jeej 68:b2dd7309da44 216 if (MODEM_DEVICE_ID == rev.device_id)
Jeej 68:b2dd7309da44 217 {
Jeej 68:b2dd7309da44 218 // Check version
Jeej 68:b2dd7309da44 219 uint32_t rev_sum1 = (rev.fw_version.major << 24) | (rev.fw_version.minor << 16) | rev.fw_version.patch;
Jeej 68:b2dd7309da44 220 uint32_t rev_sum2 = (MODEM_VERSION_MAJOR << 24) | (MODEM_VERSION_MINOR << 16) | MODEM_VERSION_PATCH;
Jeej 68:b2dd7309da44 221 if (rev_sum1 < rev_sum2)
Jeej 68:b2dd7309da44 222 {
Jeej 68:b2dd7309da44 223 PRINT("\r\nYou need a modem at version %d.%d.%d or above to use this Driver.\r\n"
Jeej 68:b2dd7309da44 224 "You can:\r\n"
Jeej 68:b2dd7309da44 225 " - Check modem updates on the Dash7Board:\r\n"
Jeej 68:b2dd7309da44 226 " Go to your site's version manager.\r\n"
Jeej 68:b2dd7309da44 227 " - Check modem updates by importing:\r\n"
Jeej 68:b2dd7309da44 228 " https://developer.mbed.org/teams/WizziLab/code/D7A_WM_Updater\r\n"
Jeej 68:b2dd7309da44 229 " - Choose the right 'modem_ref_helper' revision.\r\n"
Jeej 68:b2dd7309da44 230 " Right click on modem_ref_helper -> Revision.\r\n"
Jeej 68:b2dd7309da44 231 , MODEM_VERSION_MAJOR, MODEM_VERSION_MINOR, MODEM_VERSION_PATCH);
Jeej 68:b2dd7309da44 232
Jeej 68:b2dd7309da44 233 ThisThread::sleep_for(osWaitForever);
Jeej 68:b2dd7309da44 234 }
Jeej 68:b2dd7309da44 235 }
Jeej 68:b2dd7309da44 236 else
Jeej 68:b2dd7309da44 237 {
Jeej 68:b2dd7309da44 238 // Do not check version
Jeej 68:b2dd7309da44 239 PRINT("/!\\ Not a modem firmware /!\\\r\n");
Jeej 68:b2dd7309da44 240 }
Jeej 68:b2dd7309da44 241
Jeej 68:b2dd7309da44 242 return 0;
Jeej 68:b2dd7309da44 243 }
Jeej 68:b2dd7309da44 244
Jeej 68:b2dd7309da44 245 int modem_close(void)
Jeej 68:b2dd7309da44 246 {
Jeej 68:b2dd7309da44 247 modem_ref_close();
Jeej 68:b2dd7309da44 248 delete g_modem_com;
Jeej 68:b2dd7309da44 249
Jeej 68:b2dd7309da44 250 return 0;
Jeej 68:b2dd7309da44 251 }
Jeej 68:b2dd7309da44 252
Jeej 68:b2dd7309da44 253
Jeej 68:b2dd7309da44 254 int modem_raw_alp(alp_pub_payload_t* alp)
Jeej 68:b2dd7309da44 255 {
Jeej 68:b2dd7309da44 256 uint8_t id = modem_ref_get_id(modem_cb);
Jeej 68:b2dd7309da44 257 int err = ALP_ERR_UNKNOWN;
Jeej 68:b2dd7309da44 258
Jeej 68:b2dd7309da44 259 // Setup LoRaWAN URCs
Jeej 68:b2dd7309da44 260 modem_ref_raw_alp(alp, id);
Jeej 68:b2dd7309da44 261 if (!MODEM_WAIT_RESP(g_ctx[id].s, MODEM_TIMEOUT)) { err = (int)g_ctx[id].err; }
Jeej 68:b2dd7309da44 262
Jeej 68:b2dd7309da44 263 modem_ref_free_id(id);
Jeej 68:b2dd7309da44 264
Jeej 68:b2dd7309da44 265 return err;
Jeej 68:b2dd7309da44 266 }
Jeej 68:b2dd7309da44 267
Jeej 68:b2dd7309da44 268 int modem_remote_raw_alp(void* itf, void *istatus, alp_pub_payload_t* alp)
Jeej 68:b2dd7309da44 269 {
Jeej 68:b2dd7309da44 270 uint8_t id = modem_ref_get_id(modem_cb);
Jeej 68:b2dd7309da44 271 int err = ALP_ERR_UNKNOWN;
Jeej 68:b2dd7309da44 272
Jeej 68:b2dd7309da44 273 // Setup LoRaWAN URCs
Jeej 68:b2dd7309da44 274 modem_ref_remote_raw_alp(itf, istatus, alp, id);
Jeej 68:b2dd7309da44 275 if (!MODEM_WAIT_RESP(g_ctx[id].s, MODEM_TIMEOUT)) { err = (int)g_ctx[id].err; }
Jeej 68:b2dd7309da44 276
Jeej 68:b2dd7309da44 277 modem_ref_free_id(id);
Jeej 68:b2dd7309da44 278
Jeej 68:b2dd7309da44 279 return err;
Jeej 68:b2dd7309da44 280 }
Jeej 68:b2dd7309da44 281
Jeej 68:b2dd7309da44 282 int modem_read_file(uint8_t fid, void *data, uint32_t offset, uint32_t length)
Jeej 68:b2dd7309da44 283 {
Jeej 68:b2dd7309da44 284 uint8_t id = modem_ref_get_id(modem_cb);
Jeej 68:b2dd7309da44 285 int err = ALP_ERR_UNKNOWN;
Jeej 68:b2dd7309da44 286
Jeej 68:b2dd7309da44 287 // Setup LoRaWAN URCs
Jeej 68:b2dd7309da44 288 modem_ref_read_file(fid, data, offset, length, id);
Jeej 68:b2dd7309da44 289 if (!MODEM_WAIT_RESP(g_ctx[id].s, MODEM_TIMEOUT)) { err = (int)g_ctx[id].err; }
Jeej 68:b2dd7309da44 290
Jeej 68:b2dd7309da44 291 modem_ref_free_id(id);
Jeej 68:b2dd7309da44 292
Jeej 68:b2dd7309da44 293 return err;
Jeej 68:b2dd7309da44 294 }
Jeej 68:b2dd7309da44 295
Jeej 68:b2dd7309da44 296 int modem_remote_read_file(uint8_t* itf, void *istatus, uint8_t fid, void *data, uint32_t offset, uint32_t length)
Jeej 68:b2dd7309da44 297 {
Jeej 68:b2dd7309da44 298 uint8_t id = modem_ref_get_id(modem_cb);
Jeej 68:b2dd7309da44 299 int err = ALP_ERR_UNKNOWN;
Jeej 68:b2dd7309da44 300
Jeej 68:b2dd7309da44 301 // Setup LoRaWAN URCs
Jeej 68:b2dd7309da44 302 modem_ref_remote_read_file(itf, istatus, fid, data, offset, length, id);
Jeej 68:b2dd7309da44 303 if (!MODEM_WAIT_RESP(g_ctx[id].s, MODEM_TIMEOUT)) { err = (int)g_ctx[id].err; }
Jeej 68:b2dd7309da44 304
Jeej 68:b2dd7309da44 305 modem_ref_free_id(id);
Jeej 68:b2dd7309da44 306
Jeej 68:b2dd7309da44 307 return err;
Jeej 68:b2dd7309da44 308 }
Jeej 68:b2dd7309da44 309
Jeej 68:b2dd7309da44 310 int modem_write_file(uint8_t fid, void *data, uint32_t offset, uint32_t length)
Jeej 68:b2dd7309da44 311 {
Jeej 68:b2dd7309da44 312 uint8_t id = modem_ref_get_id(modem_cb);
Jeej 68:b2dd7309da44 313 int err = ALP_ERR_UNKNOWN;
Jeej 68:b2dd7309da44 314
Jeej 68:b2dd7309da44 315 // Setup LoRaWAN URCs
Jeej 68:b2dd7309da44 316 modem_ref_write_file(fid, data, offset, length, id);
Jeej 68:b2dd7309da44 317 if (!MODEM_WAIT_RESP(g_ctx[id].s, MODEM_TIMEOUT)) { err = (int)g_ctx[id].err; }
Jeej 68:b2dd7309da44 318
Jeej 68:b2dd7309da44 319 modem_ref_free_id(id);
Jeej 68:b2dd7309da44 320
Jeej 68:b2dd7309da44 321 return err;
Jeej 68:b2dd7309da44 322 }
Jeej 68:b2dd7309da44 323
Jeej 68:b2dd7309da44 324 int modem_remote_write_file(uint8_t* itf, void *istatus , uint8_t fid, void *data, uint32_t offset, uint32_t length)
Jeej 68:b2dd7309da44 325 {
Jeej 68:b2dd7309da44 326 uint8_t id = modem_ref_get_id(modem_cb);
Jeej 68:b2dd7309da44 327 int err = ALP_ERR_UNKNOWN;
Jeej 68:b2dd7309da44 328
Jeej 68:b2dd7309da44 329 // Setup LoRaWAN URCs
Jeej 68:b2dd7309da44 330 modem_ref_remote_write_file(itf, istatus, fid, data, offset, length, id);
Jeej 68:b2dd7309da44 331 if (!MODEM_WAIT_RESP(g_ctx[id].s, MODEM_TIMEOUT)) { err = (int)g_ctx[id].err; }
Jeej 68:b2dd7309da44 332
Jeej 68:b2dd7309da44 333 modem_ref_free_id(id);
Jeej 68:b2dd7309da44 334
Jeej 68:b2dd7309da44 335 return err;
Jeej 68:b2dd7309da44 336 }
Jeej 68:b2dd7309da44 337
Jeej 68:b2dd7309da44 338 int modem_declare_file(uint8_t fid, alp_file_header_t* header)
Jeej 68:b2dd7309da44 339 {
Jeej 68:b2dd7309da44 340 uint8_t id = modem_ref_get_id(modem_cb);
Jeej 68:b2dd7309da44 341 int err = ALP_ERR_UNKNOWN;
Jeej 68:b2dd7309da44 342
Jeej 68:b2dd7309da44 343 // Setup LoRaWAN URCs
Jeej 68:b2dd7309da44 344 modem_ref_declare_file(fid, header, id);
Jeej 68:b2dd7309da44 345 if (!MODEM_WAIT_RESP(g_ctx[id].s, MODEM_TIMEOUT)) { err = (int)g_ctx[id].err; }
Jeej 68:b2dd7309da44 346
Jeej 68:b2dd7309da44 347 modem_ref_free_id(id);
Jeej 68:b2dd7309da44 348
Jeej 68:b2dd7309da44 349 return err;
Jeej 68:b2dd7309da44 350 }
Jeej 68:b2dd7309da44 351
Jeej 68:b2dd7309da44 352 int modem_d7a_enable_itf(void)
Jeej 68:b2dd7309da44 353 {
Jeej 68:b2dd7309da44 354 uint8_t id = modem_ref_get_id(modem_cb);
Jeej 68:b2dd7309da44 355 int err = ALP_ERR_UNKNOWN;
Jeej 68:b2dd7309da44 356
Jeej 68:b2dd7309da44 357 // Setup LoRaWAN URCs
Jeej 68:b2dd7309da44 358 modem_ref_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS | ALP_D7A_ISTAT_EOP, true, id);
Jeej 68:b2dd7309da44 359 if (!MODEM_WAIT_RESP(g_ctx[id].s, MODEM_TIMEOUT)) { err = (int)g_ctx[id].err; }
Jeej 68:b2dd7309da44 360
Jeej 68:b2dd7309da44 361 modem_ref_free_id(id);
Jeej 68:b2dd7309da44 362
Jeej 68:b2dd7309da44 363 return err;
Jeej 68:b2dd7309da44 364 }
Jeej 68:b2dd7309da44 365
Jeej 68:b2dd7309da44 366 int modem_d7a_disable_itf(void)
Jeej 68:b2dd7309da44 367 {
Jeej 68:b2dd7309da44 368 uint8_t id = modem_ref_get_id(modem_cb);
Jeej 68:b2dd7309da44 369 int err = ALP_ERR_UNKNOWN;
Jeej 68:b2dd7309da44 370
Jeej 68:b2dd7309da44 371 // Setup LoRaWAN URCs
Jeej 68:b2dd7309da44 372 modem_ref_activate_itf(ALP_ITF_TYPE_D7A, 0, 0, 0, false, id);
Jeej 68:b2dd7309da44 373 if (!MODEM_WAIT_RESP(g_ctx[id].s, MODEM_TIMEOUT)) { err = (int)g_ctx[id].err; }
Jeej 68:b2dd7309da44 374
Jeej 68:b2dd7309da44 375 modem_ref_free_id(id);
Jeej 68:b2dd7309da44 376
Jeej 68:b2dd7309da44 377 return err;
Jeej 68:b2dd7309da44 378 }
Jeej 68:b2dd7309da44 379
Jeej 68:b2dd7309da44 380 void modem_print_error(uint8_t itf, int8_t error)
Jeej 68:b2dd7309da44 381 {
Jeej 68:b2dd7309da44 382 if (ALP_ERR_ITF_START >= error && ALP_ERR_ITF_END < error)
Jeej 68:b2dd7309da44 383 {
Jeej 68:b2dd7309da44 384 error -= ALP_ERR_ITF_START;
Jeej 68:b2dd7309da44 385 // Interface specific error
Jeej 68:b2dd7309da44 386 if (ALP_ITF_TYPE_HOST == itf)
Jeej 68:b2dd7309da44 387 {
Jeej 68:b2dd7309da44 388 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 68:b2dd7309da44 389 }
Jeej 68:b2dd7309da44 390 else if (ALP_ITF_TYPE_COM == itf)
Jeej 68:b2dd7309da44 391 {
Jeej 68:b2dd7309da44 392 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 68:b2dd7309da44 393 }
Jeej 68:b2dd7309da44 394 else if (ALP_ITF_TYPE_D7A == itf)
Jeej 68:b2dd7309da44 395 {
Jeej 68:b2dd7309da44 396 PRINT("ITF[%02X] ", itf);
Jeej 68:b2dd7309da44 397 switch (error)
Jeej 68:b2dd7309da44 398 {
Jeej 68:b2dd7309da44 399 /// No error
Jeej 68:b2dd7309da44 400 case D7A_ERROR_NO: // = 0,
Jeej 68:b2dd7309da44 401 PRINT("D7A_ERROR_NO\r\n");
Jeej 68:b2dd7309da44 402 break;
Jeej 68:b2dd7309da44 403 /// Resource busy
Jeej 68:b2dd7309da44 404 case D7A_ERROR_BUSY: // = -1,
Jeej 68:b2dd7309da44 405 PRINT("D7A_ERROR_BUSY\r\n");
Jeej 68:b2dd7309da44 406 break;
Jeej 68:b2dd7309da44 407 /// Bad parameter
Jeej 68:b2dd7309da44 408 case D7A_ERROR_BAD_PARAM: // = -2,
Jeej 68:b2dd7309da44 409 PRINT("D7A_ERROR_BAD_PARAM\r\n");
Jeej 68:b2dd7309da44 410 break;
Jeej 68:b2dd7309da44 411 /// Duty cycle limit overflow
Jeej 68:b2dd7309da44 412 case D7A_ERROR_DUTY_CYCLE: // = -3,
Jeej 68:b2dd7309da44 413 PRINT("D7A_ERROR_DUTY_CYCLE\r\n");
Jeej 68:b2dd7309da44 414 break;
Jeej 68:b2dd7309da44 415 /// CCA timeout
Jeej 68:b2dd7309da44 416 case D7A_ERROR_CCA_TO: // = -4,
Jeej 68:b2dd7309da44 417 PRINT("D7A_ERROR_CCA_TO\r\n");
Jeej 68:b2dd7309da44 418 break;
Jeej 68:b2dd7309da44 419 /// Security frame counter overflow
Jeej 68:b2dd7309da44 420 case D7A_ERROR_NLS_KEY: // = -5,
Jeej 68:b2dd7309da44 421 PRINT("D7A_ERROR_NLS_KEY\r\n");
Jeej 68:b2dd7309da44 422 break;
Jeej 68:b2dd7309da44 423 /// TX stream underflow
Jeej 68:b2dd7309da44 424 case D7A_ERROR_TX_UDF: // = -6,
Jeej 68:b2dd7309da44 425 PRINT("D7A_ERROR_TX_UDF\r\n");
Jeej 68:b2dd7309da44 426 break;
Jeej 68:b2dd7309da44 427 /// RX stream overflow
Jeej 68:b2dd7309da44 428 case D7A_ERROR_RX_OVF: // = -7,
Jeej 68:b2dd7309da44 429 PRINT("D7A_ERROR_RX_OVF\r\n");
Jeej 68:b2dd7309da44 430 break;
Jeej 68:b2dd7309da44 431 /// RX checksum
Jeej 68:b2dd7309da44 432 case D7A_ERROR_RX_CRC: // = -8,
Jeej 68:b2dd7309da44 433 PRINT("D7A_ERROR_RX_CRC\r\n");
Jeej 68:b2dd7309da44 434 break;
Jeej 68:b2dd7309da44 435 /// Abort
Jeej 68:b2dd7309da44 436 case D7A_ERROR_ABORT: // = -9,
Jeej 68:b2dd7309da44 437 PRINT("D7A_ERROR_ABORT\r\n");
Jeej 68:b2dd7309da44 438 break;
Jeej 68:b2dd7309da44 439 /// No ACK received
Jeej 68:b2dd7309da44 440 case D7A_ERROR_NO_ACK: // = -10,
Jeej 68:b2dd7309da44 441 PRINT("D7A_ERROR_NO_ACK\r\n");
Jeej 68:b2dd7309da44 442 break;
Jeej 68:b2dd7309da44 443 /// RX timeout
Jeej 68:b2dd7309da44 444 case D7A_ERROR_RX_TO: // = -11,
Jeej 68:b2dd7309da44 445 PRINT("D7A_ERROR_RX_TO\r\n");
Jeej 68:b2dd7309da44 446 break;
Jeej 68:b2dd7309da44 447 default:
Jeej 68:b2dd7309da44 448 PRINT("Unknown Error %d\r\n", error);
Jeej 68:b2dd7309da44 449 break;
Jeej 68:b2dd7309da44 450 }
Jeej 68:b2dd7309da44 451 }
Jeej 68:b2dd7309da44 452 else if (ALP_ITF_TYPE_LWAN == itf)
Jeej 68:b2dd7309da44 453 {
Jeej 68:b2dd7309da44 454 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 68:b2dd7309da44 455 }
Jeej 68:b2dd7309da44 456 else
Jeej 68:b2dd7309da44 457 {
Jeej 68:b2dd7309da44 458 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 68:b2dd7309da44 459 }
Jeej 68:b2dd7309da44 460 }
Jeej 68:b2dd7309da44 461 else
Jeej 68:b2dd7309da44 462 {
Jeej 68:b2dd7309da44 463 PRINT("ALP: ");
Jeej 68:b2dd7309da44 464 switch (error)
Jeej 68:b2dd7309da44 465 {
Jeej 68:b2dd7309da44 466 // Not really errors, more like status
Jeej 68:b2dd7309da44 467 case ALP_ERR_ITF_FULL: // 0x02: For interfaces supporting buffering, indicates buffer reached maximum capacity (no data loss)
Jeej 68:b2dd7309da44 468 PRINT("ALP_ERR_ITF_FULL\r\n");
Jeej 68:b2dd7309da44 469 break;
Jeej 68:b2dd7309da44 470 case ALP_ERR_PARTIAL_COMPLETION: // 0x01: Action received and partially completed at response. To be completed after response
Jeej 68:b2dd7309da44 471 PRINT("ALP_ERR_PARTIAL_COMPLETION\r\n");
Jeej 68:b2dd7309da44 472 break;
Jeej 68:b2dd7309da44 473
Jeej 68:b2dd7309da44 474 // ALP Errors
Jeej 68:b2dd7309da44 475 case ALP_ERR_NONE: // 0x00: Action completed (OK)
Jeej 68:b2dd7309da44 476 PRINT("ALP_ERR_NONE\r\n");
Jeej 68:b2dd7309da44 477 break;
Jeej 68:b2dd7309da44 478 case ALP_ERR_FILE_NOT_FOUND: // 0xFF: Error access file: File ID does not exist
Jeej 68:b2dd7309da44 479 PRINT("ALP_ERR_FILE_NOT_FOUND\r\n");
Jeej 68:b2dd7309da44 480 break;
Jeej 68:b2dd7309da44 481 case ALP_ERR_FILE_EXIST: // 0xFE: Error create file: File ID already exists
Jeej 68:b2dd7309da44 482 PRINT("ALP_ERR_FILE_EXIST\r\n");
Jeej 68:b2dd7309da44 483 break;
Jeej 68:b2dd7309da44 484 case ALP_ERR_FILE_NOT_RESTORABLE: // 0xFD: Error restore file: File is not restorable
Jeej 68:b2dd7309da44 485 PRINT("ALP_ERR_FILE_NOT_RESTORABLEr\n");
Jeej 68:b2dd7309da44 486 break;
Jeej 68:b2dd7309da44 487 case ALP_ERR_PERMISSION_DENIED: // 0xFC: Error access file: Insufficient permissions
Jeej 68:b2dd7309da44 488 PRINT("ALP_ERR_PERMISSION_DENIED\r\n");
Jeej 68:b2dd7309da44 489 break;
Jeej 68:b2dd7309da44 490 case ALP_ERR_LENGTH_OVERFLOW: // 0xFB: Error create file: Supplied length (in header) is beyond file limits
Jeej 68:b2dd7309da44 491 PRINT("ALP_ERR_LENGTH_OVERFLOW\r\n");
Jeej 68:b2dd7309da44 492 break;
Jeej 68:b2dd7309da44 493 case ALP_ERR_ALLOC_OVERFLOW: // 0xFA: Error create file: Supplied allocation (in header) is beyond file limits
Jeej 68:b2dd7309da44 494 PRINT("ALP_ERR_ALLOC_OVERFLOW\r\n");
Jeej 68:b2dd7309da44 495 break;
Jeej 68:b2dd7309da44 496 case ALP_ERR_OFFSET_OVERFLOW: // 0xF9: Error write: Supplied start offset is out of bounds of file allocation
Jeej 68:b2dd7309da44 497 PRINT("ALP_ERR_OFFSET_OVERFLOW\r\n");
Jeej 68:b2dd7309da44 498 break;
Jeej 68:b2dd7309da44 499 case ALP_ERR_WRITE_OVERFLOW: // 0xF8: Error complete write: Supplied data goes beyond file allocation
Jeej 68:b2dd7309da44 500 PRINT("ALP_ERR_WRITE_OVERFLOW\r\n");
Jeej 68:b2dd7309da44 501 break;
Jeej 68:b2dd7309da44 502 case ALP_ERR_WRITE_ERROR: // 0xF7: Error write: impossible to write in storage location
Jeej 68:b2dd7309da44 503 PRINT("ALP_ERR_WRITE_ERROR\r\n");
Jeej 68:b2dd7309da44 504 break;
Jeej 68:b2dd7309da44 505 case ALP_ERR_OPERATION_UNKNOWN: // 0xF6: Error unknown Operation
Jeej 68:b2dd7309da44 506 PRINT("ALP_ERR_OPERATION_UNKNOWN\r\n");
Jeej 68:b2dd7309da44 507 break;
Jeej 68:b2dd7309da44 508 case ALP_ERR_OPERAND_INCOMPLETE: // 0xF5: Error incomplete Operand
Jeej 68:b2dd7309da44 509 PRINT("ALP_ERR_OPERAND_INCOMPLETE\r\n");
Jeej 68:b2dd7309da44 510 break;
Jeej 68:b2dd7309da44 511 case ALP_ERR_OPERAND_WRONG_FORMAT: // 0xF4: Error wrong Operand format
Jeej 68:b2dd7309da44 512 PRINT("ALP_ERR_OPERAND_WRONG_FORMAT\r\n");
Jeej 68:b2dd7309da44 513 break;
Jeej 68:b2dd7309da44 514 case ALP_ERR_ITF_INVALID: // 0xF3: Error invalid interface
Jeej 68:b2dd7309da44 515 PRINT("ALP_ERR_ITF_INVALID\r\n");
Jeej 68:b2dd7309da44 516 break;
Jeej 68:b2dd7309da44 517 case ALP_ERR_ITF_OVERFLOW: // 0xF2: Error interface overflown (i.e. resources exhausted, buffer full with data discarded)
Jeej 68:b2dd7309da44 518 PRINT("ALP_ERR_ITF_OVERFLOW\r\n");
Jeej 68:b2dd7309da44 519 break;
Jeej 68:b2dd7309da44 520 case ALP_ERR_QUERY_FAIL: // 0xF1: (Group of) Query result was false (Informative error code).
Jeej 68:b2dd7309da44 521 PRINT("ALP_ERR_QUERY_FAIL\r\n");
Jeej 68:b2dd7309da44 522 break;
Jeej 68:b2dd7309da44 523 case ALP_ERR_ITF_NOT_SPECIFIED:
Jeej 68:b2dd7309da44 524 PRINT("ALP_ERR_ITF_NOT_SPECIFIED\r\n");
Jeej 68:b2dd7309da44 525 break;
Jeej 68:b2dd7309da44 526
Jeej 68:b2dd7309da44 527 // Other Errors
Jeej 68:b2dd7309da44 528 case ALP_ERR_UNKNOWN: // 0x80: Unknown error
Jeej 68:b2dd7309da44 529 PRINT("ALP_ERR_UNKNOWN\r\n");
Jeej 68:b2dd7309da44 530 break;
Jeej 68:b2dd7309da44 531 case ALP_ERR_FS_TIMEOUT: // 0x81: Internal FS Error
Jeej 68:b2dd7309da44 532 PRINT("ALP_ERR_FS_TIMEOUT\r\n");
Jeej 68:b2dd7309da44 533 break;
Jeej 68:b2dd7309da44 534 case ALP_ERR_ITF_UNKNOWN: // 0x82: Unknown Interface
Jeej 68:b2dd7309da44 535 PRINT("ALP_ERR_ITF_UNKNOWN\r\n");
Jeej 68:b2dd7309da44 536 break;
Jeej 68:b2dd7309da44 537 case ALP_ERR_ITF_TIMEOUT: // 0x83: Internal ITF Error
Jeej 68:b2dd7309da44 538 PRINT("ALP_ERR_ITF_TIMEOUT\r\n");
Jeej 68:b2dd7309da44 539 break;
Jeej 68:b2dd7309da44 540 default:
Jeej 68:b2dd7309da44 541 PRINT("Unknown Error %d\r\n", error);
Jeej 68:b2dd7309da44 542 break;
Jeej 68:b2dd7309da44 543 }
Jeej 68:b2dd7309da44 544 }
Jeej 68:b2dd7309da44 545 }
Jeej 68:b2dd7309da44 546