Scan example on D7-LoRa

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Fri Feb 19 14:25:06 2021 +0000
Revision:
8:afc331e53b7d
Parent:
7:7d9414d33a63
New driver for 5.6.x

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 8:afc331e53b7d 5 #include "modem_d7a.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
Jeej 7:7d9414d33a63 28 d7a_xcl_t d7fsk_dl_xcl = { .bf = { .m = 0x1, .s = 0 } };
Jeej 7:7d9414d33a63 29 d7a_xcl_t d7fsk_ul_xcl = { .bf = { .m = 0x1, .s = 2 } };
Jeej 1:27716ee59ca4 30
Jeej 7:7d9414d33a63 31 d7a_xcl_t d7lora_dl_xcl = { .bf = { .m = 0x1, .s = 8 } };
Jeej 7:7d9414d33a63 32 d7a_xcl_t d7lora_ul_xcl = { .bf = { .m = 0x1, .s = 9 } };
Jeej 1:27716ee59ca4 33
Jeej 0:6703784ff93e 34 alp_d7a_itf_t my_itf = {
Jeej 0:6703784ff93e 35 .type = ALP_ITF_TYPE_D7A,
Jeej 7:7d9414d33a63 36 .cfg.to.byte = D7A_CTF_ENCODE(0),
Jeej 7:7d9414d33a63 37 .cfg.te.byte = D7A_CTF_ENCODE(0),
Jeej 0:6703784ff93e 38 .cfg.qos.bf.resp = D7A_RESP_ALL,
Jeej 2:de388004dca6 39 .cfg.qos.bf.retry = ALP_RPOL_ONESHOT,
Jeej 0:6703784ff93e 40 .cfg.addressee.ctrl.bf.nls = D7A_NLS_AES_CCM_64,
Jeej 0:6703784ff93e 41 .cfg.addressee.ctrl.bf.idf = D7A_ID_NBID,
Jeej 1:27716ee59ca4 42 .cfg.addressee.xcl = XCL_UL,
Jeej 3:c1a36c817c48 43 .cfg.addressee.id[0] = D7A_CTF_ENCODE(4),
Jeej 0:6703784ff93e 44 };
Jeej 0:6703784ff93e 45
Jeej 0:6703784ff93e 46 // Interrupt Service Routine on button press.
Jeej 0:6703784ff93e 47 void button_push_isr( void )
Jeej 0:6703784ff93e 48 {
Jeej 0:6703784ff93e 49 button_user.release();
Jeej 0:6703784ff93e 50 }
Jeej 0:6703784ff93e 51
Jeej 0:6703784ff93e 52 void button_user_thread()
Jeej 0:6703784ff93e 53 {
Jeej 0:6703784ff93e 54 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:6703784ff93e 55
Jeej 0:6703784ff93e 56 osEvent evt;
Jeej 0:6703784ff93e 57 fw_version_t fw_ver;
Jeej 0:6703784ff93e 58 uint8_t nb = 0;
Jeej 8:afc331e53b7d 59 alp_payload_t* alp;
Jeej 8:afc331e53b7d 60 alp_payload_t* alp_rsp;
Jeej 8:afc331e53b7d 61 d7a_sp_res_t istat;
Jeej 8:afc331e53b7d 62 int err;
Jeej 0:6703784ff93e 63
Jeej 1:27716ee59ca4 64 uint8_t scan_xcl[] = { XCL_DL.byte, XCL_UL.byte };
Jeej 0:6703784ff93e 65
Jeej 8:afc331e53b7d 66 modem_d7a_enable_itf();
Jeej 0:6703784ff93e 67
Jeej 0:6703784ff93e 68 while (true)
Jeej 0:6703784ff93e 69 {
Jeej 0:6703784ff93e 70 // Wait for button press
Jeej 0:6703784ff93e 71 PRINT("Press button to scan...\r\n");
Jeej 5:8c7ce9a28169 72 button_user.acquire();
Jeej 0:6703784ff93e 73
Jeej 0:6703784ff93e 74 for (uint8_t i = 0; i < sizeof(scan_xcl); i++)
Jeej 0:6703784ff93e 75 {
Jeej 0:6703784ff93e 76 nb = 0;
Jeej 0:6703784ff93e 77 my_itf.cfg.addressee.xcl.byte = scan_xcl[i];
Jeej 0:6703784ff93e 78
Jeej 0:6703784ff93e 79 PRINT("Scanning XCL 0x%02X...\n", my_itf.cfg.addressee.xcl.byte);
Jeej 0:6703784ff93e 80
Jeej 8:afc331e53b7d 81 alp = NULL;
Jeej 8:afc331e53b7d 82 alp = alp_payload_f_rd_data(alp, D7A_FID_FIRMWARE_VERSION, 12, sizeof(fw_version_t), false);
Jeej 0:6703784ff93e 83
Jeej 8:afc331e53b7d 84 err = modem_remote_raw_alp((void*)&my_itf, alp, &alp_rsp, (uint32_t)60000);
Jeej 8:afc331e53b7d 85
Jeej 8:afc331e53b7d 86 if (err < ALP_ERR_NONE)
Jeej 8:afc331e53b7d 87 {
Jeej 8:afc331e53b7d 88 PRINT("Timeout.\n");
Jeej 8:afc331e53b7d 89 }
Jeej 8:afc331e53b7d 90 else
Jeej 0:6703784ff93e 91 {
Jeej 8:afc331e53b7d 92 err = alp_payload_get_err(alp_rsp);
Jeej 8:afc331e53b7d 93 PRINT("Err %d: ", err);
Jeej 8:afc331e53b7d 94 modem_print_error(my_itf.type, err);
Jeej 8:afc331e53b7d 95 }
Jeej 8:afc331e53b7d 96
Jeej 8:afc331e53b7d 97 do {
Jeej 8:afc331e53b7d 98 nb++;
Jeej 0:6703784ff93e 99
Jeej 8:afc331e53b7d 100 alp = alp_payload_extract(&alp_rsp, ALP_OPCODE_RSP_ISTATUS);
Jeej 8:afc331e53b7d 101
Jeej 8:afc331e53b7d 102 if (alp)
Jeej 0:6703784ff93e 103 {
Jeej 8:afc331e53b7d 104 alp_parsed_chunk_t r;
Jeej 8:afc331e53b7d 105 u8* p = alp->d;
Jeej 8:afc331e53b7d 106
Jeej 8:afc331e53b7d 107 alp_parse_chunk(&p, &r);
Jeej 8:afc331e53b7d 108 memcpy(&istat, r.data, r.meta.itf.length);
Jeej 8:afc331e53b7d 109
Jeej 0:6703784ff93e 110 PRINT("%d: XCL:%02X ", nb, istat.addressee.xcl.byte);
Jeej 0:6703784ff93e 111 PRINT_DATA("UID:", "%02X", istat.addressee.id, 8, " ");
Jeej 0:6703784ff93e 112 PRINT("snr:%d rxlev:%d lb:%d ", istat.snr, istat.rxlev, istat.lb);
Jeej 8:afc331e53b7d 113
Jeej 8:afc331e53b7d 114 alp_payload_free(alp);
Jeej 8:afc331e53b7d 115 }
Jeej 8:afc331e53b7d 116 else
Jeej 8:afc331e53b7d 117 {
Jeej 8:afc331e53b7d 118 break;
Jeej 8:afc331e53b7d 119 }
Jeej 8:afc331e53b7d 120
Jeej 8:afc331e53b7d 121 alp = alp_payload_extract(&alp_rsp, ALP_OPCODE_RSP_F_DATA);
Jeej 8:afc331e53b7d 122
Jeej 8:afc331e53b7d 123 if (alp)
Jeej 8:afc331e53b7d 124 {
Jeej 8:afc331e53b7d 125 alp_parsed_chunk_t r;
Jeej 8:afc331e53b7d 126 u8* p = alp->d;
Jeej 8:afc331e53b7d 127
Jeej 8:afc331e53b7d 128 alp_parse_chunk(&p, &r);
Jeej 8:afc331e53b7d 129 memcpy(&fw_ver, r.data, r.meta.f_data.length);
Jeej 8:afc331e53b7d 130
Jeej 0:6703784ff93e 131 PRINT("v%d.%d.%d\n", fw_ver.major, fw_ver.minor, fw_ver.patch);
Jeej 0:6703784ff93e 132
Jeej 8:afc331e53b7d 133 alp_payload_free(alp);
Jeej 8:afc331e53b7d 134 }
Jeej 8:afc331e53b7d 135 else
Jeej 8:afc331e53b7d 136 {
Jeej 8:afc331e53b7d 137 break;
Jeej 0:6703784ff93e 138 }
Jeej 8:afc331e53b7d 139
Jeej 8:afc331e53b7d 140 FLUSH();
Jeej 8:afc331e53b7d 141 } while (1);
Jeej 8:afc331e53b7d 142
Jeej 8:afc331e53b7d 143 alp_payload_free(alp_rsp);
Jeej 0:6703784ff93e 144 }
Jeej 0:6703784ff93e 145
Jeej 0:6703784ff93e 146 PRINT("Done.\n");
Jeej 0:6703784ff93e 147 }
Jeej 0:6703784ff93e 148 }
Jeej 0:6703784ff93e 149
Jeej 8:afc331e53b7d 150 modem_ref_callbacks_t callbacks = {
Jeej 0:6703784ff93e 151 .read = my_read,
Jeej 0:6703784ff93e 152 .write = my_write,
Jeej 0:6703784ff93e 153 .read_fprop = my_read_fprop,
Jeej 0:6703784ff93e 154 .flush = my_flush,
Jeej 0:6703784ff93e 155 .remove = my_delete,
Jeej 0:6703784ff93e 156 .udata = my_udata,
Jeej 0:6703784ff93e 157 .lqual = my_lqual,
Jeej 0:6703784ff93e 158 .ldown = my_ldown,
Jeej 0:6703784ff93e 159 .reset = my_reset,
Jeej 0:6703784ff93e 160 .boot = my_boot
Jeej 0:6703784ff93e 161 };
Jeej 0:6703784ff93e 162
Jeej 0:6703784ff93e 163 /*** Main function ------------------------------------------------------------- ***/
Jeej 0:6703784ff93e 164 int main()
Jeej 0:6703784ff93e 165 {
Jeej 0:6703784ff93e 166 // Start & initialize
Jeej 0:6703784ff93e 167 #ifdef DEBUG_LED
Jeej 0:6703784ff93e 168 DBG_OPEN(DEBUG_LED);
Jeej 0:6703784ff93e 169 #else
Jeej 0:6703784ff93e 170 DBG_OPEN(NC);
Jeej 0:6703784ff93e 171 #endif
Jeej 0:6703784ff93e 172 PRINT("\n"
Jeej 0:6703784ff93e 173 "-----------------------------------------\n"
Jeej 3:c1a36c817c48 174 "------------- Demo D7A LoRa -------------\n"
Jeej 0:6703784ff93e 175 "-----------------------------------------\n");
Jeej 0:6703784ff93e 176
Jeej 8:afc331e53b7d 177 modem_open(&callbacks);
Jeej 0:6703784ff93e 178
Jeej 1:27716ee59ca4 179 // Put modem to listen to downlink access class
Jeej 8:afc331e53b7d 180 modem_write_file(D7A_FID_DLL_CFG, &XCL_DL, offsetof(d7a_dll_cfg_t, xcl), sizeof(d7a_xcl_t));
Jeej 1:27716ee59ca4 181
Jeej 8:afc331e53b7d 182 // Configure interface to use uplink access class
Jeej 8:afc331e53b7d 183 modem_write_file(IFID_REPORT, &XCL_UL, offsetof(alp_d7a_itf_t, cfg.addressee.xcl), sizeof(d7a_xcl_t));
Jeej 8:afc331e53b7d 184
Jeej 8:afc331e53b7d 185 #if 0
Jeej 1:27716ee59ca4 186 // Configure duty
Jeej 1:27716ee59ca4 187 d7a_ctf_t duty = { .byte = DUTY };
Jeej 1:27716ee59ca4 188 for (int i = 0; i < 8; i++)
Jeej 1:27716ee59ca4 189 {
Jeej 8:afc331e53b7d 190 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));
Jeej 1:27716ee59ca4 191 }
Jeej 1:27716ee59ca4 192
Jeej 1:27716ee59ca4 193 for (int i = 0; i < 8; i++)
Jeej 1:27716ee59ca4 194 {
Jeej 8:afc331e53b7d 195 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));
Jeej 1:27716ee59ca4 196 }
Jeej 8:afc331e53b7d 197 #endif
Jeej 0:6703784ff93e 198
Jeej 0:6703784ff93e 199 #ifdef DEBUG_BUTTON
Jeej 0:6703784ff93e 200 DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
Jeej 0:6703784ff93e 201 user_interrupt.attach(button_push_isr, IRQ_FALL, 500, true);
Jeej 0:6703784ff93e 202
Jeej 0:6703784ff93e 203 Thread but_th(osPriorityNormal, 2048, NULL);
Jeej 0:6703784ff93e 204 osStatus status = but_th.start(button_user_thread);
Jeej 0:6703784ff93e 205 ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status);
Jeej 0:6703784ff93e 206 #else
Jeej 0:6703784ff93e 207 #error You need a button to use this APP as is
Jeej 0:6703784ff93e 208 #endif
Jeej 0:6703784ff93e 209
Jeej 0:6703784ff93e 210 #ifdef DEBUG_LED
Jeej 0:6703784ff93e 211 DigitalOut my_led(DEBUG_LED);
Jeej 0:6703784ff93e 212 #endif
Jeej 0:6703784ff93e 213
Jeej 0:6703784ff93e 214 // Set main task to lowest priority
Jeej 5:8c7ce9a28169 215 osThreadSetPriority(osThreadGetId(), osPriorityLow);
Jeej 0:6703784ff93e 216 while(true)
Jeej 0:6703784ff93e 217 {
Jeej 5:8c7ce9a28169 218 ThisThread::sleep_for(500);
Jeej 0:6703784ff93e 219 #ifdef DEBUG_LED
Jeej 0:6703784ff93e 220 my_led = !my_led;
Jeej 0:6703784ff93e 221 #endif
Jeej 0:6703784ff93e 222 }
Jeej 0:6703784ff93e 223 }