Scan example on D7-LoRa

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Fri May 25 16:10:45 2018 +0000
Revision:
0:6703784ff93e
Child:
1:27716ee59ca4
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:6703784ff93e 1 // @autor: jeremie@wizzilab.com
Jeej 0:6703784ff93e 2 // @date: 2017-05-02
Jeej 0:6703784ff93e 3
Jeej 0:6703784ff93e 4 #include "DebouncedInterrupt.h"
Jeej 0:6703784ff93e 5 #include "modem_ref_helper.h"
Jeej 0:6703784ff93e 6 #include "modem_callbacks.h"
Jeej 0:6703784ff93e 7
Jeej 0:6703784ff93e 8 #define MY_POLICY_IDX 0
Jeej 0:6703784ff93e 9
Jeej 0:6703784ff93e 10 Semaphore button_user(0);
Jeej 0:6703784ff93e 11 Semaphore modem_ready(0);
Jeej 0:6703784ff93e 12 Queue<void, 8> modem_resp;
Jeej 0:6703784ff93e 13
Jeej 0:6703784ff93e 14 enum {
Jeej 0:6703784ff93e 15 MODEM_RESP_NO,
Jeej 0:6703784ff93e 16 MODEM_RESP_TERMINAL,
Jeej 0:6703784ff93e 17 MODEM_RESP_DONE,
Jeej 0:6703784ff93e 18 };
Jeej 0:6703784ff93e 19
Jeej 0:6703784ff93e 20 uint8_t g_main_id;
Jeej 0:6703784ff93e 21
Jeej 0:6703784ff93e 22 d7a_xcl_t d7lora_dl_xcl = { .bf.s = 8, .bf.m = 1 };
Jeej 0:6703784ff93e 23 d7a_xcl_t d7lora_ul_xcl = { .bf.s = 9, .bf.m = 1 };
Jeej 0:6703784ff93e 24
Jeej 0:6703784ff93e 25 alp_retry_policy_t my_policy = {
Jeej 0:6703784ff93e 26 .meta.procedure = 0,
Jeej 0:6703784ff93e 27 .meta.respond = true,
Jeej 0:6703784ff93e 28 .meta.persistant = false,
Jeej 0:6703784ff93e 29 .meta.bulk = false,
Jeej 0:6703784ff93e 30 .depth = 1,
Jeej 0:6703784ff93e 31 .retries = 0,
Jeej 0:6703784ff93e 32 .slot_time = 0
Jeej 0:6703784ff93e 33 };
Jeej 0:6703784ff93e 34
Jeej 0:6703784ff93e 35 alp_d7a_itf_t my_itf = {
Jeej 0:6703784ff93e 36 .type = ALP_ITF_TYPE_D7A,
Jeej 0:6703784ff93e 37 .cfg.to = 0,
Jeej 0:6703784ff93e 38 .cfg.te = 0,
Jeej 0:6703784ff93e 39 .cfg.qos.bf.resp = D7A_RESP_ALL,
Jeej 0:6703784ff93e 40 .cfg.qos.bf.retry = MY_POLICY_IDX,
Jeej 0:6703784ff93e 41 .cfg.addressee.ctrl.bf.nls = D7A_NLS_AES_CCM_64,
Jeej 0:6703784ff93e 42 .cfg.addressee.ctrl.bf.idf = D7A_ID_NBID,
Jeej 0:6703784ff93e 43 .cfg.addressee.xcl = d7lora_ul_xcl,
Jeej 0:6703784ff93e 44 .cfg.addressee.id[0] = D7A_CTF_VAL(4,0),
Jeej 0:6703784ff93e 45 };
Jeej 0:6703784ff93e 46
Jeej 0:6703784ff93e 47 void print_status(int status)
Jeej 0:6703784ff93e 48 {
Jeej 0:6703784ff93e 49 switch (status)
Jeej 0:6703784ff93e 50 {
Jeej 0:6703784ff93e 51 case ALP_ERR_NONE:
Jeej 0:6703784ff93e 52 //PRINT("Status: OK\n");
Jeej 0:6703784ff93e 53 break;
Jeej 0:6703784ff93e 54 case ALP_ERR_FILE_EXIST:
Jeej 0:6703784ff93e 55 PRINT("Status: Already registered\n");
Jeej 0:6703784ff93e 56 break;
Jeej 0:6703784ff93e 57 default:
Jeej 0:6703784ff93e 58 PRINT("Status: error %d\n", status);
Jeej 0:6703784ff93e 59 break;
Jeej 0:6703784ff93e 60 }
Jeej 0:6703784ff93e 61 }
Jeej 0:6703784ff93e 62
Jeej 0:6703784ff93e 63 void print_resp(int status)
Jeej 0:6703784ff93e 64 {
Jeej 0:6703784ff93e 65 switch (status)
Jeej 0:6703784ff93e 66 {
Jeej 0:6703784ff93e 67 case ALP_ERR_NONE:
Jeej 0:6703784ff93e 68 //PRINT("Resp: OK\n");
Jeej 0:6703784ff93e 69 break;
Jeej 0:6703784ff93e 70 case ALP_ERR_FILE_EXIST:
Jeej 0:6703784ff93e 71 PRINT("Resp: Already registered\n");
Jeej 0:6703784ff93e 72 break;
Jeej 0:6703784ff93e 73 default:
Jeej 0:6703784ff93e 74 PRINT("Resp: error %d\n", status);
Jeej 0:6703784ff93e 75 break;
Jeej 0:6703784ff93e 76 }
Jeej 0:6703784ff93e 77 }
Jeej 0:6703784ff93e 78
Jeej 0:6703784ff93e 79 // Callback for broadcast read
Jeej 0:6703784ff93e 80 void my_read_response_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:6703784ff93e 81 {
Jeej 0:6703784ff93e 82 (void)id;
Jeej 0:6703784ff93e 83
Jeej 0:6703784ff93e 84 if (terminal)
Jeej 0:6703784ff93e 85 {
Jeej 0:6703784ff93e 86 print_status(err);
Jeej 0:6703784ff93e 87 modem_resp.put((void*)MODEM_RESP_TERMINAL);
Jeej 0:6703784ff93e 88 }
Jeej 0:6703784ff93e 89 else
Jeej 0:6703784ff93e 90 {
Jeej 0:6703784ff93e 91 print_resp(err);
Jeej 0:6703784ff93e 92 if (ALP_ERR_NONE == err)
Jeej 0:6703784ff93e 93 {
Jeej 0:6703784ff93e 94 modem_resp.put((void*)MODEM_RESP_DONE);
Jeej 0:6703784ff93e 95 }
Jeej 0:6703784ff93e 96 }
Jeej 0:6703784ff93e 97 }
Jeej 0:6703784ff93e 98
Jeej 0:6703784ff93e 99 // Interrupt Service Routine on button press.
Jeej 0:6703784ff93e 100 void button_push_isr( void )
Jeej 0:6703784ff93e 101 {
Jeej 0:6703784ff93e 102 button_user.release();
Jeej 0:6703784ff93e 103 }
Jeej 0:6703784ff93e 104
Jeej 0:6703784ff93e 105 void button_user_thread()
Jeej 0:6703784ff93e 106 {
Jeej 0:6703784ff93e 107 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:6703784ff93e 108
Jeej 0:6703784ff93e 109 osEvent evt;
Jeej 0:6703784ff93e 110 uint32_t resp;
Jeej 0:6703784ff93e 111 d7a_sp_res_t istat;
Jeej 0:6703784ff93e 112 fw_version_t fw_ver;
Jeej 0:6703784ff93e 113 uint8_t nb = 0;
Jeej 0:6703784ff93e 114
Jeej 0:6703784ff93e 115 uint8_t my_user_id = modem_get_id(my_read_response_callback);
Jeej 0:6703784ff93e 116
Jeej 0:6703784ff93e 117 uint8_t scan_xcl[] = { d7lora_dl_xcl.byte, d7lora_ul_xcl.byte };
Jeej 0:6703784ff93e 118
Jeej 0:6703784ff93e 119 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:6703784ff93e 120 memset(&fw_ver, 0, sizeof(fw_version_t));
Jeej 0:6703784ff93e 121
Jeej 0:6703784ff93e 122 while (true)
Jeej 0:6703784ff93e 123 {
Jeej 0:6703784ff93e 124 // Wait for button press
Jeej 0:6703784ff93e 125 PRINT("Press button to scan...\r\n");
Jeej 0:6703784ff93e 126 button_user.wait();
Jeej 0:6703784ff93e 127
Jeej 0:6703784ff93e 128 for (uint8_t i = 0; i < sizeof(scan_xcl); i++)
Jeej 0:6703784ff93e 129 {
Jeej 0:6703784ff93e 130 nb = 0;
Jeej 0:6703784ff93e 131 my_itf.cfg.addressee.xcl.byte = scan_xcl[i];
Jeej 0:6703784ff93e 132
Jeej 0:6703784ff93e 133 PRINT("Scanning XCL 0x%02X...\n", my_itf.cfg.addressee.xcl.byte);
Jeej 0:6703784ff93e 134
Jeej 0:6703784ff93e 135 modem_remote_read_file((uint8_t*)&my_itf, D7_ITF_SIZE(&my_itf), (void*)&istat, D7A_FID_FIRMWARE_VERSION, (void*)&fw_ver, 12, sizeof(fw_version_t), my_user_id);
Jeej 0:6703784ff93e 136
Jeej 0:6703784ff93e 137 do
Jeej 0:6703784ff93e 138 {
Jeej 0:6703784ff93e 139 evt = modem_resp.get();
Jeej 0:6703784ff93e 140 resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_NO;
Jeej 0:6703784ff93e 141
Jeej 0:6703784ff93e 142 if (MODEM_RESP_DONE == resp)
Jeej 0:6703784ff93e 143 {
Jeej 0:6703784ff93e 144 nb++;
Jeej 0:6703784ff93e 145 PRINT("%d: XCL:%02X ", nb, istat.addressee.xcl.byte);
Jeej 0:6703784ff93e 146 PRINT_DATA("UID:", "%02X", istat.addressee.id, 8, " ");
Jeej 0:6703784ff93e 147 PRINT("snr:%d rxlev:%d lb:%d ", istat.snr, istat.rxlev, istat.lb);
Jeej 0:6703784ff93e 148 PRINT("v%d.%d.%d\n", fw_ver.major, fw_ver.minor, fw_ver.patch);
Jeej 0:6703784ff93e 149
Jeej 0:6703784ff93e 150 // Reset variables
Jeej 0:6703784ff93e 151 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:6703784ff93e 152 memset(&fw_ver, 0, sizeof(fw_version_t));
Jeej 0:6703784ff93e 153 }
Jeej 0:6703784ff93e 154
Jeej 0:6703784ff93e 155 } while (MODEM_RESP_TERMINAL != resp);
Jeej 0:6703784ff93e 156 }
Jeej 0:6703784ff93e 157
Jeej 0:6703784ff93e 158 PRINT("Done.\n");
Jeej 0:6703784ff93e 159 }
Jeej 0:6703784ff93e 160 }
Jeej 0:6703784ff93e 161
Jeej 0:6703784ff93e 162 modem_callbacks_t callbacks = {
Jeej 0:6703784ff93e 163 .read = my_read,
Jeej 0:6703784ff93e 164 .write = my_write,
Jeej 0:6703784ff93e 165 .read_fprop = my_read_fprop,
Jeej 0:6703784ff93e 166 .flush = my_flush,
Jeej 0:6703784ff93e 167 .remove = my_delete,
Jeej 0:6703784ff93e 168 .udata = my_udata,
Jeej 0:6703784ff93e 169 .lqual = my_lqual,
Jeej 0:6703784ff93e 170 .ldown = my_ldown,
Jeej 0:6703784ff93e 171 .reset = my_reset,
Jeej 0:6703784ff93e 172 .boot = my_boot
Jeej 0:6703784ff93e 173 };
Jeej 0:6703784ff93e 174
Jeej 0:6703784ff93e 175 // Callback for g_main_id User
Jeej 0:6703784ff93e 176 void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:6703784ff93e 177 {
Jeej 0:6703784ff93e 178 (void)id;
Jeej 0:6703784ff93e 179
Jeej 0:6703784ff93e 180 if (terminal)
Jeej 0:6703784ff93e 181 {
Jeej 0:6703784ff93e 182 print_status(err);
Jeej 0:6703784ff93e 183 modem_ready.release();
Jeej 0:6703784ff93e 184 }
Jeej 0:6703784ff93e 185 else
Jeej 0:6703784ff93e 186 {
Jeej 0:6703784ff93e 187 print_resp(err);
Jeej 0:6703784ff93e 188 }
Jeej 0:6703784ff93e 189 }
Jeej 0:6703784ff93e 190
Jeej 0:6703784ff93e 191 /*** Main function ------------------------------------------------------------- ***/
Jeej 0:6703784ff93e 192 int main()
Jeej 0:6703784ff93e 193 {
Jeej 0:6703784ff93e 194 // Start & initialize
Jeej 0:6703784ff93e 195 #ifdef DEBUG_LED
Jeej 0:6703784ff93e 196 DBG_OPEN(DEBUG_LED);
Jeej 0:6703784ff93e 197 #else
Jeej 0:6703784ff93e 198 DBG_OPEN(NC);
Jeej 0:6703784ff93e 199 #endif
Jeej 0:6703784ff93e 200 PRINT("\n"
Jeej 0:6703784ff93e 201 "-----------------------------------------\n"
Jeej 0:6703784ff93e 202 "--------- Demo ActiveRFIDReader ---------\n"
Jeej 0:6703784ff93e 203 "-----------------------------------------\n");
Jeej 0:6703784ff93e 204
Jeej 0:6703784ff93e 205 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:6703784ff93e 206
Jeej 0:6703784ff93e 207 modem_helper_open(&callbacks);
Jeej 0:6703784ff93e 208
Jeej 0:6703784ff93e 209 g_main_id = modem_get_id(my_main_callback);
Jeej 0:6703784ff93e 210
Jeej 0:6703784ff93e 211 // Put modem to listen to downlink access class
Jeej 0:6703784ff93e 212 modem_write_file(D7A_FID_DLL_CFG, &d7lora_dl_xcl, offsetof(d7a_dll_cfg_t, xcl), sizeof(d7a_xcl_t), g_main_id);
Jeej 0:6703784ff93e 213 modem_ready.wait();
Jeej 0:6703784ff93e 214
Jeej 0:6703784ff93e 215 // Configure interfaces to use uplink access class
Jeej 0:6703784ff93e 216 modem_write_file(FID_D7A_ITF0, &d7lora_ul_xcl, offsetof(alp_d7a_itf_t, cfg.addressee.xcl), sizeof(d7a_xcl_t), g_main_id);
Jeej 0:6703784ff93e 217 modem_ready.wait();
Jeej 0:6703784ff93e 218
Jeej 0:6703784ff93e 219 modem_write_file(FID_D7A_ITF1, &d7lora_ul_xcl, offsetof(alp_d7a_itf_t, cfg.addressee.xcl), sizeof(d7a_xcl_t), g_main_id);
Jeej 0:6703784ff93e 220 modem_ready.wait();
Jeej 0:6703784ff93e 221
Jeej 0:6703784ff93e 222 modem_write_file(FID_D7A_ITF2, &d7lora_ul_xcl, offsetof(alp_d7a_itf_t, cfg.addressee.xcl), sizeof(d7a_xcl_t), g_main_id);
Jeej 0:6703784ff93e 223 modem_ready.wait();
Jeej 0:6703784ff93e 224
Jeej 0:6703784ff93e 225 modem_write_file(FID_D7A_ITF3, &d7lora_ul_xcl, offsetof(alp_d7a_itf_t, cfg.addressee.xcl), sizeof(d7a_xcl_t), g_main_id);
Jeej 0:6703784ff93e 226 modem_ready.wait();
Jeej 0:6703784ff93e 227
Jeej 0:6703784ff93e 228 // Set custom retry policy
Jeej 0:6703784ff93e 229 // XXX Won't work the first time as we need to reboot the modem for the changes to be applied
Jeej 0:6703784ff93e 230 // Check current retry policy
Jeej 0:6703784ff93e 231 alp_retry_policy_t old;
Jeej 0:6703784ff93e 232 modem_read_file(WM_FID_ALP_CFG, &old, MY_POLICY_IDX * sizeof(alp_retry_policy_t), sizeof(alp_retry_policy_t), g_main_id);
Jeej 0:6703784ff93e 233 modem_ready.wait();
Jeej 0:6703784ff93e 234 if (memcmp(&old, &my_policy, sizeof(alp_retry_policy_t)))
Jeej 0:6703784ff93e 235 {
Jeej 0:6703784ff93e 236 // Update retry policy
Jeej 0:6703784ff93e 237 modem_write_file(WM_FID_ALP_CFG, &my_policy, MY_POLICY_IDX * sizeof(alp_retry_policy_t), sizeof(alp_retry_policy_t), g_main_id);
Jeej 0:6703784ff93e 238 modem_ready.wait();
Jeej 0:6703784ff93e 239 modem_flush_file(WM_FID_ALP_CFG, g_main_id);
Jeej 0:6703784ff93e 240 modem_ready.wait();
Jeej 0:6703784ff93e 241
Jeej 0:6703784ff93e 242 // Reboot
Jeej 0:6703784ff93e 243 PRINT("Rebooting to apply new retry policy\n");
Jeej 0:6703784ff93e 244 my_reset();
Jeej 0:6703784ff93e 245 }
Jeej 0:6703784ff93e 246
Jeej 0:6703784ff93e 247 // Configure URC: LQUAL on report file notification every 10 reports
Jeej 0:6703784ff93e 248 PRINT("Setup URCs\n");
Jeej 0:6703784ff93e 249 modem_enable_urc(ALP_URC_TYPE_LQUAL, IFID_REPORT, 10, true, g_main_id);
Jeej 0:6703784ff93e 250 modem_ready.wait();
Jeej 0:6703784ff93e 251
Jeej 0:6703784ff93e 252 PRINT("Start D7A Stack\n");
Jeej 0:6703784ff93e 253 modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS, true, g_main_id);
Jeej 0:6703784ff93e 254 modem_ready.wait();
Jeej 0:6703784ff93e 255
Jeej 0:6703784ff93e 256 #ifdef DEBUG_BUTTON
Jeej 0:6703784ff93e 257 DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
Jeej 0:6703784ff93e 258 user_interrupt.attach(button_push_isr, IRQ_FALL, 500, true);
Jeej 0:6703784ff93e 259
Jeej 0:6703784ff93e 260 Thread but_th(osPriorityNormal, 2048, NULL);
Jeej 0:6703784ff93e 261 osStatus status = but_th.start(button_user_thread);
Jeej 0:6703784ff93e 262 ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status);
Jeej 0:6703784ff93e 263 #else
Jeej 0:6703784ff93e 264 #error You need a button to use this APP as is
Jeej 0:6703784ff93e 265 #endif
Jeej 0:6703784ff93e 266
Jeej 0:6703784ff93e 267 #ifdef DEBUG_LED
Jeej 0:6703784ff93e 268 DigitalOut my_led(DEBUG_LED);
Jeej 0:6703784ff93e 269 #endif
Jeej 0:6703784ff93e 270
Jeej 0:6703784ff93e 271 // Set main task to lowest priority
Jeej 0:6703784ff93e 272 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:6703784ff93e 273 while(true)
Jeej 0:6703784ff93e 274 {
Jeej 0:6703784ff93e 275 Thread::wait(500);
Jeej 0:6703784ff93e 276 #ifdef DEBUG_LED
Jeej 0:6703784ff93e 277 my_led = !my_led;
Jeej 0:6703784ff93e 278 #endif
Jeej 0:6703784ff93e 279 }
Jeej 0:6703784ff93e 280 }