Hirdetés

Alkalmazásfejlesztés badára: Szenzorok kezelése

Bevezetés

Az előző bejegyzéshez hasonlóan ma is a giroszenzor által küldött adatokat fogjuk figyelni, de ezúttal más típusú mozgatásokra specializálódunk. Míg a múlt heti posztban három speciális típust ismertettem (snap, shake és douple tap, azaz billentés, rázás és dupla érintés), amelyek előre definiált badás mozgások, a mai bejegyzésben viszont a szenzor által küldött szögeket fogjuk mérni.

A giroszenzor, és ami mögötte van

A Wave modellekben lévő giroszenzor három dimenzióban képes figyelni a forgatásokat, amelyeket szögekkel fejez ki, az egyes tengelyek megfelelnek a Descartes-koordinátarendszer megfelelő tengelyeinek. A forgatások (merthogy igazából arról van szó, hogy az érzékelő a telefon középpontja körüli forgatásokat méri) a Roll, Pitch és Azimuth neveket kapták, a különleges a dologban az, hogy mindegyik csak egy, maximum kettő orientációban használható.

A Roll (magyarul gurulást jelent) csak egy testhelyzetben működik, ha a telefont a képernyővel felfele fordítva, vízszintesen tartjuk, és a Z tengelye mentén forgatjuk. Az értékek bal irányban -180° és 0° között lehetnek, jobb felé pedig 0° és 180° közötti szögeket kapunk. A Pitch (dőntés) érték akkor változik, ha a telefont függőlegesen tartjuk, és a Z tengely körül forgatjuk a készüléket. Az értékek a rollhoz hasonlóan alakulnak, balra forgatva a negatív félkört fedik le, jobbra pedig 0° és 180° közötti szögeket detektál a szenzor. A harmadik lehetőség az Azimuth (körülbelül a magyar forgatás szónak felel meg), amely szintén mindkét testhelyzetben működik, azaz egyrész vertikálisan tartva, másrészt pedig vízszintesen, a képernyővel felfele fordítva is méri a szögeket; előbbi helyzetben a Z tengely körüli, utóbbiban az Y tengely körül pörgetéseket figyeli. A kapott értékek eltérően alakulnak az előző két típushoz képest, itt 0°-tól 360°-ig kapjuk meg őket, amelyek ráadásul csak egészek lehetnek, ellentétben az előző két esettel, ahol törtszámokat kapunk (floatokat, hogy pontosabbak legyünk).

A kód

A giroszenzor használatához az előző bejegyzésben ismertetett módszerhez hasonlóan include-olnunk kell az FUix.h headert, valamint használnunk kell a hozzá tartozó névteret. Az osztályunknak meg kell valósítania az Osp::Uix::ISensorEventListener interfészt (erről ezen a linkel lehet tovább információkat olvasni), amely a giroszenzor (és mellette a többi érzékelő) által küldött adatok fogadására teszi képessé a programunkat. Az implementálás miatt meg kell valósítanunk az interfész egyetlen függvényént, az OnDataReceived-et, ezen keresztül kérhetjük el az érzékelő-adatokat.

Az adatok feldolgozásához muszáj felvennünk egy Osp::Uix::SensorManager példányt, amelyet első körben a Construct() függvényével inicializálnunk kell, majd pedig egyenként meg kell határoznunk, mely érzékelőket szeretnénk használni az alkalmazásunkban. Utóbbit az AddSensorListener() metódus segítségével tehetjük meg, ezt egy if ágban érdemes megtenni, amelyben előtte ellenőrizzük az adott szenzor elérhetőségét az IsAvailable() függvényen keresztül. Az AddSensorListener() függvény négy bemenőt vár, az első az osztály, amely megvalósítja az érzékelő kezelését, a második pedig a szenzortípus; mivel mi a giroszenzort szeretnénk használni, típusnak a SENSOR_TYPE_TILT szót kell megadnunk. A harmadik paraméter az ellenőrzési intervallum milliszekundumban (azaz azt határozza meg, milyen gyakorisággal mintavételezzünk), a negyedik pedig egy boolean, ami az adatküldést befolyásolja: ha az értéke igaz, csak változás esetén értesít, ha pedig hamis, a megadott intervallum letelte után mindenképpen elküldi az érzékelő által mért értéket. Készen vagyunk az inicializálással, már csak el kell kérni az értékeket az OnDataReceived-ben, ezt a SensorManager GetValue() függvényével tehetjük meg. A metódusnak két bemenője van: az első a típus (esetünkben TILT_DATA_KEY_AZIMUTH, TILT_DATA_KEY_PITCH vagy TILT_DATA_KEY_ROLL), melyet SensorDataKey-re kell castolnunk, a második pedig a változó, amelyben tárolni szeretnénk a kapott értéket. Bumm, el is értük a célunkat: adott időközönként megkapjuk a telefon orientációját, amelyet ez után szabadon felhasználhatunk.

A példaprogram a fent ismertetett funkciókat valósítja meg egy egyszerű alkalmazás keretében, amely a telefont forgatva folyamatosan (25 milliszekundumonként) frissíti a mérési adatokat, és ezeket meg is jelenítni. Természetesen ismét elérhető a Mobilarénás SVN-ből, a tesztprojekt a TiltSensor névre hallgat.

dr. Kind

Azóta történt

Előzmények