Data reception demo.

Dependencies:   modem_ref_helper CRC

Committer:
Jeej
Date:
Thu Dec 21 15:23:09 2017 +0000
Revision:
6:2f0eb7aac143
Parent:
5:a44b6f60bfc7
Child:
7:84dc04f88c94
Update for 4.11+

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