Fabijan Lukin, Fran Pregernik, Tomislav Sukser

Dokumentacija za izradu programa i senzora za obojivo računarstvo

Povratak

4        Senzori

Senzori su nadogradnja obojivih računala. Kao takva posjeduju sve njihove metode i funkcionalnosti, a dodaju i nekoliko novih.

4.1    Sučelje ISensor

ISensor jest sučelje senzora. Drugim riječima, to su jedine metode koje morate imati u senzoru kako bi on mogao raditi u simulatoru. Sve ostale koje napišete možete koristiti samo vi.

Radi se o slijedećim metodama:

4.1.1       Type[] DataFeeders

Jedan senzor može primati od simulatora više različitih podataka, npr. temperaturu i vlažnost, i na osnovu oba podatka prikazivati se drukčije na ekranu. S ovom metodom kažete simulatoru s kojim tokovima podataka senzor radi.

Povratna vrijednost

Polje tipova toka podataka

Opis metode Type[] DataFeeders

4.1.2       void SetEnvironmentValue(Type dataFeederType, double sensorValue)

Na osnovu prethode funkcije, simulator povremeno dostavlja podatke senzoru preko ove metode.

Parametar dataFeederType

Tip dobavljača podataka

Parametar sensorValue

Vrijednost podatka koju je vratio kod podataka

Opis metode SetEnvironmentValue

4.1.3       HomepageColorizer SensorColorizer

Da bi se nešto prikazalo na ekranu, senzor treba imati i svoju funkciju za bojanje. Ovom metodom kažete simulatoru koja je to funkcija.

Povratna vrijednost

Objekt tip HomepageColorizer koji obavlja bojanje

Opis metode SensorColorizer

4.2    Promjena obojivog računala

Da bi sve radilo kako treba moramo promijeniti samo jednu metodu GenericPaintableComputer-a, razreda kojeg nasljeđujemo. Unutar te metode podatke na osnovu kojih vršimo bojanje moramo upisati u podatkovnu stranicu (HomePage), jer funkcije za bojenje samo tome mogu pristupati.

4.2.1       public override void Cycle()

Unutar nje, nakon upisivanje vrijednosti senzora u lokalnu memoriju, moramo pozvati i osnovnu metodu Cycle().

4.3    PressureSensorComputer

Najbolje da napišemo jedan senzor. Stvorite novu datoteku PressureSensorComputer.cs u projektu PaintableSimulator.Engine, u podmapi „PaintableComputers\Sensors“.  Početi ćemo od kostura programa u kojemu samo kažemo ime senzora, da nasljeđujemo GenericPaintableComputer i da imamo senzore u njemu.

public class PressureSensorComputer : GenericPaintableComputer, ISensor

{

    public const uint ProcessFragmentId = 0x12121212;

}

ProcessFragmentId mora biti jednistven, bez obzira radi li se o obojivom računalu ili senzoru.

To nam je bitno prilikom pristupanja lokalnoj memoriji, jer tako možemo pristupati memoriji pojedinog programa ili senzora. To koristimo u konstruktoru senzora.

public PressureSensorComputer(uint maximumNeighbourCount)

    : base(maximumNeighbourCount)

{

    localHomepage.Add(ProcessFragmentId, new HomepagePostCollection());

}

Ovaj konstruktor je generički, i nije ga potrebno niti preporučeno mijenjati.

Simulatoru moramo reći kako ćemo bojati sebe. To se radi na isti način kao i za programe u poglavlju 5.4 i to uz pomoć DefaultHomepageColorizer atributa kojem je parametar tip razreda objekta za bojanje.

[DefaultHomepageColorizer(typeof(PressureSensorColorizer))]

public class PressureSensorComputer : GenericPaintableComputer, ISensor

{ ... }

Da bi dobili podatke o okolini, moramo reći simulatoru što želimo. To radimo u metodi DataFeeders, gdje vraćamo popis svih dobavljača podataka koje znamo koristiti. Mi koristimo AntWalkerDataFeeder, koji simulira kruženje mrava oko središta simulatora. Dobavljači moraju postojati kako bi ih mogli koristiti. Ova se metoda poziva samo jednom, pa je sigurno svaki puta stvarati novi dobavljač. Drugi način je preko privatne varijable, kao u primjeru iznad.

public Type[] DataFeeders

{

    get

    {

        return new Type[] { typeof(AntWalkerDataFeeder) };

    }

}

Naravno, povremeno će simulator nama slati podatke od dobavljača podataka. U ovom slučaju, AntWalkerDataFeeder-a. Mi te podatke primamo kroz metodu SetEnviromentValue. Jedan parametar je vrijednost, a drugi je tip dobavljača podataka koji je taj podatak postalo. U ovoj funkciji je bitno provjeriti o kojem se dobavljaču radi, da, ako ih primamo više, znam što ćemo s njim napraviti. Ili, ako ne znamo što bi s njim, da ga možemo ignorirati. Vrijednosti je potrebno spremiti u privatne varijable, kako bi ih poslije mogli koristiti.

private double pressure;

public void SetEnvironmentValue(Type dataFeederType, double sensorValue)

{

    if (dataFeederType == typeof(AntWalkerDataFeeder))

    {

        pressure = sensorValue;

    }

}

Do sada smo pokrili dio koji je striktno vezan za razred ISimulator. Još moramo prekriti Cycle() metodu razreda GenericPaitableComputer. U njoj sve podtake koje smo dobili od dobavljača podataka i spremili u privatne varijable, sada upisujemo u lokalnu memoriju u obliku koji objekt za bojanje zna prepoznati.

public override void Cycle()

{

    UpdateSensorHomepage();

    base.Cycle();

}

private void UpdateSensorHomepage()

{

    base.PostEntry(ProcessFragmentId, 0, pressure);

}

Metoda UpdateSensorHomepage nije komplicirana pa se je mogla i cijela smjestiti unutar Cycle metode, ali preporučujemo ovako programirati jer je preglednije. Na kraju naše Cycle metode, obvezno pozvati baznu metodu!

4.4    Kako obojati senzor

Za to moramo napraviti razred koja obavlja bojanje. Za to ćemo napisati novi razred koji će naslijediti razred HomepageColorizer, i nadjačati metodu Colorize. U njoj računamo boju kojom će simulator prikazati senzor. To radimo tako da pretražujemo imamo li u lokalnoj memoriji zapis našeg senzora. Ako imamo, pročitajmo ga i pretvorimo u boju. U ovom slučaju, nijansu žute.

public class PressureSensorColorizer : HomepageColorizer

{

    public override Color Colorize(Homepage homepage)

    {

        Color retval = Color.WhiteSmoke;

        for (int i = 0; i < homepage.Count; i++)

            if (homepage.KeyList[i] == PressureSensorComputer.ProcessFragmentId)

            {

                double pressure = 0.0;

                if (homepage.DataList[i].Count == 0)

                    break;

                pressure = (double)homepage.DataList[i][0];

                int color = (int)(255 * pressure / 10.0);

                if (color > 255)

                    color = 255;

                retval = Color.FromArgb(color, color, 0);

                break;

            }

            return retval;

    }

}

4.5    Naš mrav hoda!

I to je to! Ako je dobavljač vrijednosti napisan dobro, naš senzor će prikazivati hodanje mrava u krug.

Za stvarnu implementaciju senzora i razreda za bojanje, pogledajte datoteku TemperatureSensorPaintableComputer.cs, a za dobavljač podataka datoteku AntWalkerDataFeeder.cs.