Data reception demo.

Dependencies:   modem_ref_helper CRC

Committer:
Jeej
Date:
Thu Sep 20 11:21:55 2018 +0000
Revision:
9:72a15235e097
Parent:
7:84dc04f88c94
Child:
10:c262c5feac24
Updated libraries and APP for modem v5.2+

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:02418479dcf7 1 // @autor: jeremie@wizzilab.com
Jeej 0:02418479dcf7 2 // @date: 2017-05-02
Jeej 0:02418479dcf7 3
Jeej 4:854f22f7962b 4 #include "modem_ref_helper.h"
Jeej 0:02418479dcf7 5 #include "modem_callbacks.h"
Jeej 4:854f22f7962b 6 #include "files.h"
Jeej 1:55636c88cd5e 7 #include "CriusOLED.h"
Jeej 1:55636c88cd5e 8
Jeej 2:6652be2d061f 9 #define RESTORE_TIME 30
Jeej 2:6652be2d061f 10 #define KEEP_ALIVE 3600
Jeej 6:2f0eb7aac143 11 #define MIN_REPORT_PERIOD (10) // Seconds
Jeej 1:55636c88cd5e 12
Jeej 0:02418479dcf7 13 Semaphore modem_ready(0);
Jeej 0:02418479dcf7 14 Queue<void, 8> g_file_modified;
Jeej 0:02418479dcf7 15
Jeej 9:72a15235e097 16 uint8_t id;
Jeej 2:6652be2d061f 17 uint32_t g_restore_time = RESTORE_TIME + 1;
Jeej 1:55636c88cd5e 18
Jeej 1:55636c88cd5e 19 void display_logo(void)
Jeej 1:55636c88cd5e 20 {
Jeej 1:55636c88cd5e 21 clear_display();
Jeej 1:55636c88cd5e 22 sendImage();
Jeej 1:55636c88cd5e 23 }
Jeej 1:55636c88cd5e 24
Jeej 9:72a15235e097 25 void print_status(uint8_t id, int status)
Jeej 9:72a15235e097 26 {
Jeej 9:72a15235e097 27 switch (status)
Jeej 9:72a15235e097 28 {
Jeej 9:72a15235e097 29 case ALP_ERR_NONE:
Jeej 9:72a15235e097 30 PRINT("Status[%d]: OK\n", id);
Jeej 9:72a15235e097 31 break;
Jeej 9:72a15235e097 32 default:
Jeej 9:72a15235e097 33 PRINT("Status[%d]: error %d\n", id, status);
Jeej 9:72a15235e097 34 break;
Jeej 9:72a15235e097 35 }
Jeej 9:72a15235e097 36 }
Jeej 9:72a15235e097 37
Jeej 9:72a15235e097 38 static void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 9:72a15235e097 39 {
Jeej 9:72a15235e097 40 (void)id;
Jeej 9:72a15235e097 41
Jeej 9:72a15235e097 42 print_status(id, err);
Jeej 9:72a15235e097 43
Jeej 9:72a15235e097 44 if (terminal)
Jeej 9:72a15235e097 45 {
Jeej 9:72a15235e097 46 modem_ready.release();
Jeej 9:72a15235e097 47 }
Jeej 9:72a15235e097 48 }
Jeej 9:72a15235e097 49
Jeej 1:55636c88cd5e 50 void thread_reset_display()
Jeej 1:55636c88cd5e 51 {
Jeej 3:e9ea4d325c01 52 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 2:6652be2d061f 53
Jeej 3:e9ea4d325c01 54 uint32_t time = 0;
Jeej 3:e9ea4d325c01 55 uint8_t status = 0;
Jeej 9:72a15235e097 56 uint8_t id = modem_get_id(my_main_callback);
Jeej 3:e9ea4d325c01 57
Jeej 1:55636c88cd5e 58 while (true)
Jeej 1:55636c88cd5e 59 {
Jeej 2:6652be2d061f 60 if (g_restore_time++ == RESTORE_TIME)
Jeej 1:55636c88cd5e 61 {
Jeej 1:55636c88cd5e 62 display_logo();
Jeej 1:55636c88cd5e 63 }
Jeej 3:e9ea4d325c01 64
Jeej 3:e9ea4d325c01 65 if ((time++ % KEEP_ALIVE) == 0)
Jeej 2:6652be2d061f 66 {
Jeej 3:e9ea4d325c01 67 // Keep alive: Report status
Jeej 9:72a15235e097 68 modem_write_file(FID_STATUS_FILE, &status, 0, SIZE_STATUS_FILE, id);
Jeej 4:854f22f7962b 69 modem_ready.wait();
Jeej 2:6652be2d061f 70 }
Jeej 2:6652be2d061f 71
Jeej 1:55636c88cd5e 72 Thread::wait(1000);
Jeej 1:55636c88cd5e 73 }
Jeej 1:55636c88cd5e 74 }
Jeej 0:02418479dcf7 75
Jeej 0:02418479dcf7 76 void thread_file_modified()
Jeej 0:02418479dcf7 77 {
Jeej 3:e9ea4d325c01 78 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 3:e9ea4d325c01 79
Jeej 0:02418479dcf7 80 uint8_t fid;
Jeej 0:02418479dcf7 81 osEvent evt;
Jeej 0:02418479dcf7 82
Jeej 0:02418479dcf7 83 while (true)
Jeej 0:02418479dcf7 84 {
Jeej 0:02418479dcf7 85 evt = g_file_modified.get();
Jeej 0:02418479dcf7 86 fid = (evt.status == osEventMessage)? (uint8_t)(uint32_t)evt.value.p : NULL;
Jeej 0:02418479dcf7 87
Jeej 0:02418479dcf7 88 switch (fid)
Jeej 0:02418479dcf7 89 {
Jeej 0:02418479dcf7 90 case FID_STRING_FILE:
Jeej 0:02418479dcf7 91 // Print string
Jeej 0:02418479dcf7 92 uint8_t str[SIZE_STRING_FILE];
Jeej 0:02418479dcf7 93 ram_fs_read(FID_STRING_FILE, 0, SIZE_STRING_FILE, (uint8_t*)&str);
Jeej 0:02418479dcf7 94 PRINT("STRING: ");
Jeej 0:02418479dcf7 95 PRINT((char*)str);
Jeej 0:02418479dcf7 96 PRINT("\r\n");
Jeej 1:55636c88cd5e 97
Jeej 1:55636c88cd5e 98 clear_display();
Jeej 7:84dc04f88c94 99 sendStrXY((char*)str,0,0);
Jeej 1:55636c88cd5e 100
Jeej 2:6652be2d061f 101 g_restore_time = 0;
Jeej 0:02418479dcf7 102 break;
Jeej 0:02418479dcf7 103 default:
Jeej 3:e9ea4d325c01 104 PRINT("Unknown file %d\n", fid);
Jeej 5:a44b6f60bfc7 105 break;
Jeej 0:02418479dcf7 106 }
Jeej 0:02418479dcf7 107 }
Jeej 0:02418479dcf7 108 }
Jeej 0:02418479dcf7 109
Jeej 0:02418479dcf7 110 modem_callbacks_t callbacks = {
Jeej 0:02418479dcf7 111 .read = my_read,
Jeej 0:02418479dcf7 112 .write = my_write,
Jeej 0:02418479dcf7 113 .read_fprop = my_read_fprop,
Jeej 0:02418479dcf7 114 .flush = my_flush,
Jeej 0:02418479dcf7 115 .remove = my_delete,
Jeej 3:e9ea4d325c01 116 .udata = my_udata,
Jeej 0:02418479dcf7 117 .lqual = my_lqual,
Jeej 0:02418479dcf7 118 .ldown = my_ldown,
Jeej 0:02418479dcf7 119 .reset = my_reset,
Jeej 9:72a15235e097 120 .boot = my_boot,
Jeej 9:72a15235e097 121 .busy = my_busy,
Jeej 0:02418479dcf7 122 };
Jeej 0:02418479dcf7 123
Jeej 0:02418479dcf7 124 /*** Main function ------------------------------------------------------------- ***/
Jeej 0:02418479dcf7 125 int main()
Jeej 0:02418479dcf7 126 {
Jeej 0:02418479dcf7 127 // Start & initialize
Jeej 4:854f22f7962b 128 #ifdef DEBUG_LED
Jeej 0:02418479dcf7 129 DBG_OPEN(DEBUG_LED);
Jeej 4:854f22f7962b 130 #else
Jeej 4:854f22f7962b 131 DBG_OPEN(NC);
Jeej 4:854f22f7962b 132 #endif
Jeej 5:a44b6f60bfc7 133 PRINT("\n"
Jeej 5:a44b6f60bfc7 134 "-----------------------------------------\n"
Jeej 5:a44b6f60bfc7 135 "-------- Demo Receive file data ---------\n"
Jeej 5:a44b6f60bfc7 136 "-----------------------------------------\n");
Jeej 5:a44b6f60bfc7 137
Jeej 0:02418479dcf7 138 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:02418479dcf7 139
Jeej 4:854f22f7962b 140 modem_helper_open(&callbacks);
Jeej 0:02418479dcf7 141
Jeej 9:72a15235e097 142 uint8_t id = modem_get_id(my_main_callback);
Jeej 3:e9ea4d325c01 143
Jeej 4:854f22f7962b 144 PRINT("Register Files\n");
Jeej 0:02418479dcf7 145 // HOST Revision is a local file. Uses D7AActP Notification.
Jeej 1:55636c88cd5e 146 modem_update_file(FID_HOST_REV, (alp_file_header_t*)&h_rev, (uint8_t*)&f_rev);
Jeej 0:02418479dcf7 147
Jeej 0:02418479dcf7 148 // Allow remote access.
Jeej 1:55636c88cd5e 149 modem_update_file(FID_STRING_FILE, (alp_file_header_t*)&h_string_file, (uint8_t*)&f_string_file);
Jeej 3:e9ea4d325c01 150 modem_update_file(FID_STATUS_FILE, (alp_file_header_t*)&h_status_file, NULL);
Jeej 0:02418479dcf7 151
Jeej 2:6652be2d061f 152 // Put modem to listen to this access class
Jeej 2:6652be2d061f 153 d7a_xcl_t my_xcl = { .bf.s = 0, .bf.m = 2 };
Jeej 9:72a15235e097 154 modem_write_file(D7A_FID_DLL_CFG, &my_xcl, 0, sizeof(d7a_xcl_t), id);
Jeej 2:6652be2d061f 155 modem_ready.wait();
Jeej 2:6652be2d061f 156
Jeej 0:02418479dcf7 157 // Configure URC: LQUAL on report file notification every 10 reports
Jeej 0:02418479dcf7 158 PRINT("Setup URCs\n");
Jeej 9:72a15235e097 159 modem_enable_urc(ALP_URC_TYPE_LQUAL, IFID_REPORT, 10, true, id);
Jeej 0:02418479dcf7 160 modem_ready.wait();
Jeej 0:02418479dcf7 161
Jeej 0:02418479dcf7 162 PRINT("Start D7A Stack\n");
Jeej 9:72a15235e097 163 modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS , true, id);
Jeej 0:02418479dcf7 164 modem_ready.wait();
Jeej 0:02418479dcf7 165
Jeej 0:02418479dcf7 166 PRINT("Notify Modem Version\n");
Jeej 9:72a15235e097 167 modem_notify_file(D7A_FID_FIRMWARE_VERSION, 0, SIZE_HOST_REV, id);
Jeej 0:02418479dcf7 168 modem_ready.wait();
Jeej 0:02418479dcf7 169
Jeej 0:02418479dcf7 170 PRINT("Notify FW Version\n");
Jeej 9:72a15235e097 171 modem_notify_file(FID_HOST_REV, 0, SIZE_HOST_REV, id);
Jeej 0:02418479dcf7 172 modem_ready.wait();
Jeej 0:02418479dcf7 173
Jeej 9:72a15235e097 174 modem_free_id(id);
Jeej 9:72a15235e097 175
Jeej 0:02418479dcf7 176 // Start file modified thread
Jeej 1:55636c88cd5e 177 Thread th_file_modified(osPriorityNormal, 512, NULL);
Jeej 0:02418479dcf7 178 osStatus status = th_file_modified.start(thread_file_modified);
Jeej 0:02418479dcf7 179 ASSERT(status == osOK, "Failed to start thread_file_modified (err: %d)\r\n", status);
Jeej 1:55636c88cd5e 180
Jeej 1:55636c88cd5e 181 // Start reset display thread
Jeej 3:e9ea4d325c01 182 Thread th_reset_display(osPriorityLow, 1024, NULL);
Jeej 1:55636c88cd5e 183 status = th_reset_display.start(thread_reset_display);
Jeej 1:55636c88cd5e 184 ASSERT(status == osOK, "Failed to start thread_reset_display (err: %d)\r\n", status);
Jeej 1:55636c88cd5e 185
Jeej 1:55636c88cd5e 186 // Initialize I2C and OLED Display
Jeej 1:55636c88cd5e 187 i2c.frequency(400000);
Jeej 1:55636c88cd5e 188 init_OLED();
Jeej 1:55636c88cd5e 189 displayOn();
Jeej 1:55636c88cd5e 190 reset_display();
Jeej 1:55636c88cd5e 191
Jeej 1:55636c88cd5e 192 display_logo();
Jeej 0:02418479dcf7 193
Jeej 4:854f22f7962b 194 #ifdef DEBUG_LED
Jeej 0:02418479dcf7 195 DigitalOut my_led(DEBUG_LED);
Jeej 0:02418479dcf7 196 #endif
Jeej 0:02418479dcf7 197
Jeej 0:02418479dcf7 198 // Set main task to lowest priority
Jeej 0:02418479dcf7 199 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:02418479dcf7 200 while(true)
Jeej 0:02418479dcf7 201 {
Jeej 0:02418479dcf7 202 Thread::wait(500);
Jeej 4:854f22f7962b 203 #ifdef DEBUG_LED
Jeej 0:02418479dcf7 204 my_led = !my_led;
Jeej 0:02418479dcf7 205 #endif
Jeej 0:02418479dcf7 206 }
Jeej 0:02418479dcf7 207 }