• Nem Talált Eredményt

A program megírása

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

9.5. ábra - Teljesen felkapcsolt lámpa