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
Diff: modem_ref_helper.cpp
- Revision:
- 0:e9dd36a15d07
- Child:
- 1:0ec0bae00588
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modem_ref_helper.cpp Wed May 17 16:02:05 2017 +0000 @@ -0,0 +1,179 @@ +#include "modem_ref_helper.h" + +#if 0 + #define HELPER_PRINT(...) PRINT(__VA_ARGS__) +#else + #define HELPER_PRINT(...); +#endif + +static WizziCom* g_modem_com; +static Semaphore g_modem_ready[MAX_USER_NB]; + +static void modem_print_status(int status) +{ + switch (status) + { + case ALP_ERR_NONE: + HELPER_PRINT("Status: OK\n"); + break; + default: + HELPER_PRINT("Status: error %d\n", status); + break; + } +} + +static void modem_print_resp(int status) +{ + switch (status) + { + case ALP_ERR_NONE: + HELPER_PRINT("Resp: OK\n"); + break; + case ALP_ERR_FILE_EXIST: + HELPER_PRINT("Resp: Already registered\n"); + break; + default: + HELPER_PRINT("Resp: error %d\n", status); + break; + } +} + +// ============================================================}}} + +// Serial adapters to WizziLab's own architecture +// ============================================================{{{ + +static void my_serial_input(WizziCom* com, WizziComPacket_t* pkt) +{ + modem_input(wizzicom_type_to_flow(pkt->type), pkt->data, pkt->length); + FREE(pkt); +} + +static int my_serial_send(uint8_t* data1, uint8_t size1, uint8_t* data2, uint8_t size2) +{ + (void)size1; + + // Retrieve Flow ID from header and send packet + g_modem_com->send((WizziComPacketType)wizzicom_flow_to_type(data1[4]), size2, data2); + + return (size1 + size2); +} + +// Callback for user_id User +static void my_main_callback(uint8_t terminal, int8_t err, uint8_t id) +{ + (void)id; + + if (terminal) + { + modem_print_status(err); + g_modem_ready[id].release(); + } + else + { + modem_print_resp(err); + } +} + +// Misc +// ============================================================{{{ + +void modem_update_file(uint8_t fid, alp_file_header_t* header, uint8_t* data) +{ + alp_file_header_t remote_header; + uint8_t user_id = modem_get_id(my_main_callback); + + memset(&remote_header, 0, sizeof(alp_file_header_t)); + + // Read remote header + modem_read_fprop(fid, &remote_header, user_id); + g_modem_ready[user_id].wait(); + + // Add file in local file system + ram_fs_new(fid, (uint8_t*)header, data); + + // Update file + if (memcmp(&remote_header, header, sizeof(alp_file_header_t))) + { + HELPER_PRINT("Updating file %d\n", fid); + // Delete + modem_delete_file(fid, user_id); + g_modem_ready[user_id].wait(); + // Restore in local file system + ram_fs_new(fid, (uint8_t*)header, data); + // Re-create + if (data) + { + modem_declare_file(fid, header, user_id); + } + else + { + modem_create_file(fid, header, user_id); + } + g_modem_ready[user_id].wait(); + } + else + { + HELPER_PRINT("File %d up to date\n", fid); + } + + modem_free_id(user_id); +} + +void modem_helper_open(modem_callbacks_t* callbacks) +{ + static union { + uint8_t b[8]; + uint32_t w[2]; + } uid; + revision_t rev; + + // Hardware reset + DigitalOut reset_low(MODEM_PIN_RESET, 0); + Thread::wait(100); + + // Release reset + DigitalIn reset_release(MODEM_PIN_RESET); + Thread::wait(2000); + + // Open modem Com port + g_modem_com = new WizziCom(MODEM_PIN_TX, MODEM_PIN_RX, MODEM_PIN_IRQ_OUT, MODEM_PIN_IRQ_IN); + + // Redirect All Port traffic to my_serial_input + g_modem_com->attach(my_serial_input, WizziComPacketOther); + + // Open driver + modem_open(my_serial_send, callbacks); + + uint8_t user_id = modem_get_id(my_main_callback); + + DPRINT("Start Modem Process (id=%d)\n", user_id); + Thread::wait(1000); + + modem_read_file(D7A_FID_UID, uid.b, 0, 8, user_id); + g_modem_ready[user_id].wait(); + + modem_read_file(D7A_FID_FIRMWARE_VERSION, (uint8_t*)&rev, 0, sizeof(revision_t), user_id); + g_modem_ready[user_id].wait(); + + PRINT("------------ D7A Modem infos ------------\r\n"); + PRINT_DATA(" - UID: ", "%02X", uid.b, 8, "\r\n"); + PRINT(" - Manufacturer ID: %08X\r\n", rev.manufacturer_id); + PRINT(" - Device ID: %08X\r\n", rev.device_id); + PRINT(" - Hardware version: %08X\r\n", rev.hw_version); + PRINT(" - Firmware version: v%d.%d.%d\r\n", rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch); + PRINT(" - File system CRC: 0x%08x\r\n", rev.fs_crc); + PRINT("-----------------------------------------\r\n"); + + // Check version + if (rev.fw_version.major != MODEM_VERSION_MAJOR || rev.fw_version.minor != MODEM_VERSION_MINOR) + { + PRINT("You need a modem at version %d.%d.x to use this APP.\n" + "Please check updates by importing:\n" + "https://developer.mbed.org/teams/WizziLab/code/D7A_WM_Updater\n" + , MODEM_VERSION_MAJOR, MODEM_VERSION_MINOR); + Thread::wait(osWaitForever); + } + + modem_free_id(user_id); +}