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
- Committer:
- Jeej
- Date:
- 2017-08-23
- Revision:
- 5:1033c7bebc15
- Parent:
- 3:fae784cae93d
- Child:
- 7:7292fa2ed6e4
File content as of revision 5:1033c7bebc15:
#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; } } int my_alp_itf_d7a_cfg_size(d7a_sp_cfg_t* cfg) { int size = sizeof(d7a_sp_cfg_t) - sizeof(d7a_addressee_t); size += D7A_ADDR_LEN(cfg->addressee.ctrl); return size; } // ============================================================}}} // Serial adapters to WizziLab's own architecture // ============================================================{{{ static void modem_serial_input(WizziCom* com, WizziComPacket_t* pkt) { modem_input(wizzicom_type_to_flow(pkt->type), pkt->data, pkt->length); FREE(pkt); } static int modem_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, true, 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 modem_serial_input g_modem_com->attach(modem_serial_input, WizziComPacketUntreated); // Open driver modem_open(modem_serial_send, callbacks); uint8_t user_id = modem_get_id(my_main_callback); HELPER_PRINT("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(" - CUP max size: %d\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); }