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

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);
+}