Data reception demo.

Dependencies:   modem_ref_helper CRC

Committer:
marin_wizzi
Date:
Fri Oct 29 13:12:47 2021 +0000
Revision:
15:e90cc8e37c4d
Parent:
14:44cbb58de405
Compatible with 6.2 modem version

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
marin_wizzi 15:e90cc8e37c4d 4 #include "modem_d7a.h"
Jeej 0:02418479dcf7 5 #include "modem_callbacks.h"
Jeej 4:854f22f7962b 6 #include "files.h"
marin_wizzi 15:e90cc8e37c4d 7 #include "crc.h"
Jeej 1:55636c88cd5e 8 #include "CriusOLED.h"
Jeej 1:55636c88cd5e 9
Jeej 2:6652be2d061f 10 #define RESTORE_TIME 30
Jeej 2:6652be2d061f 11 #define KEEP_ALIVE 3600
Jeej 6:2f0eb7aac143 12 #define MIN_REPORT_PERIOD (10) // Seconds
marin_wizzi 15:e90cc8e37c4d 13 #define CHUNK_SIZE 128
Jeej 1:55636c88cd5e 14
marin_wizzi 15:e90cc8e37c4d 15 Queue<touch_t, 8> g_file_modified;
marin_wizzi 15:e90cc8e37c4d 16
marin_wizzi 15:e90cc8e37c4d 17 // This describe the upload interface
marin_wizzi 15:e90cc8e37c4d 18 // Do not modify uncommented parameters
marin_wizzi 15:e90cc8e37c4d 19 alp_itf_d7a_cfg_t report_itf = {
marin_wizzi 15:e90cc8e37c4d 20 .type = ALP_ITF_TYPE_D7A,
marin_wizzi 15:e90cc8e37c4d 21 .cfg.to.byte = D7A_CTF_ENCODE(0),
marin_wizzi 15:e90cc8e37c4d 22 .cfg.te.byte = D7A_CTF_ENCODE(0),
marin_wizzi 15:e90cc8e37c4d 23 .cfg.qos.bf.resp = D7A_RESP_PREFERRED,
marin_wizzi 15:e90cc8e37c4d 24 .cfg.qos.bf.retry = ALP_RPOL_ONESHOT,
marin_wizzi 15:e90cc8e37c4d 25 .cfg.addressee.ctrl.bf.nls = D7A_NLS_AES_CCM_64, // Security level
marin_wizzi 15:e90cc8e37c4d 26 .cfg.addressee.ctrl.bf.idf = D7A_ID_NBID,
marin_wizzi 15:e90cc8e37c4d 27 .cfg.addressee.xcl.bf = {.s = 2, .m = 0x1}, // Gateway access class
marin_wizzi 15:e90cc8e37c4d 28 .cfg.addressee.id[0] = D7A_CTF_ENCODE(4),
marin_wizzi 15:e90cc8e37c4d 29 };
marin_wizzi 15:e90cc8e37c4d 30
Jeej 0:02418479dcf7 31
Jeej 9:72a15235e097 32 uint8_t id;
Jeej 2:6652be2d061f 33 uint32_t g_restore_time = RESTORE_TIME + 1;
Jeej 1:55636c88cd5e 34
Jeej 1:55636c88cd5e 35 void display_logo(void)
Jeej 1:55636c88cd5e 36 {
Jeej 1:55636c88cd5e 37 clear_display();
Jeej 1:55636c88cd5e 38 sendImage();
Jeej 1:55636c88cd5e 39 }
Jeej 1:55636c88cd5e 40
Jeej 9:72a15235e097 41
Jeej 1:55636c88cd5e 42 void thread_reset_display()
Jeej 1:55636c88cd5e 43 {
Jeej 3:e9ea4d325c01 44 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 2:6652be2d061f 45
Jeej 3:e9ea4d325c01 46 uint32_t time = 0;
Jeej 3:e9ea4d325c01 47 uint8_t status = 0;
Jeej 3:e9ea4d325c01 48
Jeej 1:55636c88cd5e 49 while (true)
Jeej 1:55636c88cd5e 50 {
Jeej 2:6652be2d061f 51 if (g_restore_time++ == RESTORE_TIME)
Jeej 1:55636c88cd5e 52 {
Jeej 1:55636c88cd5e 53 display_logo();
Jeej 1:55636c88cd5e 54 }
Jeej 3:e9ea4d325c01 55
Jeej 3:e9ea4d325c01 56 if ((time++ % KEEP_ALIVE) == 0)
Jeej 2:6652be2d061f 57 {
Jeej 3:e9ea4d325c01 58 // Keep alive: Report status
marin_wizzi 15:e90cc8e37c4d 59 modem_notify_file(FID_STATUS_FILE, 0, SIZE_STATUS_FILE);
Jeej 2:6652be2d061f 60 }
Jeej 2:6652be2d061f 61
Jeej 1:55636c88cd5e 62 Thread::wait(1000);
Jeej 1:55636c88cd5e 63 }
Jeej 1:55636c88cd5e 64 }
Jeej 0:02418479dcf7 65
Jeej 0:02418479dcf7 66 void thread_file_modified()
Jeej 0:02418479dcf7 67 {
marin_wizzi 15:e90cc8e37c4d 68 touch_t* touch;
marin_wizzi 15:e90cc8e37c4d 69
Jeej 3:e9ea4d325c01 70 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 3:e9ea4d325c01 71
Jeej 0:02418479dcf7 72 uint8_t fid;
Jeej 0:02418479dcf7 73 osEvent evt;
Jeej 0:02418479dcf7 74
marin_wizzi 15:e90cc8e37c4d 75 int err;
marin_wizzi 15:e90cc8e37c4d 76 alp_payload_t* alp;
marin_wizzi 15:e90cc8e37c4d 77 alp_payload_t* rsp;
marin_wizzi 15:e90cc8e37c4d 78
marin_wizzi 15:e90cc8e37c4d 79 PRINT("Register Files\n");
marin_wizzi 15:e90cc8e37c4d 80 ram_fs_new(FID_STRING_FILE, (uint8_t*)&h_string_file, (uint8_t*)&f_string_file);
marin_wizzi 15:e90cc8e37c4d 81 ram_fs_new(FID_STATUS_FILE, (uint8_t*)&h_status_file, (uint8_t*)&f_status_file);
marin_wizzi 15:e90cc8e37c4d 82
marin_wizzi 15:e90cc8e37c4d 83 modem_declare_file(FID_STRING_FILE, (alp_file_header_t*)&h_string_file);
marin_wizzi 15:e90cc8e37c4d 84 modem_declare_file(FID_STATUS_FILE, (alp_file_header_t*)&h_status_file);
marin_wizzi 15:e90cc8e37c4d 85
marin_wizzi 15:e90cc8e37c4d 86 PRINT("Enable D7A interface\n");
marin_wizzi 15:e90cc8e37c4d 87 modem_d7a_enable_itf();
marin_wizzi 15:e90cc8e37c4d 88
marin_wizzi 15:e90cc8e37c4d 89 // Host revision file is in the modem. Update it.
marin_wizzi 15:e90cc8e37c4d 90 PRINT("Update host revision\n");
marin_wizzi 15:e90cc8e37c4d 91 modem_write_file(FID_HOST_REV, (void*)&f_rev, 0, sizeof(revision_t));
marin_wizzi 15:e90cc8e37c4d 92
marin_wizzi 15:e90cc8e37c4d 93
marin_wizzi 15:e90cc8e37c4d 94 // Retrieve modem revision
marin_wizzi 15:e90cc8e37c4d 95 PRINT("Send revision\n");
marin_wizzi 15:e90cc8e37c4d 96
marin_wizzi 15:e90cc8e37c4d 97 revision_t rev;
marin_wizzi 15:e90cc8e37c4d 98
marin_wizzi 15:e90cc8e37c4d 99 modem_read_file(FID_WM_REV, &rev, 0, sizeof(revision_t));
marin_wizzi 15:e90cc8e37c4d 100
marin_wizzi 15:e90cc8e37c4d 101 // Send both to the server
marin_wizzi 15:e90cc8e37c4d 102 // Build payload
marin_wizzi 15:e90cc8e37c4d 103 alp = NULL;
marin_wizzi 15:e90cc8e37c4d 104 alp = alp_payload_rsp_f_data(alp, FID_WM_REV, &rev, 0, sizeof(revision_t));
marin_wizzi 15:e90cc8e37c4d 105 alp = alp_payload_rsp_f_data(alp, FID_HOST_REV, (void*)&f_rev, 0, sizeof(revision_t));
marin_wizzi 15:e90cc8e37c4d 106 // Send
marin_wizzi 15:e90cc8e37c4d 107 modem_remote_raw_alp((void*)&report_itf, alp, NULL, 10000);
marin_wizzi 15:e90cc8e37c4d 108
marin_wizzi 15:e90cc8e37c4d 109
Jeej 0:02418479dcf7 110 while (true)
Jeej 0:02418479dcf7 111 {
Jeej 0:02418479dcf7 112 evt = g_file_modified.get();
Jeej 0:02418479dcf7 113
marin_wizzi 15:e90cc8e37c4d 114 touch = (evt.status == osEventMessage)? (touch_t*)evt.value.p : NULL;
marin_wizzi 15:e90cc8e37c4d 115 ASSERT(touch != NULL, "NULL touch pointer!\n");
marin_wizzi 15:e90cc8e37c4d 116
marin_wizzi 15:e90cc8e37c4d 117 switch (touch->fid)
Jeej 0:02418479dcf7 118 {
Jeej 0:02418479dcf7 119 case FID_STRING_FILE:
Jeej 0:02418479dcf7 120 // Print string
Jeej 0:02418479dcf7 121 uint8_t str[SIZE_STRING_FILE];
marin_wizzi 15:e90cc8e37c4d 122 ram_fs_read(FID_STRING_FILE, (uint8_t*)&str, 0, SIZE_STRING_FILE);
Jeej 0:02418479dcf7 123 PRINT("STRING: ");
Jeej 0:02418479dcf7 124 PRINT((char*)str);
Jeej 0:02418479dcf7 125 PRINT("\r\n");
Jeej 1:55636c88cd5e 126
Jeej 1:55636c88cd5e 127 clear_display();
Jeej 7:84dc04f88c94 128 sendStrXY((char*)str,0,0);
Jeej 1:55636c88cd5e 129
Jeej 2:6652be2d061f 130 g_restore_time = 0;
Jeej 0:02418479dcf7 131 break;
Jeej 0:02418479dcf7 132 default:
marin_wizzi 15:e90cc8e37c4d 133 PRINT("Unknown file %d\n", touch->fid);
Jeej 5:a44b6f60bfc7 134 break;
Jeej 0:02418479dcf7 135 }
marin_wizzi 15:e90cc8e37c4d 136 FREE(touch);
Jeej 0:02418479dcf7 137 }
Jeej 0:02418479dcf7 138 }
Jeej 0:02418479dcf7 139
marin_wizzi 15:e90cc8e37c4d 140 modem_ref_callbacks_t callbacks = {
Jeej 0:02418479dcf7 141 .read = my_read,
Jeej 0:02418479dcf7 142 .write = my_write,
Jeej 0:02418479dcf7 143 .read_fprop = my_read_fprop,
Jeej 0:02418479dcf7 144 .flush = my_flush,
Jeej 0:02418479dcf7 145 .remove = my_delete,
Jeej 3:e9ea4d325c01 146 .udata = my_udata,
Jeej 0:02418479dcf7 147 .lqual = my_lqual,
Jeej 0:02418479dcf7 148 .ldown = my_ldown,
Jeej 0:02418479dcf7 149 .reset = my_reset,
Jeej 9:72a15235e097 150 .boot = my_boot,
Jeej 9:72a15235e097 151 .busy = my_busy,
Jeej 0:02418479dcf7 152 };
Jeej 0:02418479dcf7 153
Jeej 0:02418479dcf7 154 /*** Main function ------------------------------------------------------------- ***/
Jeej 0:02418479dcf7 155 int main()
Jeej 0:02418479dcf7 156 {
Jeej 0:02418479dcf7 157 // Start & initialize
Jeej 4:854f22f7962b 158 #ifdef DEBUG_LED
Jeej 0:02418479dcf7 159 DBG_OPEN(DEBUG_LED);
Jeej 4:854f22f7962b 160 #else
Jeej 4:854f22f7962b 161 DBG_OPEN(NC);
Jeej 4:854f22f7962b 162 #endif
Jeej 5:a44b6f60bfc7 163 PRINT("\n"
Jeej 5:a44b6f60bfc7 164 "-----------------------------------------\n"
Jeej 5:a44b6f60bfc7 165 "-------- Demo Receive file data ---------\n"
Jeej 5:a44b6f60bfc7 166 "-----------------------------------------\n");
Jeej 5:a44b6f60bfc7 167
Jeej 0:02418479dcf7 168 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:02418479dcf7 169
marin_wizzi 15:e90cc8e37c4d 170 modem_open(&callbacks);
Jeej 0:02418479dcf7 171
Jeej 9:72a15235e097 172
Jeej 0:02418479dcf7 173 // Start file modified thread
marin_wizzi 15:e90cc8e37c4d 174 Thread th_file_modified(osPriorityNormal, 1024, NULL);
Jeej 0:02418479dcf7 175 osStatus status = th_file_modified.start(thread_file_modified);
Jeej 0:02418479dcf7 176 ASSERT(status == osOK, "Failed to start thread_file_modified (err: %d)\r\n", status);
Jeej 1:55636c88cd5e 177
Jeej 1:55636c88cd5e 178 // Start reset display thread
Jeej 3:e9ea4d325c01 179 Thread th_reset_display(osPriorityLow, 1024, NULL);
Jeej 1:55636c88cd5e 180 status = th_reset_display.start(thread_reset_display);
Jeej 1:55636c88cd5e 181 ASSERT(status == osOK, "Failed to start thread_reset_display (err: %d)\r\n", status);
Jeej 1:55636c88cd5e 182
Jeej 1:55636c88cd5e 183 // Initialize I2C and OLED Display
Jeej 1:55636c88cd5e 184 i2c.frequency(400000);
Jeej 1:55636c88cd5e 185 init_OLED();
Jeej 1:55636c88cd5e 186 displayOn();
Jeej 1:55636c88cd5e 187 reset_display();
Jeej 1:55636c88cd5e 188
Jeej 1:55636c88cd5e 189 display_logo();
Jeej 0:02418479dcf7 190
Jeej 4:854f22f7962b 191 #ifdef DEBUG_LED
Jeej 0:02418479dcf7 192 DigitalOut my_led(DEBUG_LED);
Jeej 0:02418479dcf7 193 #endif
Jeej 0:02418479dcf7 194
Jeej 0:02418479dcf7 195 // Set main task to lowest priority
Jeej 12:404a3ca64a44 196 osThreadSetPriority(osThreadGetId(), osPriorityLow);
Jeej 0:02418479dcf7 197 while(true)
Jeej 0:02418479dcf7 198 {
Jeej 12:404a3ca64a44 199 ThisThread::sleep_for(500);
Jeej 4:854f22f7962b 200 #ifdef DEBUG_LED
Jeej 0:02418479dcf7 201 my_led = !my_led;
Jeej 0:02418479dcf7 202 #endif
Jeej 0:02418479dcf7 203 }
Jeej 0:02418479dcf7 204 }