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 May 17 16:02:05 2017 +0000
Revision:
0:e9dd36a15d07
Child:
1:0ec0bae00588
Helper library to use modem_ref driver.

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 0:e9dd36a15d07 9 static WizziCom* g_modem_com;
Jeej 0:e9dd36a15d07 10 static Semaphore g_modem_ready[MAX_USER_NB];
Jeej 0:e9dd36a15d07 11
Jeej 0:e9dd36a15d07 12 static void modem_print_status(int status)
Jeej 0:e9dd36a15d07 13 {
Jeej 0:e9dd36a15d07 14 switch (status)
Jeej 0:e9dd36a15d07 15 {
Jeej 0:e9dd36a15d07 16 case ALP_ERR_NONE:
Jeej 0:e9dd36a15d07 17 HELPER_PRINT("Status: OK\n");
Jeej 0:e9dd36a15d07 18 break;
Jeej 0:e9dd36a15d07 19 default:
Jeej 0:e9dd36a15d07 20 HELPER_PRINT("Status: error %d\n", status);
Jeej 0:e9dd36a15d07 21 break;
Jeej 0:e9dd36a15d07 22 }
Jeej 0:e9dd36a15d07 23 }
Jeej 0:e9dd36a15d07 24
Jeej 0:e9dd36a15d07 25 static void modem_print_resp(int status)
Jeej 0:e9dd36a15d07 26 {
Jeej 0:e9dd36a15d07 27 switch (status)
Jeej 0:e9dd36a15d07 28 {
Jeej 0:e9dd36a15d07 29 case ALP_ERR_NONE:
Jeej 0:e9dd36a15d07 30 HELPER_PRINT("Resp: OK\n");
Jeej 0:e9dd36a15d07 31 break;
Jeej 0:e9dd36a15d07 32 case ALP_ERR_FILE_EXIST:
Jeej 0:e9dd36a15d07 33 HELPER_PRINT("Resp: Already registered\n");
Jeej 0:e9dd36a15d07 34 break;
Jeej 0:e9dd36a15d07 35 default:
Jeej 0:e9dd36a15d07 36 HELPER_PRINT("Resp: error %d\n", status);
Jeej 0:e9dd36a15d07 37 break;
Jeej 0:e9dd36a15d07 38 }
Jeej 0:e9dd36a15d07 39 }
Jeej 0:e9dd36a15d07 40
Jeej 0:e9dd36a15d07 41 // ============================================================}}}
Jeej 0:e9dd36a15d07 42
Jeej 0:e9dd36a15d07 43 // Serial adapters to WizziLab's own architecture
Jeej 0:e9dd36a15d07 44 // ============================================================{{{
Jeej 0:e9dd36a15d07 45
Jeej 0:e9dd36a15d07 46 static void my_serial_input(WizziCom* com, WizziComPacket_t* pkt)
Jeej 0:e9dd36a15d07 47 {
Jeej 0:e9dd36a15d07 48 modem_input(wizzicom_type_to_flow(pkt->type), pkt->data, pkt->length);
Jeej 0:e9dd36a15d07 49 FREE(pkt);
Jeej 0:e9dd36a15d07 50 }
Jeej 0:e9dd36a15d07 51
Jeej 0:e9dd36a15d07 52 static int my_serial_send(uint8_t* data1, uint8_t size1, uint8_t* data2, uint8_t size2)
Jeej 0:e9dd36a15d07 53 {
Jeej 0:e9dd36a15d07 54 (void)size1;
Jeej 0:e9dd36a15d07 55
Jeej 0:e9dd36a15d07 56 // Retrieve Flow ID from header and send packet
Jeej 0:e9dd36a15d07 57 g_modem_com->send((WizziComPacketType)wizzicom_flow_to_type(data1[4]), size2, data2);
Jeej 0:e9dd36a15d07 58
Jeej 0:e9dd36a15d07 59 return (size1 + size2);
Jeej 0:e9dd36a15d07 60 }
Jeej 0:e9dd36a15d07 61
Jeej 0:e9dd36a15d07 62 // Callback for user_id User
Jeej 0:e9dd36a15d07 63 static void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:e9dd36a15d07 64 {
Jeej 0:e9dd36a15d07 65 (void)id;
Jeej 0:e9dd36a15d07 66
Jeej 0:e9dd36a15d07 67 if (terminal)
Jeej 0:e9dd36a15d07 68 {
Jeej 0:e9dd36a15d07 69 modem_print_status(err);
Jeej 0:e9dd36a15d07 70 g_modem_ready[id].release();
Jeej 0:e9dd36a15d07 71 }
Jeej 0:e9dd36a15d07 72 else
Jeej 0:e9dd36a15d07 73 {
Jeej 0:e9dd36a15d07 74 modem_print_resp(err);
Jeej 0:e9dd36a15d07 75 }
Jeej 0:e9dd36a15d07 76 }
Jeej 0:e9dd36a15d07 77
Jeej 0:e9dd36a15d07 78 // Misc
Jeej 0:e9dd36a15d07 79 // ============================================================{{{
Jeej 0:e9dd36a15d07 80
Jeej 0:e9dd36a15d07 81 void modem_update_file(uint8_t fid, alp_file_header_t* header, uint8_t* data)
Jeej 0:e9dd36a15d07 82 {
Jeej 0:e9dd36a15d07 83 alp_file_header_t remote_header;
Jeej 0:e9dd36a15d07 84 uint8_t user_id = modem_get_id(my_main_callback);
Jeej 0:e9dd36a15d07 85
Jeej 0:e9dd36a15d07 86 memset(&remote_header, 0, sizeof(alp_file_header_t));
Jeej 0:e9dd36a15d07 87
Jeej 0:e9dd36a15d07 88 // Read remote header
Jeej 0:e9dd36a15d07 89 modem_read_fprop(fid, &remote_header, user_id);
Jeej 0:e9dd36a15d07 90 g_modem_ready[user_id].wait();
Jeej 0:e9dd36a15d07 91
Jeej 0:e9dd36a15d07 92 // Add file in local file system
Jeej 0:e9dd36a15d07 93 ram_fs_new(fid, (uint8_t*)header, data);
Jeej 0:e9dd36a15d07 94
Jeej 0:e9dd36a15d07 95 // Update file
Jeej 0:e9dd36a15d07 96 if (memcmp(&remote_header, header, sizeof(alp_file_header_t)))
Jeej 0:e9dd36a15d07 97 {
Jeej 0:e9dd36a15d07 98 HELPER_PRINT("Updating file %d\n", fid);
Jeej 0:e9dd36a15d07 99 // Delete
Jeej 0:e9dd36a15d07 100 modem_delete_file(fid, user_id);
Jeej 0:e9dd36a15d07 101 g_modem_ready[user_id].wait();
Jeej 0:e9dd36a15d07 102 // Restore in local file system
Jeej 0:e9dd36a15d07 103 ram_fs_new(fid, (uint8_t*)header, data);
Jeej 0:e9dd36a15d07 104 // Re-create
Jeej 0:e9dd36a15d07 105 if (data)
Jeej 0:e9dd36a15d07 106 {
Jeej 0:e9dd36a15d07 107 modem_declare_file(fid, header, user_id);
Jeej 0:e9dd36a15d07 108 }
Jeej 0:e9dd36a15d07 109 else
Jeej 0:e9dd36a15d07 110 {
Jeej 0:e9dd36a15d07 111 modem_create_file(fid, header, user_id);
Jeej 0:e9dd36a15d07 112 }
Jeej 0:e9dd36a15d07 113 g_modem_ready[user_id].wait();
Jeej 0:e9dd36a15d07 114 }
Jeej 0:e9dd36a15d07 115 else
Jeej 0:e9dd36a15d07 116 {
Jeej 0:e9dd36a15d07 117 HELPER_PRINT("File %d up to date\n", fid);
Jeej 0:e9dd36a15d07 118 }
Jeej 0:e9dd36a15d07 119
Jeej 0:e9dd36a15d07 120 modem_free_id(user_id);
Jeej 0:e9dd36a15d07 121 }
Jeej 0:e9dd36a15d07 122
Jeej 0:e9dd36a15d07 123 void modem_helper_open(modem_callbacks_t* callbacks)
Jeej 0:e9dd36a15d07 124 {
Jeej 0:e9dd36a15d07 125 static union {
Jeej 0:e9dd36a15d07 126 uint8_t b[8];
Jeej 0:e9dd36a15d07 127 uint32_t w[2];
Jeej 0:e9dd36a15d07 128 } uid;
Jeej 0:e9dd36a15d07 129 revision_t rev;
Jeej 0:e9dd36a15d07 130
Jeej 0:e9dd36a15d07 131 // Hardware reset
Jeej 0:e9dd36a15d07 132 DigitalOut reset_low(MODEM_PIN_RESET, 0);
Jeej 0:e9dd36a15d07 133 Thread::wait(100);
Jeej 0:e9dd36a15d07 134
Jeej 0:e9dd36a15d07 135 // Release reset
Jeej 0:e9dd36a15d07 136 DigitalIn reset_release(MODEM_PIN_RESET);
Jeej 0:e9dd36a15d07 137 Thread::wait(2000);
Jeej 0:e9dd36a15d07 138
Jeej 0:e9dd36a15d07 139 // Open modem Com port
Jeej 0:e9dd36a15d07 140 g_modem_com = new WizziCom(MODEM_PIN_TX, MODEM_PIN_RX, MODEM_PIN_IRQ_OUT, MODEM_PIN_IRQ_IN);
Jeej 0:e9dd36a15d07 141
Jeej 0:e9dd36a15d07 142 // Redirect All Port traffic to my_serial_input
Jeej 0:e9dd36a15d07 143 g_modem_com->attach(my_serial_input, WizziComPacketOther);
Jeej 0:e9dd36a15d07 144
Jeej 0:e9dd36a15d07 145 // Open driver
Jeej 0:e9dd36a15d07 146 modem_open(my_serial_send, callbacks);
Jeej 0:e9dd36a15d07 147
Jeej 0:e9dd36a15d07 148 uint8_t user_id = modem_get_id(my_main_callback);
Jeej 0:e9dd36a15d07 149
Jeej 0:e9dd36a15d07 150 DPRINT("Start Modem Process (id=%d)\n", user_id);
Jeej 0:e9dd36a15d07 151 Thread::wait(1000);
Jeej 0:e9dd36a15d07 152
Jeej 0:e9dd36a15d07 153 modem_read_file(D7A_FID_UID, uid.b, 0, 8, user_id);
Jeej 0:e9dd36a15d07 154 g_modem_ready[user_id].wait();
Jeej 0:e9dd36a15d07 155
Jeej 0:e9dd36a15d07 156 modem_read_file(D7A_FID_FIRMWARE_VERSION, (uint8_t*)&rev, 0, sizeof(revision_t), user_id);
Jeej 0:e9dd36a15d07 157 g_modem_ready[user_id].wait();
Jeej 0:e9dd36a15d07 158
Jeej 0:e9dd36a15d07 159 PRINT("------------ D7A Modem infos ------------\r\n");
Jeej 0:e9dd36a15d07 160 PRINT_DATA(" - UID: ", "%02X", uid.b, 8, "\r\n");
Jeej 0:e9dd36a15d07 161 PRINT(" - Manufacturer ID: %08X\r\n", rev.manufacturer_id);
Jeej 0:e9dd36a15d07 162 PRINT(" - Device ID: %08X\r\n", rev.device_id);
Jeej 0:e9dd36a15d07 163 PRINT(" - Hardware version: %08X\r\n", rev.hw_version);
Jeej 0:e9dd36a15d07 164 PRINT(" - Firmware version: v%d.%d.%d\r\n", rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch);
Jeej 0:e9dd36a15d07 165 PRINT(" - File system CRC: 0x%08x\r\n", rev.fs_crc);
Jeej 0:e9dd36a15d07 166 PRINT("-----------------------------------------\r\n");
Jeej 0:e9dd36a15d07 167
Jeej 0:e9dd36a15d07 168 // Check version
Jeej 0:e9dd36a15d07 169 if (rev.fw_version.major != MODEM_VERSION_MAJOR || rev.fw_version.minor != MODEM_VERSION_MINOR)
Jeej 0:e9dd36a15d07 170 {
Jeej 0:e9dd36a15d07 171 PRINT("You need a modem at version %d.%d.x to use this APP.\n"
Jeej 0:e9dd36a15d07 172 "Please check updates by importing:\n"
Jeej 0:e9dd36a15d07 173 "https://developer.mbed.org/teams/WizziLab/code/D7A_WM_Updater\n"
Jeej 0:e9dd36a15d07 174 , MODEM_VERSION_MAJOR, MODEM_VERSION_MINOR);
Jeej 0:e9dd36a15d07 175 Thread::wait(osWaitForever);
Jeej 0:e9dd36a15d07 176 }
Jeej 0:e9dd36a15d07 177
Jeej 0:e9dd36a15d07 178 modem_free_id(user_id);
Jeej 0:e9dd36a15d07 179 }