Data reception demo.

Dependencies:   modem_ref_helper CRC

Committer:
Jeej
Date:
Thu Sep 21 13:50:17 2017 +0000
Revision:
5:a44b6f60bfc7
Parent:
4:854f22f7962b
Child:
6:2f0eb7aac143
Updated for 4.10.x

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