Ping pong app demo.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Tue Sep 21 08:49:29 2021 +0000
Revision:
13:343ca4102739
Parent:
12:d621c88d5c49
Child:
14:8b8a61233e8d
Updated to new driver. still a fault to track.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:fa3fd69f8148 1 // @autor: jeremie@wizzilab.com
Jeej 0:fa3fd69f8148 2 // @date: 2017-05-02
Jeej 0:fa3fd69f8148 3
Jeej 0:fa3fd69f8148 4 #include "DebouncedInterrupt.h"
Jeej 13:343ca4102739 5 #include "modem_d7a.h"
Jeej 0:fa3fd69f8148 6 #include "modem_callbacks.h"
Jeej 0:fa3fd69f8148 7
Jeej 0:fa3fd69f8148 8 Semaphore button_user(0);
Jeej 13:343ca4102739 9 Queue<void, 8> g_udata;
Jeej 0:fa3fd69f8148 10
Jeej 0:fa3fd69f8148 11 typedef struct {
Jeej 0:fa3fd69f8148 12 Thread* thread;
Jeej 0:fa3fd69f8148 13 uint32_t count;
Jeej 0:fa3fd69f8148 14 d7a_addressee_t addressee;
Jeej 0:fa3fd69f8148 15 } ping_t;
Jeej 0:fa3fd69f8148 16
Jeej 0:fa3fd69f8148 17 #define FID_PING_PONG 128
Jeej 3:0979d8cba5ec 18 #define PING_DELAY 1000
Jeej 0:fa3fd69f8148 19 #define PING_COUNTER_SIZE sizeof(uint32_t)
Jeej 0:fa3fd69f8148 20 #define MAX_PING_NB MAX_USER_NB-2
Jeej 0:fa3fd69f8148 21
Jeej 3:0979d8cba5ec 22 // Special access classes for tests: no duty cycle limit, continuous scan
Jeej 3:0979d8cba5ec 23 // { .bf.s = 12, .bf.m = 1 }; --> High Rate
Jeej 3:0979d8cba5ec 24 // { .bf.s = 13, .bf.m = 1 }; --> Normal Rate
Jeej 3:0979d8cba5ec 25 // { .bf.s = 14, .bf.m = 1 }; --> Slow Rate
Jeej 3:0979d8cba5ec 26
Jeej 8:1b7101152a76 27 // Use Gateway access profile and its 2 subprofiles at the same time
Jeej 8:1b7101152a76 28 // Subprofile 0: 3 channels
Jeej 8:1b7101152a76 29 // Subprofile 1: 4 channels
Jeej 13:343ca4102739 30 d7a_xcl_t ping_pong_xcl = { .bf.s = 2, .bf.m = 0x2 };
Jeej 6:287a9759d70a 31
Jeej 6:287a9759d70a 32 // This describe the interface used for communication
Jeej 6:287a9759d70a 33 // Do not modify uncommented parameters
Jeej 0:fa3fd69f8148 34 alp_d7a_itf_t my_itf = {
Jeej 0:fa3fd69f8148 35 .type = ALP_ITF_TYPE_D7A,
Jeej 0:fa3fd69f8148 36 .cfg.to = 0,
Jeej 0:fa3fd69f8148 37 .cfg.te = 0,
Jeej 6:287a9759d70a 38 .cfg.qos.bf.resp = D7A_RESP_NO, // Communication protocol
Jeej 8:1b7101152a76 39 .cfg.qos.bf.retry = ALP_RPOL_ONESHOT, // Retry policy
Jeej 6:287a9759d70a 40 .cfg.addressee.ctrl.bf.nls = D7A_NLS_AES_CCM_64, // Security level
Jeej 6:287a9759d70a 41 .cfg.addressee.xcl = ping_pong_xcl, // Used Access Class
Jeej 6:287a9759d70a 42 // One of the followings:
Jeej 8:1b7101152a76 43 .cfg.addressee.ctrl.bf.idf = D7A_ID_NOID, // in Broadcast (same as D7A_ID_NBID with .cfg.addressee.id[0] = D7A_CTF_VAL(2,2) (32))
Jeej 6:287a9759d70a 44
Jeej 6:287a9759d70a 45 //.cfg.addressee.ctrl.bf.idf = D7A_ID_UID, // in Unicast
Jeej 6:287a9759d70a 46 //.cfg.addressee.id = { 0x00, 0x1B, 0xC5, 0x0C, 0x70, 0x00, 0x00, 0x00 }, // Destination UID
Jeej 6:287a9759d70a 47
Jeej 6:287a9759d70a 48 //.cfg.addressee.ctrl.bf.idf = D7A_ID_NBID, // in Broadcast
Jeej 9:63592df2faad 49 //.cfg.addressee.id[0] = D7A_CTF_ENCODE(4), // Estimation of expected responses (1 to 32)
Jeej 0:fa3fd69f8148 50 };
Jeej 0:fa3fd69f8148 51
Jeej 0:fa3fd69f8148 52 // Interrupt Service Routine on button press.
Jeej 0:fa3fd69f8148 53 void button_push_isr( void )
Jeej 0:fa3fd69f8148 54 {
Jeej 0:fa3fd69f8148 55 button_user.release();
Jeej 0:fa3fd69f8148 56 }
Jeej 0:fa3fd69f8148 57
Jeej 2:785b422c7d22 58 #ifdef DEBUG_LED
Jeej 0:fa3fd69f8148 59 DigitalOut my_led(DEBUG_LED);
Jeej 0:fa3fd69f8148 60 #endif
Jeej 0:fa3fd69f8148 61
Jeej 13:343ca4102739 62
Jeej 13:343ca4102739 63 void my_udata(alp_payload_t* alp)
Jeej 13:343ca4102739 64 {
Jeej 13:343ca4102739 65 g_udata.put((void*)alp);
Jeej 13:343ca4102739 66 }
Jeej 13:343ca4102739 67
Jeej 13:343ca4102739 68 void udata_thread()
Jeej 13:343ca4102739 69 {
Jeej 13:343ca4102739 70 alp_payload_t* alp;
Jeej 13:343ca4102739 71 alp_payload_t* alp_op;
Jeej 8:1b7101152a76 72 alp_parsed_chunk_t r;
Jeej 13:343ca4102739 73 u8* p;
Jeej 8:1b7101152a76 74 d7a_sp_res_t istat;
Jeej 13:343ca4102739 75 osEvent evt;
Jeej 13:343ca4102739 76
Jeej 13:343ca4102739 77 while (true)
Jeej 13:343ca4102739 78 {
Jeej 13:343ca4102739 79 evt = g_udata.get();
Jeej 13:343ca4102739 80 alp = (evt.status == osEventMessage)? (alp_payload_t*)evt.value.p : NULL;
Jeej 13:343ca4102739 81
Jeej 13:343ca4102739 82 //alp_payload_print(alp);
Jeej 13:343ca4102739 83
Jeej 13:343ca4102739 84 alp_op = alp_payload_get(alp, ALP_OPCODE_RSP_F_DATA);
Jeej 13:343ca4102739 85
Jeej 13:343ca4102739 86 if (alp_op)
Jeej 8:1b7101152a76 87 {
Jeej 13:343ca4102739 88 p = alp_op->d;
Jeej 13:343ca4102739 89
Jeej 13:343ca4102739 90 alp_parse_chunk(&p, &r);
Jeej 13:343ca4102739 91
Jeej 13:343ca4102739 92 if(FID_PING_PONG == r.meta.f_data.fid && 0 == r.meta.f_data.offset && PING_COUNTER_SIZE == r.meta.f_data.length)
Jeej 13:343ca4102739 93 {
Jeej 13:343ca4102739 94 uint32_t count;
Jeej 13:343ca4102739 95
Jeej 13:343ca4102739 96 // Get data
Jeej 13:343ca4102739 97 memcpy(&count, r.data, r.meta.f_data.length);
Jeej 13:343ca4102739 98
Jeej 13:343ca4102739 99 PRINT("Got PING %d", count);
Jeej 13:343ca4102739 100
Jeej 13:343ca4102739 101 // Get metadata
Jeej 13:343ca4102739 102 alp_op = alp_payload_get(alp, ALP_OPCODE_RSP_ISTATUS);
Jeej 13:343ca4102739 103
Jeej 13:343ca4102739 104 if (alp_op)
Jeej 8:1b7101152a76 105 {
Jeej 13:343ca4102739 106 p = alp_op->d;
Jeej 13:343ca4102739 107
Jeej 13:343ca4102739 108 alp_parse_chunk(&p, &r);
Jeej 13:343ca4102739 109 memcpy(&istat, r.data, r.meta.itf.length);
Jeej 13:343ca4102739 110
Jeej 13:343ca4102739 111 PRINT_DATA(" from ", "%02X", istat.addressee.id, 8, "");
Jeej 13:343ca4102739 112 PRINT(" (SNR:%d dB RXLEV:%d dBm LB:%d dB)\n", istat.snr, -istat.rxlev, istat.lb);
Jeej 8:1b7101152a76 113 }
Jeej 8:1b7101152a76 114 else
Jeej 8:1b7101152a76 115 {
Jeej 13:343ca4102739 116 PRINT(" No istat!\n");
Jeej 13:343ca4102739 117 alp_payload_free(alp);
Jeej 13:343ca4102739 118 continue;
Jeej 8:1b7101152a76 119 }
Jeej 13:343ca4102739 120
Jeej 13:343ca4102739 121 #ifdef DEBUG_LED
Jeej 13:343ca4102739 122 my_led = 1;
Jeej 13:343ca4102739 123 #endif
Jeej 13:343ca4102739 124
Jeej 13:343ca4102739 125 ThisThread::sleep_for(PING_DELAY);
Jeej 13:343ca4102739 126
Jeej 13:343ca4102739 127 #ifdef DEBUG_LED
Jeej 13:343ca4102739 128 my_led = 0;
Jeej 13:343ca4102739 129 #endif
Jeej 8:1b7101152a76 130
Jeej 13:343ca4102739 131 alp_d7a_itf_t resp_itf = {
Jeej 13:343ca4102739 132 .type = ALP_ITF_TYPE_D7A,
Jeej 13:343ca4102739 133 .cfg.to = D7A_CTF(0),
Jeej 13:343ca4102739 134 .cfg.te = D7A_CTF(0),
Jeej 13:343ca4102739 135 .cfg.qos.bf.resp = D7A_RESP_NO,
Jeej 13:343ca4102739 136 .cfg.qos.bf.retry = ALP_RPOL_ONESHOT,
Jeej 13:343ca4102739 137 .cfg.addressee = istat.addressee,
Jeej 13:343ca4102739 138 };
Jeej 13:343ca4102739 139
Jeej 13:343ca4102739 140 count++;
Jeej 13:343ca4102739 141
Jeej 13:343ca4102739 142 // Send ping
Jeej 13:343ca4102739 143 PRINT("Send PING %d", count);
Jeej 13:343ca4102739 144 PRINT_DATA(" to ", "%02X", resp_itf.cfg.addressee.id, 8, "\n");
Jeej 13:343ca4102739 145
Jeej 13:343ca4102739 146 // Build payload
Jeej 13:343ca4102739 147 alp_op = NULL;
Jeej 13:343ca4102739 148 alp_op = alp_payload_rsp_f_data(alp_op, FID_PING_PONG, &count, 0, PING_COUNTER_SIZE);
Jeej 13:343ca4102739 149 // Send
Jeej 13:343ca4102739 150 modem_remote_raw_alp((void*)&resp_itf, alp_op, NULL);
Jeej 13:343ca4102739 151 }
Jeej 3:0979d8cba5ec 152 }
Jeej 13:343ca4102739 153
Jeej 13:343ca4102739 154 alp_payload_free(alp);
Jeej 13:343ca4102739 155 }
Jeej 0:fa3fd69f8148 156 }
Jeej 0:fa3fd69f8148 157
Jeej 0:fa3fd69f8148 158 void button_user_thread()
Jeej 0:fa3fd69f8148 159 {
Jeej 13:343ca4102739 160 alp_payload_t* alp;
Jeej 0:fa3fd69f8148 161 uint32_t ping = 0;
Jeej 0:fa3fd69f8148 162
Jeej 0:fa3fd69f8148 163 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:fa3fd69f8148 164
Jeej 0:fa3fd69f8148 165 while (true)
Jeej 0:fa3fd69f8148 166 {
Jeej 0:fa3fd69f8148 167 // Wait for button press
Jeej 3:0979d8cba5ec 168 PRINT("PRESS BUTTON TO INITIATE PING...\n");
Jeej 10:b69fe2a98432 169 button_user.acquire();
Jeej 0:fa3fd69f8148 170
Jeej 0:fa3fd69f8148 171 // Initiate ping
Jeej 0:fa3fd69f8148 172 PRINT("Initiate PING\n");
Jeej 13:343ca4102739 173
Jeej 13:343ca4102739 174 // Build payload
Jeej 13:343ca4102739 175 alp = NULL;
Jeej 13:343ca4102739 176 alp = alp_payload_rsp_f_data(alp, FID_PING_PONG, &ping, 0, PING_COUNTER_SIZE);
Jeej 13:343ca4102739 177 // Send
Jeej 13:343ca4102739 178 modem_remote_raw_alp((void*)&my_itf, alp, NULL);
Jeej 0:fa3fd69f8148 179 }
Jeej 0:fa3fd69f8148 180 }
Jeej 0:fa3fd69f8148 181
Jeej 13:343ca4102739 182 modem_ref_callbacks_t callbacks = {
Jeej 0:fa3fd69f8148 183 .read = my_read,
Jeej 0:fa3fd69f8148 184 .write = my_write,
Jeej 0:fa3fd69f8148 185 .read_fprop = my_read_fprop,
Jeej 0:fa3fd69f8148 186 .flush = my_flush,
Jeej 0:fa3fd69f8148 187 .remove = my_delete,
Jeej 0:fa3fd69f8148 188 .udata = my_udata,
Jeej 0:fa3fd69f8148 189 .lqual = my_lqual,
Jeej 0:fa3fd69f8148 190 .ldown = my_ldown,
Jeej 0:fa3fd69f8148 191 .reset = my_reset,
Jeej 8:1b7101152a76 192 .boot = my_boot,
Jeej 8:1b7101152a76 193 .busy = my_busy,
Jeej 0:fa3fd69f8148 194 };
Jeej 0:fa3fd69f8148 195
Jeej 0:fa3fd69f8148 196 /*** Main function ------------------------------------------------------------- ***/
Jeej 0:fa3fd69f8148 197 int main()
Jeej 0:fa3fd69f8148 198 {
Jeej 0:fa3fd69f8148 199 // Start & initialize
Jeej 2:785b422c7d22 200 #ifdef DEBUG_LED
Jeej 0:fa3fd69f8148 201 DBG_OPEN(DEBUG_LED);
Jeej 2:785b422c7d22 202 #else
Jeej 2:785b422c7d22 203 DBG_OPEN(NC);
Jeej 2:785b422c7d22 204 #endif
Jeej 3:0979d8cba5ec 205 PRINT("\n"
Jeej 3:0979d8cba5ec 206 "-----------------------------------------\n"
Jeej 3:0979d8cba5ec 207 "------------ Demo Ping Pong -------------\n"
Jeej 3:0979d8cba5ec 208 "-----------------------------------------\n");
Jeej 3:0979d8cba5ec 209
Jeej 0:fa3fd69f8148 210 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:fa3fd69f8148 211
Jeej 13:343ca4102739 212 modem_open(&callbacks);
Jeej 1:4629ccf8315d 213
Jeej 0:fa3fd69f8148 214 // Put modem to listen to this access class
Jeej 13:343ca4102739 215 modem_write_file(D7A_FID_DLL_CFG, &ping_pong_xcl, offsetof(d7a_dll_cfg_t, xcl), sizeof(d7a_xcl_t));
Jeej 0:fa3fd69f8148 216
Jeej 0:fa3fd69f8148 217 PRINT("Start D7A Stack\n");
Jeej 13:343ca4102739 218 modem_d7a_enable_itf();
Jeej 13:343ca4102739 219
Jeej 13:343ca4102739 220 Thread udata_th(osPriorityNormal, 1024, NULL);
Jeej 13:343ca4102739 221 osStatus status = udata_th.start(udata_thread);
Jeej 13:343ca4102739 222 ASSERT(status == osOK, "Failed to start udata thread (err: %d)\r\n", status);
Jeej 0:fa3fd69f8148 223
Jeej 0:fa3fd69f8148 224 #ifdef DEBUG_BUTTON
Jeej 0:fa3fd69f8148 225 DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
Jeej 0:fa3fd69f8148 226 user_interrupt.attach(button_push_isr, IRQ_FALL, 500, true);
Jeej 0:fa3fd69f8148 227
Jeej 0:fa3fd69f8148 228 Thread but_th(osPriorityNormal, 1024, NULL);
Jeej 13:343ca4102739 229 status = but_th.start(button_user_thread);
Jeej 0:fa3fd69f8148 230 ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status);
Jeej 0:fa3fd69f8148 231 #endif
Jeej 0:fa3fd69f8148 232
Jeej 0:fa3fd69f8148 233 // Set main task to lowest priority
Jeej 10:b69fe2a98432 234 osThreadSetPriority(osThreadGetId(), osPriorityLow);
Jeej 0:fa3fd69f8148 235 while(true)
Jeej 0:fa3fd69f8148 236 {
Jeej 10:b69fe2a98432 237 ThisThread::sleep_for(500);
Jeej 0:fa3fd69f8148 238 }
Jeej 0:fa3fd69f8148 239 }