Hitra implementacija sistema za sledenje v realnem času

Revija logo digikey 300x150 - Hitra implementacija sistema za sledenje v realnem časuDigi-Key Electronics
Avtor: Rich Miron
2018_265_20

Radiolokacijski sistemi so postali povsem običajen del sodobnih mobilnih elektronskih naprav. Sistemi za sledenje v realnem času (RTLS), ki temeljijo na ultra širokopasovni (UWB) radiofrekvenčni komunikaciji, imajo ključno vlogo pri zagotavljanju razpoložljivih podatkov o lokaciji, kadar običajnejše tehnologije, kot je GPS, ne morejo zagotoviti pokritosti s signalom.

Zaradi naraščajočega povpraševanja po natančnejših sistemih RTLS so se razvijalci znašli ujeti v kompleksnosti zelo natančnih metod, kot sta dvosmerno merjenje razdalje in merjenje časovne razlike prihodov (TDOA).

Vgrajeni modul in programska oprema Decawave razvijalcem ponujata preprostejšo rešitev za sisteme RTLS, ki zagotavlja natančnejše lokalizacijske rezultate z minimalnim naporom.

V tem članku so najprej opisane aplikacije in algoritmi sistemov RTLS, vključno z metodo dvosmernega merjenja razdalje in metodo TDOA, ter implementacijski kompromisi, povezani z različnimi metodami sistemov RTLS. Nato je predstavljena sprejemno-oddajna enota UWB Decawave, pri čemer so poudarjene posebne zahteve glede izdelave zasnov s to enoto, na koncu članka pa sta obravnavana arhitektura programske opreme Decawave in razvoj priložene vdelane programske opreme, pri čemer so opisane posebne tehnike za razvijanje uporabniških aplikacij na platformi Decawave.

Vloga sistemov RTLS

Natančni sistemi RTLS so se razvili v učinkovito metodo za določanje lokacije ali sledenje ljudem oziroma mobilnim sredstvom v pisarnah, skladiščih, proizvodnih obratih in na tekočih trakih. Pri tem pristopu mobilni predmet (oznaka) izmenja podatke z napravami s fiksnim položajem (sidra) prek standardnih formatov in tehnologij UWB, določenih v standardu IEEE 802.15.4-2011 za osebna brezžična omrežja z nizko hitrostjo prenosa podatkov (LR-WPAN). Z ugotavljanjem razdalje med oznako in več sidri lahko aplikacije določijo relativen položaj oznake glede na znana sidra ter s tem absolutni položaj oznake.

Metode za sisteme RTLS

Aplikacije RTLS uporabljajo številne tehnike za določanje razdalje. Pri najpreprostejšem pristopu lahko aplikacija ali oznaka uporabi parameter indikatorja moči sprejetega signala (RSSI), ki je na voljo pri večini sprejemno-oddajnih enot, da oceni relativno lokacijo oznake glede na oddajna sidra. Zaradi številnih dejavnikov, ki lahko vplivajo na proračun povezave, lahko ta pristop kvečjemu zagotovi le približno oceno položaja, v nasprotju s tem pa številne nove aplikacije, ki temeljijo na sistemih RTLS, zahtevajo določanje absolutne lokacije na nekaj centimetrov natančno.

Zelo natančni sistemi RTLS uporabljajo metode časa preleta, na katere večinoma ne vplivajo bistvene spremembe moči radiofrekvenčnega signala. Pri tem pristopu je lokacijo oznake mogoče določiti z meritvijo časa, v katerem se radiofrekvenčni signal prenese od oznake do več sider. Z uporabo znane zakasnitve razširjanja radiofrekvenčnih signalov prek zraka lahko aplikacije sistemov RTLS čas preleta pretvorijo v razdaljo.

Vzemimo za primer čas preleta med oznako in vsako od treh sider, za katerega se izkaže, da je povsem enak. Do tega lahko pride samo, če je oznaka od vseh treh sider enako oddaljena. Ker aplikacija pozna točno lokacijo posameznega sidra, lahko določi absolutno lokacijo oznake.

Vendar če želi sprejemnik sidra izmeriti čas zakasnitve razširjanja na oddajniku oznake, mora uporabiti enako časovno bazo kot oznaka, da bi pravilno ocenil podatke o času, vdelane v sporočilu oznake. Če časovna baza sidra zaostaja za časovno bazo oznake ali jo prehiteva, bo izračunana razdalja krajša oziroma daljša od dejanske razdalje.

Ena od metod za sisteme RTLS to težavo rešuje z neposrednim pristopom, in sicer s časovno sinhronizacijo oddajnika oznake in sprejemnika sidra, pri čemer zagotovi, da vsako sidro prejme sporočilo z enako časovno bazo kot oznaka. Implementacija časovne sinhronizacije je v najboljšem primeru lahko izziv, v aplikacijah sistemov RTLS, v katerih se oznake premikajo, pa je preprosto nepraktična.

Druga metoda, TDOA, pa sinhronizira samo sidra, pri čemer odpravi težavo, povezano s sinhronizacijo mobilnih oznak. Aplikacija sistema RTLS za določanje lokacije uporablja razlike med časi prihodov signala oznake, izmerjenih v več sidrih. Upoštevajte na primer zgornji primer s tremi sidri (A1, A2 in A3), razporejenimi tako, da so enako oddaljena od oznake. Če se po premiku oznake izkaže, da je TDOA za posamezno sidro 0, 1 nanosekunda (ns) in 0, pomeni, da se je oznaka premaknila stran od sidra A2 v neposredni liniji za približno 30 centimetrov (cm) (ob predvidevanju, da zakasnitev radiofrekvenčnega razširjanja poteka pri svetlobni hitrosti). Zahteva metode TDOA za sinhronizacijo sider je precej manj zahtevna težava kot poskus sinhronizacije sider in oznak. Kljub temu je natančnost tega pristopa odvisna od zelo natančne sinhronizacije. Že ena nanosekunda razlike pri sinhronizaciji lahko pomeni več centimetrov razlike pri merjenju lokacije.

Dvosmerno merjenje razdalje

Metode dvosmernega merjenja razdalje za sisteme RTLS povsem odpravljajo potrebo po natančni sinhronizaciji časa, vendar zahtevajo zmogljivost prenosa podatkov v oznaki. Ta pristop se izogne negotovosti različnih časovnih baz, tako da oznaki in sidrom omogoči medsebojno izmenjavo podatkov o času. Namesto sinhronizacije časovnih baz oznaka in sidra uporabljajo protokol kratkih dvosmernih sporočil, ki omogoča natančno določanje časa preleta in izračun lokacije oznake.

S tem pristopom odda oznaka kratek identifikacijski signal in tako sporoči svojo prisotnost sidrom v bližini. Vsako sidro, ki sprejme začetno identifikacijsko sporočilo oznake, vzpostavi z oznako kratko dvosmerno izmenjavo podatkov, na podlagi katerih določi čas preleta ne glede na razlike časovnih baz v sidrih in oznaki.

V protokolu dvosmernega merjenja razdalje za sisteme RTLS podjetja Decawave je ta postopek opredeljen v smislu faze odkrivanja in faze merjenja razdalje (slika 1). Med odkrivanjem oznaka redno oddaja kratek identifikacijski signal oziroma utrip in čaka na odziv sidra. Po tem, ko oznaka in sidro prepoznata drug drugega, seznanjena oznaka in sidro uporabita kratko dvosmerno izmenjavo sporočil, ki vsebujejo podatke, potrebne za izračun razdalje.

Čeprav so izzivi, povezani z implementacijo teh natančno usklajenih protokolov za izmenjavo sporočil in njihovih temeljnih radijskih podsistemov UWB, za razvijalce lahko zastrašujoči, jim uporaba modula Decawave DWM1001 omogoča, da lahko svojim aplikacijam hitro dodajo zmogljivost natančnih sistemov RTLS z malo napora.

Vgrajeni modul za sisteme RTLS

Modul Decawave DWM1001 z vgrajeno sprejemno-oddajno enoto UWB Decawave DW1000 ter brezžičnim mikrokontrolerjem Nordic Semiconductor NRF52832 in 3-osnim senzorjem gibanja STMicroelectronics LIS2DH12 zagotavlja celovito implementacijo sistema RTLS. Sprejemno-oddajna enota DW1000 omogoča prenos radiofrekvenčnih signalov v skladu s standardom IEEE 802.15.4-2011, mikrokontroler NRF52832 uporablja vdelano programsko opremo za aplikacije sistemov RTLS, senzor LIS2DH12 pa ima pomembno vlogo pri upravljanju porabe energije.

V poljubni napredni radiofrekvenčni aplikaciji, zlasti v mobilnih aplikacijah, ki zahtevajo najmanjšo zasedeno površino in porabo energije, radiofrekvenčna zasnova običajno prinaša največje izzive. Modul DWM1001 odpravlja te težave tako, da povsem izkoristi prednost vgrajene radiofrekvenčne zasnove, ki jo zagotavlja sprejemno-oddajna enota DW1000 (slika 2).

Naprava DW1000 ponuja celovito sprejemno-oddajno enoto UWB, opremljeno z radiofrekvenčnim prilagoditvenim vezjem, ki lahko podpira šest kanalov, skladnih s standardom IEEE802.15.4-2011, s frekvenčnim razponom od 3,5 GHz do 6,5 GHz pri običajnih bitnih hitrostih 110 kbit/s, 850 kbit/s in 6,81 Mbit/s. Digitalni krmilni podsistem, vgrajen v napravo, upravlja sprejemno-oddajno enoto in z določanjem lokacije na 10 cm natančno podpira tako dvosmerno merjenje razdalje kot sisteme RTLS z metodo TDOA. Vgrajeni programabilni bralni pomnilnik (OTP) raziskovalcem omogoča shranjevanje podatkov, uporabljenih za kalibracijo in odpravo napak, vedno aktivni pomnilnik (AON), ki ga je mogoče konfigurirati, pa med stanji nizke porabe energije, ki so opisani spodaj, ohrani konfiguracijske podatke.

Naprava med delovanjem oddaja in sprejema okvire, skladne s standardom IEEE802.15.4-2011, ki zajemajo sinhronizacijsko glavo (SHR), glavo fizične plasti (PHR) in do vključno 127 bajtov podatkov, ki tvorijo splošno storitveno podatkovno enoto fizične plasti (PSDU). Poleg običajnih okvirov naprava podpira tudi lastniški format okvirov, ki zagotavlja do vključno 1023 podatkovnih bajtov za aplikacije, ki morajo pošiljati večje podatkovne koristne vsebine in zanje ni zahtevana skladnost s standardom IEEE802.15.4-2011.

Za skladne aplikacije lahko razvijalci izbirajo med številnimi načini delovanja z vnaprej nastavljenimi kombinacijami hitrosti podatkov, velikosti koristne vsebine in dolžine uvodnega niza, ki so vnaprej konfigurirani zato, da izpolnijo zahteve posebnih primerov uporabe za dvosmerno merjenje razdalje in načine delovanja po metodi TDOA. Načini, namenjeni za aplikacije dolgega dosega, združujejo nizko hitrost podatkov ter dolge uvodne nize, ki olajšujejo odkritje in merjenje razdalje v primeru motenj ali slabega signala, načini z visoko hitrostjo podatkov in kratkimi uvodnimi nizi pa podpirajo aplikacije kratkega dosega. Drugi načini podpirajo lastnosti dolgega in kratkega dosega s podatkovnimi koristnimi vsebinami različnih velikosti.

Zmanjšanje porabe energije

V praksi se razvijalci odločajo za načine delovanja z najmanjšo možno velikostjo okvirov, da zmanjšajo splošno porabo energije na najnižjo raven in napravo hitro vrnejo v stanje nizke porabe energije. Sprejemno-oddajna enota DW1000 ponuja številne načine nizke porabe energije. Napravo je mogoče nastaviti tako, da kadar ni dejavna, deluje v načinu nedejavnosti, v katerem porabi le 19 miliamperov (mA), v primeru dolgotrajne nedejavnosti pa razvijalci lahko nastavijo napravo na način mirovanja z nizko porabo energije, v katerem naprava porabi le približno 1 mikroamper (μA), ali način globokega mirovanja, v katerem naprava porabi največ 100 nanoamperov (nA) (običajno 50 nA).

Vendar za radiofrekvenčne zasnove velja, da se med delovanjem sprejemno-oddajne enote poraba energije znatno poveča. V primeru pošiljanja okvira, skladnega s standardom IEEE802.15.4-2011, so za večino porabljene energije odgovorne komponente z daljšim okvirom, kot sta sinhronizacijska glava in podatkovni paket (slika 3).
Dodaten izziv za zasnove z omejeno porabo energije je še večja poraba energije, povezana z delovanjem sprejemno-oddajne enote (slika 4). Čeprav lahko razvijalci napravo DW1000 programirajo tako, da se po prenosu ali prejemu podatkov vrne v eno od stanj nizke porabe energije, narava standardnega protokola in okvira dopušča le nekaj možnosti zmanjšanja porabe energije med delovanjem okvirov.

Naprava DW1000 ponuja edinstveno funkcijo varčevanja z energijo, ki omogoča zmanjšanje porabe energije med fazo RX uvodnega niza. Namesto da razvijalci pustijo sprejemno-oddajno enoto delovati, lahko napravo programirajo s posebnim načinom odkrivanja uvodnega niza. V tem primeru naprava DW1000 redno napaja sprejemno-oddajno enoto, izvede iskanje uvodnega niza in če ga ne najde, se vrne v stanje nedejavnosti (slika 5).

Funkcije, kot je odkrivanje uvodnega niza, so zlasti pomembne za oznake, ki jih napaja baterija. Za zmanjšanje porabe energije med delovanjem sistema RTLS lahko razvijalci uporabijo številne metode. Eden od pristopov izkorišča prednost različnih znanih zakasnitev, ki obstajajo pri protokolu dvosmernega merjenja razdalje, prikazanega na sliki 1.

Odziv inicializacije merjenja razdalje sidra na utrip oznake med fazo odkrivanja bo na primer prišel z določeno zakasnitvijo. Razvijalci lahko na podlagi hitrosti okvira in drugih parametrov ocenijo to zakasnitev, izmerijo njeno dejansko vrednost v svojih zasnovah sider ali pa vanje celo dodajo določen čas zakasnitve odziva. Nato lahko sprejemno-oddajno enoto oznake med predvidenim časom zakasnitve brez težav pustijo izklopljeno, jo vklopijo za iskanje odziva in jo znova izklopijo, če odziv inicializacije merjenja razdalje ne uspe priti v razumnem času.

Podobno lahko razvijalci izvedejo ukrepe za omejitev časa, v katerem mora biti radio med postopkom merjenja razdalje vklopljen. V napravo lahko na primer vnaprej naložijo vse potrebne podatke in nato z uporabo neposrednega dostopa do pomnilnika pospešijo prenos podatkov med napravo DW1000 in pomnilnikom gostitelja.

Čeprav lahko optimizacija nižjih ravni omogoči postopne prihranke energije, lahko razvijalci dosežejo precej boljše rezultate prek dinamičnega spreminjanja stopnje posodabljanja lokacije. Ko se oznaka preneha premikati, ni smiselno nadaljevati z energijsko potratnima fazama odkrivanja in merjenja razdalje, temveč se lahko oznaka brez težav zažene v stanju mirovanja z nizko porabo energije ter se nato prebudi in nadaljuje posodabljanje pri nazivni stopnji, kadar se začne znova premikati. Modul DWM1001 podpira prilagajanje dinamične stopnje prek vgrajenega senzorja gibanja LIS2DH12 in podpore za dva načina delovanja, povezana z gibanjem: način nizke porabe energije in odzivni način. Razvijalci lahko modul konfigurirajo tako, da ko senzor LIS2DH12 zazna, da modul miruje, sprejemno-oddajna enota DW1000 deluje v načinu nizke porabe energije, ko pa senzor LIS2DH12 zazna gibanje, se lahko sprejemno-oddajna enota DW1000 vrne v odzivni način, v katerem nadaljuje običajno stopnjo posodabljanja.

Razvijalci lahko dodatno optimizirajo aplikacije sistemov RTLS tako, da nadzorujejo stopnjo posodabljanja na podlagi hitrosti in pospeška predmeta. Počasi premikajoča se oznaka lahko na primer za ohranjanje zahtevane natančnosti položaja potrebuje le občasne posodobitve. Ko oznaka pospeši, se lahko aplikacija odzove tako, da zviša stopnjo posodabljanja lokacije.

Razvoj sistemov RTLS

Poleg tega, da modul podpira funkcije sistemov RTLS, kot je dinamična stopnja posodabljanja, ponuja bistveno prednost za razvoj sistemov RTLS. Sprejemno-oddajna enota DW1000 ima na primer številne posebne vmesniške zahteve za ločevanje napajanja, ujemanje antenskega omrežja, referenčni oscilator itd. (slika 6). Lastne zahteve za vmesniško zasnovo imata tudi brezžični mikrokontroler NRF52832 in senzor gibanja LIS2DH12.

Čeprav imajo takšne napredne naprave izjemno poenostavljeno zasnovo, je lahko optimizacija njihove vgradnje v zasnove, ki zahtevajo največjo zmogljivost in hkrati najmanjšo porabo energije, za razvijalce velik izziv. Modul DWM1001 zmanjša zahteve vgradnje na le nekaj priključkov za napajanje, ozemljitev in digitalne vmesnike (slika 7).

Model programske opreme

Modul izjemno poenostavlja tudi razvoj in vgradnjo programske opreme tako, da ponuja vnaprej naloženo vdelano programsko opremo za knjižnico sklada določanja položaja in omrežnega sklada (PANS) podjetja Decawave. Knjižnica PANS, izdelana na skladu čipa Bluetooth Low Energy (BLE) mikrokontrolerja, vključuje odprtokodni sistem za delovanje v realnem času (RTOS) eCos, omrežni sloj ter aplikacijske sloje, ki podpirajo storitve BLE, storitve upravljanja sistemov RTLS in orodje za določanje lokacije z dvosmernim merjenjem razdalje (TWR) (slika 8).

Pri izdelavi aplikacij vdelane programske opreme za zagon na mikrokrmilniku modula DWM1001 razvijalci dostopajo do knjižnice PANS prek obsežnega programskega vmesnika, ki vsakemu modulu PANS zagotavlja ustrezne vstopne točke za konfiguracijo in krmiljenje modula. Programski vmesnik knjižnice PANS zajema nabor programskih vmesnikov za posamezne module, vključno s kodo za razvijanje v programskem jeziku C, knjižnicami z zaporednim vmesnikom (CPI in UART) ter knjižnico BLE (slika 9).

Aplikacije delujejo neposredno s temi štirimi visokostopenjskimi programskimi vmesniki, ki dostopajo do knjižnice PANS prek razčlenjevalnika splošnega programskega vmesnika, ki te klice pretvori v klice med splošnim programskim vmesnikom in knjižnico PANS. V tej vlogi splošni sloj zagotavlja knjižnici PANS skupni programski vmesnik.

Nitna arhitektura

Vdelana programska oprema modula DWM1001 v tej arhitekturi uporablja nitni model, pri čemer vsakemu modulu in knjižnici v skladu zagotavlja lastno nit. Nit vsakega od štirih modulov na vrhu sklada posreduje zahteve za razčlenitev niti razčlenjevalnika splošnega programskega vmesnika, ki potrdi vsako zahtevo in pokliče knjižnico PANS, da tvori ustrezen odziv, nit splošnega programskega vmesnika pa prek funkcije povratnega klica, vključene v izvirnem klicu, vrne rezultat klicnemu modulu na vrhu sklada.

Čeprav se zdi, da je ta večslojni sistem kompleksen, je razvijalčev pogled modela programiranja razmeroma preprost. Uporaba klicev in povratnih klicev med programskim vmesnikom in posameznimi nitmi pomaga optimizirati uporabo virov ter splošno delovanje aplikacije.

Hkrati temeljno kompleksnost prikriva skupina programskih vmesnikov, ki klice, usmerjene v visokostopenjske aplikacije, pretvarjajo v določene optimizirane nitne operacije, ki so v interakciji s strojno opremo modula DWM1001. Model programiranja modula DWM1001 dodatno poenostavlja razvijalčevo interakcijo s tem sistemom. Razvijalci namesto interakcije z več niti in programskimi vmesniki uporabljajo namensko uporabniško aplikacijsko nit, vgrajeno v sistem.

Kot je prikazano na seznamu 1, razvijalci prikličejo uporabniško aplikacijsko nit s preprostim klicem programskega vmesnika (dwm_thread_create), ki registrira funkcijo uporabniške aplikacijske niti (app_thread_entry), glej seznam 1.

Decawave zagotavlja vzorčno kodo za uporabniško aplikacijsko nit in povratni klic. Vzorčna koda je v paketu slike navideznega računalnika za hipervizor Oracle Virtual Box, ki vključuje celovito zbirko orodij, knjižnice in preprosto vzorčno aplikacijo. Programski paket, ki je namenjen za delovanje z razvojno ploščo Decawave DWM1001-DEV, povezano z operacijskim sistemom Windows, omogoča podlago za ustvarjanje prilagojene programske opreme za sisteme RTLS.
Vzorčna koda, vključena v programskem paketu, prikazuje ključne vzorce načrtovanja funkcije uporabniške niti (seznam 2). V tem vzorcu funkcija uporabniške niti (app_thread_entry) nastavi konfiguracijske parametre za določeno aplikacijo, npr. stopnjo posodabljanja, in registrira njen povratni klic z uporabo funkcije programskega vmesnika dwm_evt_cb_register z imenom funkcije povratnega klica (on_dwm_evt). Po tem, ko vzorčna nit registrira povratni klic, zažene svojo glavno zanko – v tem primeru gre za serijo klicev funkciji zakasnitve, ki se uporablja za zmanjšanje uporabe virov, glej seznam 2.

Funkcija vzorčnega povratnega klica (on_dwm_evt) prikazuje osnovno rutino za obravnavo dogodkov, ki je priklicana ob nastanku dogodka (seznam 3). Edini veljaven dogodek v tej vzorčni kodi je razpoložljivost podatkov o novem položaju (DWM_EVT_NEW_LOC_DATA). V okviru rutine obravnave dogodkov za ta dogodek koda prikazuje preprost niz klicev, potrebnih za pridobitev podatkov o lokaciji, ki jih ustvarijo razpoložljiva sidra. Ko se končajo opravila obdelave dogodka, povratni klic miruje, glej seznam 3.

V celoviti aplikaciji sistema RTLS za na primer internet stvari bi oznake in sidra komunicirala prek usmerjevalnih sider, ki so prek interneta povezana s sistemom prehodov. Podjetje Decawave pripravlja drugo izdajo svojega paketa vdelane programske opreme, ki bo zajemal podporo prehodov prek paketa programske opreme na osnovi Linuxa z uporabo znanih protokolov za pošiljanje sporočil, ki vključujejo HTTP, WebSockets, MQTT in AMQP.

Sklep

Sistemi RTLS imajo čedalje pomembnejšo vlogo v številnih aplikacijah. Čeprav metode sistemov RTLS temeljijo na razmeroma preprostih načelih, implementacija teh načel zahteva napredno radiofrekvenčno/analogno zasnovo, sistemsko zasnovo in razvoj programske opreme, da zagotovi največjo natančnost in hkrati najmanjšo porabo energije.

Modul Decawave DWM1001 ponuja celovit sistem RTLS, ki združuje vgrajeno sprejemno-oddajno enoto UWB DW1000 podjetja Decawave ter brezžični mikrokontroler in senzor gibanja. Z uporabo tega modula in priloženega paketa programske opreme lahko razvijalci hitro implementirajo zelo natančne sisteme RTLS z baterijskim napajanjem.

www.digikey.com

Seznam 1: Z nitnim modelom Decawave razvijalci registrirajo in zaženejo uporabniško aplikacijsko nit z nekaj preprostimi klici uporabniškega vmesnika. (Vir kode: Decawave)

/* Create thread */
rv = dwm_thread_create(THREAD_APP_PRIO, app_thread_entry, (void*)NULL, "app", THREAD_APP_STACK_SIZE, &hndl);
APP_ERR_CHECK(rv);

/* Start the thread */
dwm_thread_resume(hndl);

Seznam 2: V tem odlomku paketa razvojne vdelane programske opreme podjetja Decawave vzorčna koda prikazuje osnovne vzorce načrtovanja za registracijo povratnega klica in izvedbo glavne zanke v rutini uporabniške aplikacijske niti. (Vir kode: Decawave)

void app_thread_entry(uint32_t data)
{
.
.
.
/* Update rate set to 1 second, stationary update rate set to 5 seconds */
APP_ERR_CHECK(dwm_upd_rate_set(10, 50));

/* Register event callback */
dwm_evt_cb_register(on_dwm_evt, 0);
.
.
.

while (1) {
/* Thread loop */
dwm_thread_delay(100);
}
}

Seznam 3: Ta odlomek vzorčne aplikacije Decawave prikazuje povratni klic, ki zagotavlja osnovno rutino obravnave dogodkov za dostop do podatkov o novi lokaciji. (Vir kode: Decawave)

/**
* Event callback
*
* @param[in] p_evt Pointer to event structure
* @param[in] p_data Pointer to user data
*/
void on_dwm_evt(dwm_evt_t *p_evt, void *p_data)
{
int i;

switch (p_evt->header.id) {
/* New location data */
case DWM_EVT_NEW_LOC_DATA:
/* Process the data */

printf("\nT:%lu ", dwm_systime_us_get());
if (p_evt->data.loc.p_pos == 0) {
/* Location engine is disabled */
} else {
printf("POS:[%ld,%ld,%ld,%u] ", p_evt->data.loc.p_pos->x,
p_evt->data.loc.p_pos->y, p_evt->data.loc.p_pos->z,
p_evt->data.loc.p_pos->qf);
}

for (i = 0; i < p_evt->data.loc.anchors.dist.cnt; ++i) {
printf("DIST%d:", i);

printf("0x%04X", (unsigned int)(p_evt->data.loc.anchors.dist.addr[i] & 0xffff));
if (i < p_evt->data.loc.anchors.an_pos.cnt) {
printf("[%ld,%ld,%ld]",
p_evt->data.loc.anchors.an_pos.pos[i].x,
p_evt->data.loc.anchors.an_pos.pos[i].y,
p_evt->data.loc.anchors.an_pos.pos[i].z);
}

printf("=[%lu,%u] ", p_evt->data.loc.anchors.dist.dist[i],
p_evt->data.loc.anchors.dist.qf[i]);
}
printf("\n");
break;

default:
break;
}

/* Indicate the application has finished the tasks and can now */
dwm_sleep();
}
Tags: