Scan example on D7-LoRa

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Thu May 28 09:12:20 2020 +0000
Revision:
7:7d9414d33a63
Parent:
5:8c7ce9a28169
Child:
8:afc331e53b7d
Updated for v5.3.283.

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 1:27716ee59ca4 8 #if 1
Jeej 1:27716ee59ca4 9 // Use D7 LoRa
Jeej 1:27716ee59ca4 10 #define XCL_DL d7lora_dl_xcl
Jeej 1:27716ee59ca4 11 #define XCL_UL d7lora_ul_xcl
Jeej 1:27716ee59ca4 12 #else
Jeej 1:27716ee59ca4 13 // Use D7 FSK
Jeej 1:27716ee59ca4 14 #define XCL_DL d7fsk_dl_xcl
Jeej 1:27716ee59ca4 15 #define XCL_UL d7fsk_ul_xcl
Jeej 1:27716ee59ca4 16 #endif
Jeej 1:27716ee59ca4 17
Jeej 3:c1a36c817c48 18 #if 0
Jeej 1:27716ee59ca4 19 // Disable Duty Cycle
Jeej 1:27716ee59ca4 20 #define DUTY 255
Jeej 1:27716ee59ca4 21 #else
Jeej 1:27716ee59ca4 22 // Use default Duty Cycle
Jeej 1:27716ee59ca4 23 #define DUTY D7A_CTF_ENCODE(31)
Jeej 1:27716ee59ca4 24 #endif
Jeej 1:27716ee59ca4 25
Jeej 0:6703784ff93e 26 Semaphore button_user(0);
Jeej 0:6703784ff93e 27 Semaphore modem_ready(0);
Jeej 0:6703784ff93e 28 Queue<void, 8> modem_resp;
Jeej 0:6703784ff93e 29
Jeej 0:6703784ff93e 30 enum {
Jeej 0:6703784ff93e 31 MODEM_RESP_NO,
Jeej 0:6703784ff93e 32 MODEM_RESP_TERMINAL,
Jeej 0:6703784ff93e 33 MODEM_RESP_DONE,
Jeej 0:6703784ff93e 34 };
Jeej 0:6703784ff93e 35
Jeej 7:7d9414d33a63 36 d7a_xcl_t d7fsk_dl_xcl = { .bf = { .m = 0x1, .s = 0 } };
Jeej 7:7d9414d33a63 37 d7a_xcl_t d7fsk_ul_xcl = { .bf = { .m = 0x1, .s = 2 } };
Jeej 1:27716ee59ca4 38
Jeej 7:7d9414d33a63 39 d7a_xcl_t d7lora_dl_xcl = { .bf = { .m = 0x1, .s = 8 } };
Jeej 7:7d9414d33a63 40 d7a_xcl_t d7lora_ul_xcl = { .bf = { .m = 0x1, .s = 9 } };
Jeej 1:27716ee59ca4 41
Jeej 0:6703784ff93e 42 alp_d7a_itf_t my_itf = {
Jeej 0:6703784ff93e 43 .type = ALP_ITF_TYPE_D7A,
Jeej 7:7d9414d33a63 44 .cfg.to.byte = D7A_CTF_ENCODE(0),
Jeej 7:7d9414d33a63 45 .cfg.te.byte = D7A_CTF_ENCODE(0),
Jeej 0:6703784ff93e 46 .cfg.qos.bf.resp = D7A_RESP_ALL,
Jeej 2:de388004dca6 47 .cfg.qos.bf.retry = ALP_RPOL_ONESHOT,
Jeej 0:6703784ff93e 48 .cfg.addressee.ctrl.bf.nls = D7A_NLS_AES_CCM_64,
Jeej 0:6703784ff93e 49 .cfg.addressee.ctrl.bf.idf = D7A_ID_NBID,
Jeej 1:27716ee59ca4 50 .cfg.addressee.xcl = XCL_UL,
Jeej 3:c1a36c817c48 51 .cfg.addressee.id[0] = D7A_CTF_ENCODE(4),
Jeej 0:6703784ff93e 52 };
Jeej 0:6703784ff93e 53
Jeej 0:6703784ff93e 54 // Callback for broadcast read
Jeej 0:6703784ff93e 55 void my_read_response_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:6703784ff93e 56 {
Jeej 0:6703784ff93e 57 (void)id;
Jeej 0:6703784ff93e 58
Jeej 7:7d9414d33a63 59 if (ALP_ERR_NONE > err)
Jeej 3:c1a36c817c48 60 {
Jeej 3:c1a36c817c48 61 modem_print_error(ALP_ITF_TYPE_D7A, err);
Jeej 3:c1a36c817c48 62 }
Jeej 3:c1a36c817c48 63
Jeej 0:6703784ff93e 64 if (terminal)
Jeej 0:6703784ff93e 65 {
Jeej 0:6703784ff93e 66 modem_resp.put((void*)MODEM_RESP_TERMINAL);
Jeej 0:6703784ff93e 67 }
Jeej 0:6703784ff93e 68 else
Jeej 0:6703784ff93e 69 {
Jeej 0:6703784ff93e 70 if (ALP_ERR_NONE == err)
Jeej 0:6703784ff93e 71 {
Jeej 0:6703784ff93e 72 modem_resp.put((void*)MODEM_RESP_DONE);
Jeej 0:6703784ff93e 73 }
Jeej 0:6703784ff93e 74 }
Jeej 0:6703784ff93e 75 }
Jeej 0:6703784ff93e 76
Jeej 0:6703784ff93e 77 // Interrupt Service Routine on button press.
Jeej 0:6703784ff93e 78 void button_push_isr( void )
Jeej 0:6703784ff93e 79 {
Jeej 0:6703784ff93e 80 button_user.release();
Jeej 0:6703784ff93e 81 }
Jeej 0:6703784ff93e 82
Jeej 0:6703784ff93e 83 void button_user_thread()
Jeej 0:6703784ff93e 84 {
Jeej 0:6703784ff93e 85 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:6703784ff93e 86
Jeej 0:6703784ff93e 87 osEvent evt;
Jeej 0:6703784ff93e 88 uint32_t resp;
Jeej 0:6703784ff93e 89 d7a_sp_res_t istat;
Jeej 0:6703784ff93e 90 fw_version_t fw_ver;
Jeej 0:6703784ff93e 91 uint8_t nb = 0;
Jeej 0:6703784ff93e 92
Jeej 2:de388004dca6 93 uint8_t id = modem_get_id(my_read_response_callback);
Jeej 0:6703784ff93e 94
Jeej 1:27716ee59ca4 95 uint8_t scan_xcl[] = { XCL_DL.byte, XCL_UL.byte };
Jeej 0:6703784ff93e 96
Jeej 0:6703784ff93e 97 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:6703784ff93e 98 memset(&fw_ver, 0, sizeof(fw_version_t));
Jeej 0:6703784ff93e 99
Jeej 0:6703784ff93e 100 while (true)
Jeej 0:6703784ff93e 101 {
Jeej 0:6703784ff93e 102 // Wait for button press
Jeej 0:6703784ff93e 103 PRINT("Press button to scan...\r\n");
Jeej 5:8c7ce9a28169 104 button_user.acquire();
Jeej 0:6703784ff93e 105
Jeej 0:6703784ff93e 106 for (uint8_t i = 0; i < sizeof(scan_xcl); i++)
Jeej 0:6703784ff93e 107 {
Jeej 0:6703784ff93e 108 nb = 0;
Jeej 0:6703784ff93e 109 my_itf.cfg.addressee.xcl.byte = scan_xcl[i];
Jeej 0:6703784ff93e 110
Jeej 0:6703784ff93e 111 PRINT("Scanning XCL 0x%02X...\n", my_itf.cfg.addressee.xcl.byte);
Jeej 0:6703784ff93e 112
Jeej 2:de388004dca6 113 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), id);
Jeej 0:6703784ff93e 114
Jeej 0:6703784ff93e 115 do
Jeej 0:6703784ff93e 116 {
Jeej 0:6703784ff93e 117 evt = modem_resp.get();
Jeej 0:6703784ff93e 118 resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_NO;
Jeej 0:6703784ff93e 119
Jeej 0:6703784ff93e 120 if (MODEM_RESP_DONE == resp)
Jeej 0:6703784ff93e 121 {
Jeej 0:6703784ff93e 122 nb++;
Jeej 0:6703784ff93e 123 PRINT("%d: XCL:%02X ", nb, istat.addressee.xcl.byte);
Jeej 0:6703784ff93e 124 PRINT_DATA("UID:", "%02X", istat.addressee.id, 8, " ");
Jeej 0:6703784ff93e 125 PRINT("snr:%d rxlev:%d lb:%d ", istat.snr, istat.rxlev, istat.lb);
Jeej 0:6703784ff93e 126 PRINT("v%d.%d.%d\n", fw_ver.major, fw_ver.minor, fw_ver.patch);
Jeej 0:6703784ff93e 127
Jeej 0:6703784ff93e 128 // Reset variables
Jeej 0:6703784ff93e 129 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 0:6703784ff93e 130 memset(&fw_ver, 0, sizeof(fw_version_t));
Jeej 0:6703784ff93e 131 }
Jeej 0:6703784ff93e 132
Jeej 0:6703784ff93e 133 } while (MODEM_RESP_TERMINAL != resp);
Jeej 0:6703784ff93e 134 }
Jeej 0:6703784ff93e 135
Jeej 0:6703784ff93e 136 PRINT("Done.\n");
Jeej 0:6703784ff93e 137 }
Jeej 0:6703784ff93e 138 }
Jeej 0:6703784ff93e 139
Jeej 0:6703784ff93e 140 modem_callbacks_t callbacks = {
Jeej 0:6703784ff93e 141 .read = my_read,
Jeej 0:6703784ff93e 142 .write = my_write,
Jeej 0:6703784ff93e 143 .read_fprop = my_read_fprop,
Jeej 0:6703784ff93e 144 .flush = my_flush,
Jeej 0:6703784ff93e 145 .remove = my_delete,
Jeej 0:6703784ff93e 146 .udata = my_udata,
Jeej 0:6703784ff93e 147 .lqual = my_lqual,
Jeej 0:6703784ff93e 148 .ldown = my_ldown,
Jeej 0:6703784ff93e 149 .reset = my_reset,
Jeej 0:6703784ff93e 150 .boot = my_boot
Jeej 0:6703784ff93e 151 };
Jeej 0:6703784ff93e 152
Jeej 2:de388004dca6 153 // Callback for id User
Jeej 0:6703784ff93e 154 void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:6703784ff93e 155 {
Jeej 0:6703784ff93e 156 (void)id;
Jeej 0:6703784ff93e 157
Jeej 3:c1a36c817c48 158 if (ALP_ERR_NONE != err)
Jeej 3:c1a36c817c48 159 {
Jeej 3:c1a36c817c48 160 modem_print_error(ALP_ITF_TYPE_D7A, err);
Jeej 3:c1a36c817c48 161 }
Jeej 3:c1a36c817c48 162
Jeej 0:6703784ff93e 163 if (terminal)
Jeej 3:c1a36c817c48 164 {
Jeej 0:6703784ff93e 165 modem_ready.release();
Jeej 0:6703784ff93e 166 }
Jeej 0:6703784ff93e 167 }
Jeej 0:6703784ff93e 168
Jeej 0:6703784ff93e 169 /*** Main function ------------------------------------------------------------- ***/
Jeej 0:6703784ff93e 170 int main()
Jeej 0:6703784ff93e 171 {
Jeej 0:6703784ff93e 172 // Start & initialize
Jeej 0:6703784ff93e 173 #ifdef DEBUG_LED
Jeej 0:6703784ff93e 174 DBG_OPEN(DEBUG_LED);
Jeej 0:6703784ff93e 175 #else
Jeej 0:6703784ff93e 176 DBG_OPEN(NC);
Jeej 0:6703784ff93e 177 #endif
Jeej 0:6703784ff93e 178 PRINT("\n"
Jeej 0:6703784ff93e 179 "-----------------------------------------\n"
Jeej 3:c1a36c817c48 180 "------------- Demo D7A LoRa -------------\n"
Jeej 0:6703784ff93e 181 "-----------------------------------------\n");
Jeej 0:6703784ff93e 182
Jeej 0:6703784ff93e 183 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:6703784ff93e 184
Jeej 0:6703784ff93e 185 modem_helper_open(&callbacks);
Jeej 0:6703784ff93e 186
Jeej 2:de388004dca6 187 uint8_t id = modem_get_id(my_main_callback);
Jeej 0:6703784ff93e 188
Jeej 1:27716ee59ca4 189 // Put modem to listen to downlink access class
Jeej 2:de388004dca6 190 modem_write_file(D7A_FID_DLL_CFG, &XCL_DL, offsetof(d7a_dll_cfg_t, xcl), sizeof(d7a_xcl_t), id);
Jeej 5:8c7ce9a28169 191 modem_ready.acquire();
Jeej 1:27716ee59ca4 192
Jeej 1:27716ee59ca4 193 // Configure interfaces to use uplink access class
Jeej 2:de388004dca6 194 modem_write_file(IFID_ONESHOT_HOST, &XCL_UL, offsetof(alp_d7a_itf_t, cfg.addressee.xcl), sizeof(d7a_xcl_t), id);
Jeej 5:8c7ce9a28169 195 modem_ready.acquire();
Jeej 1:27716ee59ca4 196
Jeej 2:de388004dca6 197 modem_write_file(IFID_ONESHOT_ACTP, &XCL_UL, offsetof(alp_d7a_itf_t, cfg.addressee.xcl), sizeof(d7a_xcl_t), id);
Jeej 5:8c7ce9a28169 198 modem_ready.acquire();
Jeej 1:27716ee59ca4 199
Jeej 2:de388004dca6 200 modem_write_file(IFID_REPORT, &XCL_UL, offsetof(alp_d7a_itf_t, cfg.addressee.xcl), sizeof(d7a_xcl_t), id);
Jeej 5:8c7ce9a28169 201 modem_ready.acquire();
Jeej 1:27716ee59ca4 202
Jeej 1:27716ee59ca4 203 // Configure duty
Jeej 1:27716ee59ca4 204 d7a_ctf_t duty = { .byte = DUTY };
Jeej 1:27716ee59ca4 205 for (int i = 0; i < 8; i++)
Jeej 1:27716ee59ca4 206 {
Jeej 2:de388004dca6 207 modem_write_file(D7A_FID_ACCESS_PROFILE_0 + XCL_DL.bf.s, &duty, offsetof(d7a_access_profile_t, sb[0].duty) + (i * sizeof(d7a_subband_t)), sizeof(d7a_ctf_t), id);
Jeej 5:8c7ce9a28169 208 modem_ready.acquire();
Jeej 1:27716ee59ca4 209 }
Jeej 1:27716ee59ca4 210
Jeej 1:27716ee59ca4 211 for (int i = 0; i < 8; i++)
Jeej 1:27716ee59ca4 212 {
Jeej 2:de388004dca6 213 modem_write_file(D7A_FID_ACCESS_PROFILE_0 + XCL_UL.bf.s, &duty, offsetof(d7a_access_profile_t, sb[0].duty) + (i * sizeof(d7a_subband_t)), sizeof(d7a_ctf_t), id);
Jeej 5:8c7ce9a28169 214 modem_ready.acquire();
Jeej 1:27716ee59ca4 215 }
Jeej 1:27716ee59ca4 216
Jeej 0:6703784ff93e 217 PRINT("Start D7A Stack\n");
Jeej 3:c1a36c817c48 218 modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS | ALP_D7A_ISTAT_EOP, true, id);
Jeej 5:8c7ce9a28169 219 modem_ready.acquire();
Jeej 2:de388004dca6 220
Jeej 2:de388004dca6 221 modem_free_id(id);
Jeej 0:6703784ff93e 222
Jeej 0:6703784ff93e 223 #ifdef DEBUG_BUTTON
Jeej 0:6703784ff93e 224 DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
Jeej 0:6703784ff93e 225 user_interrupt.attach(button_push_isr, IRQ_FALL, 500, true);
Jeej 0:6703784ff93e 226
Jeej 0:6703784ff93e 227 Thread but_th(osPriorityNormal, 2048, NULL);
Jeej 0:6703784ff93e 228 osStatus status = but_th.start(button_user_thread);
Jeej 0:6703784ff93e 229 ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status);
Jeej 0:6703784ff93e 230 #else
Jeej 0:6703784ff93e 231 #error You need a button to use this APP as is
Jeej 0:6703784ff93e 232 #endif
Jeej 0:6703784ff93e 233
Jeej 0:6703784ff93e 234 #ifdef DEBUG_LED
Jeej 0:6703784ff93e 235 DigitalOut my_led(DEBUG_LED);
Jeej 0:6703784ff93e 236 #endif
Jeej 0:6703784ff93e 237
Jeej 0:6703784ff93e 238 // Set main task to lowest priority
Jeej 5:8c7ce9a28169 239 osThreadSetPriority(osThreadGetId(), osPriorityLow);
Jeej 0:6703784ff93e 240 while(true)
Jeej 0:6703784ff93e 241 {
Jeej 5:8c7ce9a28169 242 ThisThread::sleep_for(500);
Jeej 0:6703784ff93e 243 #ifdef DEBUG_LED
Jeej 0:6703784ff93e 244 my_led = !my_led;
Jeej 0:6703784ff93e 245 #endif
Jeej 0:6703784ff93e 246 }
Jeej 0:6703784ff93e 247 }