Broadcast read demo.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Tue Aug 20 13:53:52 2019 +0000
Revision:
16:00674cd67032
Parent:
15:5e73c5c284d4
Child:
17:0a6631f918a5
WizziCom now uses DMA instead of interrupts.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:cc947267028b 1 // @autor: jeremie@wizzilab.com
Jeej 0:cc947267028b 2 // @date: 2017-05-02
Jeej 0:cc947267028b 3
Jeej 0:cc947267028b 4 #include "DebouncedInterrupt.h"
Jeej 4:94bfd123f8e6 5 #include "modem_ref_helper.h"
Jeej 0:cc947267028b 6 #include "modem_callbacks.h"
Jeej 0:cc947267028b 7
Jeej 0:cc947267028b 8 Semaphore button_user(0);
Jeej 4:94bfd123f8e6 9 Semaphore modem_ready(0);
Jeej 0:cc947267028b 10 Queue<void, 8> modem_resp;
Jeej 0:cc947267028b 11
Jeej 0:cc947267028b 12 enum {
Jeej 0:cc947267028b 13 MODEM_RESP_NO,
Jeej 0:cc947267028b 14 MODEM_RESP_TERMINAL,
Jeej 0:cc947267028b 15 MODEM_RESP_DONE,
Jeej 0:cc947267028b 16 };
Jeej 0:cc947267028b 17
Jeej 0:cc947267028b 18 alp_d7a_itf_t my_itf = {
Jeej 0:cc947267028b 19 .type = ALP_ITF_TYPE_D7A,
Jeej 0:cc947267028b 20 .cfg.to = 0,
Jeej 0:cc947267028b 21 .cfg.te = 0,
Jeej 0:cc947267028b 22 .cfg.qos.bf.resp = D7A_RESP_ALL,
Jeej 11:22ba8d277699 23 .cfg.qos.bf.retry = ALP_RPOL_ONESHOT,
Jeej 0:cc947267028b 24 .cfg.addressee.ctrl.bf.nls = D7A_NLS_AES_CCM_64,
Jeej 0:cc947267028b 25 .cfg.addressee.ctrl.bf.idf = D7A_ID_NBID,
Jeej 12:5e1fd1a5580a 26 .cfg.addressee.xcl.bf = {.s = 2, .m = 0x1},// XXX D7A_XCL_GW,
Jeej 12:5e1fd1a5580a 27 .cfg.addressee.id[0] = D7A_CTF_ENCODE(8),
Jeej 0:cc947267028b 28 };
Jeej 0:cc947267028b 29
Jeej 0:cc947267028b 30 // Callback for broadcast read
Jeej 0:cc947267028b 31 void my_read_response_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:cc947267028b 32 {
Jeej 0:cc947267028b 33 (void)id;
Jeej 0:cc947267028b 34
Jeej 12:5e1fd1a5580a 35 if (ALP_ERR_NONE != err)
Jeej 12:5e1fd1a5580a 36 {
Jeej 12:5e1fd1a5580a 37 modem_print_error(ALP_ITF_TYPE_D7A, err);
Jeej 12:5e1fd1a5580a 38 }
Jeej 12:5e1fd1a5580a 39
Jeej 0:cc947267028b 40 if (terminal)
Jeej 0:cc947267028b 41 {
Jeej 0:cc947267028b 42 modem_resp.put((void*)MODEM_RESP_TERMINAL);
Jeej 0:cc947267028b 43 }
Jeej 0:cc947267028b 44 else
Jeej 0:cc947267028b 45 {
Jeej 0:cc947267028b 46 if (ALP_ERR_NONE == err)
Jeej 0:cc947267028b 47 {
Jeej 0:cc947267028b 48 modem_resp.put((void*)MODEM_RESP_DONE);
Jeej 0:cc947267028b 49 }
Jeej 0:cc947267028b 50 }
Jeej 0:cc947267028b 51 }
Jeej 0:cc947267028b 52
Jeej 0:cc947267028b 53 // Interrupt Service Routine on button press.
Jeej 0:cc947267028b 54 void button_push_isr( void )
Jeej 0:cc947267028b 55 {
Jeej 0:cc947267028b 56 button_user.release();
Jeej 0:cc947267028b 57 }
Jeej 0:cc947267028b 58
Jeej 0:cc947267028b 59 void button_user_thread()
Jeej 0:cc947267028b 60 {
Jeej 4:94bfd123f8e6 61 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 4:94bfd123f8e6 62
Jeej 0:cc947267028b 63 osEvent evt;
Jeej 0:cc947267028b 64 uint32_t resp;
Jeej 0:cc947267028b 65 d7a_sp_res_t istat;
Jeej 0:cc947267028b 66 fw_version_t fw_ver;
Jeej 1:5ddd7f4db10d 67 uint8_t nb = 0;
Jeej 0:cc947267028b 68
Jeej 11:22ba8d277699 69 uint8_t id = modem_get_id(my_read_response_callback);
Jeej 4:94bfd123f8e6 70
Jeej 5:c39a1bb57cf3 71 uint8_t scan_xcl[] = { 0x01, 0x21 };
Jeej 0:cc947267028b 72
Jeej 2:4629eacf9851 73 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 2:4629eacf9851 74 memset(&fw_ver, 0, sizeof(fw_version_t));
Jeej 2:4629eacf9851 75
Jeej 0:cc947267028b 76 while (true)
Jeej 0:cc947267028b 77 {
Jeej 0:cc947267028b 78 // Wait for button press
Jeej 9:8f4e03d45e1e 79 PRINT("Press button to scan...\r\n");
Jeej 15:5e73c5c284d4 80 button_user.acquire();
Jeej 0:cc947267028b 81
Jeej 0:cc947267028b 82 for (uint8_t i = 0; i < sizeof(scan_xcl); i++)
Jeej 0:cc947267028b 83 {
Jeej 1:5ddd7f4db10d 84 nb = 0;
Jeej 0:cc947267028b 85 my_itf.cfg.addressee.xcl.byte = scan_xcl[i];
Jeej 0:cc947267028b 86
Jeej 1:5ddd7f4db10d 87 PRINT("Scanning XCL 0x%02X...\n", my_itf.cfg.addressee.xcl.byte);
Jeej 1:5ddd7f4db10d 88
Jeej 11:22ba8d277699 89 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:cc947267028b 90
Jeej 0:cc947267028b 91 do
Jeej 0:cc947267028b 92 {
Jeej 0:cc947267028b 93 evt = modem_resp.get();
Jeej 2:4629eacf9851 94 resp = (evt.status == osEventMessage)? (uint32_t)evt.value.p : MODEM_RESP_NO;
Jeej 0:cc947267028b 95
Jeej 0:cc947267028b 96 if (MODEM_RESP_DONE == resp)
Jeej 0:cc947267028b 97 {
Jeej 1:5ddd7f4db10d 98 nb++;
Jeej 1:5ddd7f4db10d 99 PRINT("%d: XCL:%02X ", nb, istat.addressee.xcl.byte);
Jeej 1:5ddd7f4db10d 100 PRINT_DATA("UID:", "%02X", istat.addressee.id, 8, " ");
Jeej 6:8e8ca94f61a4 101 PRINT("snr:%d rxlev:%d lb:%d ", istat.snr, istat.rxlev, istat.lb);
Jeej 1:5ddd7f4db10d 102 PRINT("v%d.%d.%d\n", fw_ver.major, fw_ver.minor, fw_ver.patch);
Jeej 2:4629eacf9851 103
Jeej 2:4629eacf9851 104 // Reset variables
Jeej 2:4629eacf9851 105 memset(&istat, 0, sizeof(d7a_sp_res_t));
Jeej 2:4629eacf9851 106 memset(&fw_ver, 0, sizeof(fw_version_t));
Jeej 2:4629eacf9851 107 }
Jeej 1:5ddd7f4db10d 108
Jeej 0:cc947267028b 109 } while (MODEM_RESP_TERMINAL != resp);
Jeej 0:cc947267028b 110 }
Jeej 0:cc947267028b 111
Jeej 1:5ddd7f4db10d 112 PRINT("Done.\n");
Jeej 0:cc947267028b 113 }
Jeej 0:cc947267028b 114 }
Jeej 0:cc947267028b 115
Jeej 0:cc947267028b 116 modem_callbacks_t callbacks = {
Jeej 0:cc947267028b 117 .read = my_read,
Jeej 0:cc947267028b 118 .write = my_write,
Jeej 0:cc947267028b 119 .read_fprop = my_read_fprop,
Jeej 0:cc947267028b 120 .flush = my_flush,
Jeej 0:cc947267028b 121 .remove = my_delete,
Jeej 4:94bfd123f8e6 122 .udata = my_udata,
Jeej 0:cc947267028b 123 .lqual = my_lqual,
Jeej 0:cc947267028b 124 .ldown = my_ldown,
Jeej 0:cc947267028b 125 .reset = my_reset,
Jeej 11:22ba8d277699 126 .boot = my_boot,
Jeej 11:22ba8d277699 127 .busy = my_busy,
Jeej 15:5e73c5c284d4 128 .itf_busy = NULL,
Jeej 0:cc947267028b 129 };
Jeej 0:cc947267028b 130
Jeej 11:22ba8d277699 131 // Callback for id User
Jeej 0:cc947267028b 132 void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:cc947267028b 133 {
Jeej 0:cc947267028b 134 (void)id;
Jeej 0:cc947267028b 135
Jeej 12:5e1fd1a5580a 136 if (ALP_ERR_NONE != err)
Jeej 12:5e1fd1a5580a 137 {
Jeej 12:5e1fd1a5580a 138 modem_print_error(ALP_ITF_TYPE_D7A, err);
Jeej 12:5e1fd1a5580a 139 }
Jeej 12:5e1fd1a5580a 140
Jeej 0:cc947267028b 141 if (terminal)
Jeej 0:cc947267028b 142 {
Jeej 4:94bfd123f8e6 143 modem_ready.release();
Jeej 0:cc947267028b 144 }
Jeej 0:cc947267028b 145 }
Jeej 0:cc947267028b 146
Jeej 0:cc947267028b 147 /*** Main function ------------------------------------------------------------- ***/
Jeej 0:cc947267028b 148 int main()
Jeej 0:cc947267028b 149 {
Jeej 0:cc947267028b 150 // Start & initialize
Jeej 4:94bfd123f8e6 151 #ifdef DEBUG_LED
Jeej 0:cc947267028b 152 DBG_OPEN(DEBUG_LED);
Jeej 4:94bfd123f8e6 153 #else
Jeej 4:94bfd123f8e6 154 DBG_OPEN(NC);
Jeej 4:94bfd123f8e6 155 #endif
Jeej 7:93ad76eebd33 156 PRINT("\n"
Jeej 7:93ad76eebd33 157 "-----------------------------------------\n"
Jeej 7:93ad76eebd33 158 "--------- Demo ActiveRFIDReader ---------\n"
Jeej 7:93ad76eebd33 159 "-----------------------------------------\n");
Jeej 7:93ad76eebd33 160
Jeej 0:cc947267028b 161 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:cc947267028b 162
Jeej 4:94bfd123f8e6 163 modem_helper_open(&callbacks);
Jeej 0:cc947267028b 164
Jeej 11:22ba8d277699 165 uint8_t id = modem_get_id(my_main_callback);
Jeej 3:a240b300fae9 166
Jeej 0:cc947267028b 167 // Configure URC: LQUAL on report file notification every 10 reports
Jeej 0:cc947267028b 168 PRINT("Setup URCs\n");
Jeej 11:22ba8d277699 169 modem_enable_urc(ALP_URC_TYPE_LQUAL, IFID_REPORT, 10, true, id);
Jeej 15:5e73c5c284d4 170 modem_ready.acquire();
Jeej 0:cc947267028b 171
Jeej 0:cc947267028b 172 PRINT("Start D7A Stack\n");
Jeej 13:121c7447c4fa 173 modem_activate_itf(ALP_ITF_TYPE_D7A, 24, 0, ALP_D7A_ISTAT_RESP | ALP_D7A_ISTAT_UNS | ALP_D7A_ISTAT_EOP, true, id);
Jeej 15:5e73c5c284d4 174 modem_ready.acquire();
Jeej 11:22ba8d277699 175
Jeej 11:22ba8d277699 176 modem_free_id(id);
Jeej 0:cc947267028b 177
Jeej 0:cc947267028b 178 #ifdef DEBUG_BUTTON
Jeej 0:cc947267028b 179 DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
Jeej 0:cc947267028b 180 user_interrupt.attach(button_push_isr, IRQ_FALL, 500, true);
Jeej 0:cc947267028b 181
Jeej 0:cc947267028b 182 Thread but_th(osPriorityNormal, 2048, NULL);
Jeej 0:cc947267028b 183 osStatus status = but_th.start(button_user_thread);
Jeej 0:cc947267028b 184 ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status);
Jeej 4:94bfd123f8e6 185 #else
Jeej 4:94bfd123f8e6 186 #error You need a button to use this APP as is
Jeej 0:cc947267028b 187 #endif
Jeej 0:cc947267028b 188
Jeej 4:94bfd123f8e6 189 #ifdef DEBUG_LED
Jeej 0:cc947267028b 190 DigitalOut my_led(DEBUG_LED);
Jeej 0:cc947267028b 191 #endif
Jeej 0:cc947267028b 192
Jeej 0:cc947267028b 193 // Set main task to lowest priority
Jeej 15:5e73c5c284d4 194 osThreadSetPriority(osThreadGetId(), osPriorityLow);
Jeej 0:cc947267028b 195 while(true)
Jeej 0:cc947267028b 196 {
Jeej 15:5e73c5c284d4 197 ThisThread::sleep_for(500);
Jeej 4:94bfd123f8e6 198 #ifdef DEBUG_LED
Jeej 0:cc947267028b 199 my_led = !my_led;
Jeej 0:cc947267028b 200 #endif
Jeej 0:cc947267028b 201 }
Jeej 0:cc947267028b 202 }