használatával
9.3. A program megírása
Az alapértelmezetten létrejön egy Program.cs nevű fájl, amibe a fejlesztőkörnyezet automatikusan egy programkódot generál. A kommentezést nyugodtan töröljük ki, a generált kód a következőképpen néz ki:
namespace Light_Switch {
public partial class Program {
void ProgramStarted() {
Debug.Print("Program Started");
} } }
A Program nevű osztály az alkalmazás főosztálya, ezen belül a ProgramStarted() függvény indul el elsőként.
Futtatásnál, a Debug.Print("Program Started") utasítás hatására a kimeneti ablakban (output window) megjelenik a felirat. A Program.cs fájlban találhatunk további sorokat. Ezek különböző osztálykönyvtár referenciák, amiket az alkalmazás használni fog. A példakódban külön nem jelöltem.
Futtassuk a projektet! Ehhez az USB kliensbe (piros modul, ami az 1. portba van illesztve) csatlakoztassuk az USB kábel megfelelő végét, majd a másikat a PC egyik USB portjába. Az F5 gomb megnyomása után a program lefordul (build) és az eszközre feltöltődik (deploy). Amennyiben az előbbi folyamatok hiba nélkül lefutottak, a kimeneti ablakban megjelenik a „Program Started” felirat. A kijelző képernyője fekete és az
használatával
alapértelmezés szerinti gyári információkat írja ki (verzió, felbontás). Ennek az az oka, hogy még nincs használatban a modul.
Egészítsük ki a programot, úgy, hogy képes legyen a led intenzitását egy adott értékre beállítani, és erről írásos információt adjon a kijelzőn keresztül! Ehhez először helyezzünk el egy változót a ProgramStarted() függvény előtti sorokba:
byte lightIntensity = 0;
A lightIntensity változó a fényerőt tárolja 0-255 érték között. Ha 0, akkor teljesen ki van kapcsolva, ha pedig 255 akkor pedig teljesen fel van kapcsolva a lámpa.
Folytatólagosan (a ProgramStarted() függvény után) hozzunk létre két visszatérés nélküli függvényt:
renderIntensity() és setLightntensity().
void renderIntensity() {
display.SimpleGraphics.Clear();
display.SimpleGraphics.DisplayText("The light is on " + ((int)(lightIntensity /2.55)).ToString() +
"% power",
Resources.GetFont(Resources.FontResources.NinaB), Colors.White, 50, 50);
}
voidsetLightIntensity() {
led.SetBlueIntensity(lightIntensity);
led.SetRedIntensity(lightIntensity);
led.SetGreenIntensity(lightIntensity);
}
A renderIntensity() függvény letörli a kijelzőt, és kiírja az aktuális fény intenzitást (lightIntensity) százalékos formában. Például, ha a fényforrás teljesen fel van kapcsolva, ez a szöveg jelenik meg: "The light is on 100%
power". A százalékot oly módon számoljuk ki, hogy a byte típusú lightIntensity értéket elosztjuk 2.55-el, és integerré változtatjuk a típusát (typecast). A DisplayText metódus első paramétere ez a string lesz, a második a betűtípus, amelyet az erőforrásokból kell betölteni (Resources.FontResources.NinaB). Az ezt követő paraméterek a szöveg színe (fehér), és a képernyőre történő kiírás kezdő koordinátái (50,50).
A setLightIntensity() függvény beállítja az aktuális fény (led) intenzitást (lightIntensity). A három színcsatornán azonos értéket kell beállítani. Ha mindegyik azonosan nulla, akkor a led nem ég, ha mindegyik azonosan 255, akkor a maximális erejű közel fehér fényt kapunk. Az additív színkeverés miatt, ha a színcsatornák értékei azonosak, akkor az azt jelenti, hogy a keletkező fény (megközelítőleg) fehér.
A kapcsoló oly módon fog működni, hogyha először hozzáérünk, akkor a kikapcsolt fényforrás fényét folyamatosan növeli vagy a maximumig, vagy pedig amíg el nem engedjük. Ehhez definiálni kell egy irány típust (enum) és egy ilyen típusú változót.
enum lightUpDownDirection {
up, down }
lightUpDownDirection lightDirection = lightUpDownDirection.up;
A lightUpDownDirection típusnak két értéke van, az up és a down, amely a lámpa kapcsolás irányát mutatja.
Kezdetben a lámpa ki van kapcsolva, így az irány up.
A következő lépésben írjuk mega fényerő irányváltásért felelős programrészt. Ehhez szükség van további változókra:
Fényerő szabályozó lámpa érintő kapcsoló .NETGadgeteer
használatával byte previousLightIntensity = 0;
GT.Timertimer;
int TimerResolution = 200;
int timerCount = 0;
Amennyiben a fényerőváltozásnál nem a szélsőértékekről (0, 255) történik az irányváltás, szükséges eltárolni a megelőző állapotot (previousLightIntensity), illetve amíg a kapcsolót nyomva tartjuk, egy 200ms felbontású (TimerResolution) időzítő (GT.Timertimer) segítségével tudjuk a fényerőváltást lekezelni, a timerCount változóba pedig a lenyomás idejét összegezzük. Kicsivel később visszatérünk rájuk.
A ProgramStarted() függvényen belül, a Debug.Print("Program Started"); sor alá írjuk be a következőt:
display.SimpleGraphics.AutoRedraw = true;
led.TurnOff();
display.WPFWindow.TouchDown +=
new Microsoft.SPOT.Input.TouchEventHandler(WPFWindow_TouchDown);
display.WPFWindow.TouchUp +=
new Microsoft.SPOT.Input.TouchEventHandler(WPFWindow_TouchUp);
display.WPFWindow.Invalidate();
timer = new GT.Timer(TimerResolution);
timer.Tick += new GT.Timer.TickEventHandler(timer_Tick);
A display.SimpleGraphics.AutoRedraw() metódus a képernyő automatikus újrarajzolását engedélyezi. A led.TurnOff() utasítással kikapcsoljuk induláskor a ledet, így létrehozzuk a kezdeti állapotot. Ezután a kapcsoló (érintő kijelző) kezelését kell megoldani. Ez rendelkezik egy TuchDown és TuchUp, azaz egy kijelző megnyomva és elengedve eseménnyel. Erre az eseményre való feliratkozást valósítja meg a fenti kódrészlet.
Érdemes úgy csinálni, hogy beírjuk a += karakterekig, majd két darab tab gombot nyomunk. Így a környezet legenerálja a kód többi részét, valamint az eseményt kezelő függvényt (WPFWindow_TouchUp, WPFWindow_TouchDown). Az invalidate() metódus érvényteleníti a kijelző tartalmát, ami ezáltal egy újra renderelést valósít meg. A new GT.Timer(TimerResolution) utasítással példányosításra kerül az időzítő, amelynek 200ms időnként kiváltódik a timer.Tick() eseménye.
void WPFWindow_TouchDown(object sender, Microsoft.SPOT.Input.TouchEventArgs e) {
timerCount = 0;
timer.Start();
}
A WPFWindow_TouchDown függvény (érintőképernyő lenyomás) nullázza a nyomás idejét összegző timerCount változót, és elindítja a timer időzítőt.
voidWPFWindow_TouchUp(object sender, Microsoft.SPOT.Input.TouchEventArgs e) {
previousLightIntensity = lightIntensity;
}
A WPFWindow_TouchUp függvény (érintőképernyő elengedés) megállítja az időzítőt, valamint invertálja a lámpa kapcsolás irányát, és frissíti az előző fényintenzitás értékét az aktuális fényintenzitással.
void timer_Tick(GT.Timer timer) {
használatával időzítőt, de előfordulhat, hogy ezután még egyszer kiváltódik maga az Tick esemény.
A timerCount változóhoz hozzá kell adni az eltelt időt (timer.Interval.Milliseconds), majd ez alapján ki kell számítani a fényintenzitást (intensity) a kapcsolási iránynak megfelelően az előző intenzitást figyelembe véve.
Ha a kiszámított intenzitás eléri, vagy meghaladja az egyik szélsőértéket, akkor határolni kell, illetve leállítani az időzítőt (mivel teljesen fel vagy le kapcsoltuk a lámpát).
Ezek után a kiszámított intenzitást át kell adni a byte típusú lightIntensity változónak, valamint utolsó lépésként frissíteni kell a fényforrás fényességét, és ki kell írni ugyanezt a kijelzőre a setLightntensity() és renderIntensity() függvények segítségével.
Az elkészült alkalmazásról néhány fénykép:
9.3. ábra - Teljesen kikapcsolt lámpa
Fényerő szabályozó lámpa érintő kapcsoló .NETGadgeteer
használatával
9.4. ábra - 7%-os kitöltésű lámpa
használatával