24.07.2012

Prosty emulator w .NET Micro Framework

Oczekując na płytkę STM32F4Discovery postanowiłem sprawdzić możliwość zbudowania własnego emulatora. Tak jest to możliwe! Możemy wykonać programowy emulator urządzenia i rozwijać oraz testować programy bez udziału fizycznej elektroniki.

Emulator jest bardzo prosty. Ma dwa przyciski, 5 kwadratów udających diody led oraz textbox, który emuluje port szeregowy:

Led i przycisk są zrobione jako kontrolki wizualne (UserControl), a port COM jako komponent (Component), a co za tym idzie można prosto projektować (przeciągając na formatkę) wygląd emulatora. (Uwaga: jeśli w toolboxie nie pokazują się kontrolki sprawdzić rozwiązania).


Kod kontrolki led i przycisku jest następujący:

public partial class LedControl : GpioUserControl
{
    public LedControl()
    {
        InitializeComponent();

        Port.ModesExpected = GpioPortMode.OutputPort;
        Port.ModesAllowed = GpioPortMode.OutputPort;
        Port.OnGpioActivity += Port_OnGpioActivity;
    }

    void Port_OnGpioActivity(GpioPort sender, bool edge)
    {
        Action action = () => BackColor = edge ? Color.Red : Color.White;
        UpdateUI(action);
    }
}
public partial class ButtonControl : GpioUserControl
{
    public ButtonControl()
    {
        InitializeComponent();

        Port.ModesExpected = GpioPortMode.InputPort;
        Port.ModesAllowed = GpioPortMode.InputPort;
    }

    private void Button1Click(object sender, System.EventArgs e)
    {
        Port.Write(true);
        Port.Write(false);
    }
}

Kontrolki dziedziczą ze wspólnego komponentu GpioUserControl, który oprócz tego że zawiera wspólne elementy dla potomnych to implementuje magiczny interfejs IEmulatorComponent. Interfejs ten jest potrzebny po to, aby automatycznie zarejestrować komponenty emulatora (EmulatorComponent) w emulatorze.

Standardowo rejestrację komponentów trzeba robić ręcznie w pliku xml (Emulator.config). Jednak przez dodanie takiego kodu w formatce emulatora, nastąpi ich automatyczna rejestracja niezależnie od ilości.

public MainForm(Microsoft.SPOT.Emulator.Emulator emulator)
{
    InitializeComponent();

    foreach (IEmulatorComponent control in Controls.OfType<IEmulatorComponent>())
        emulator.RegisterComponent(control.GetComponent());

    foreach (IEmulatorComponent control in components.Components.OfType<IEmulatorComponent>())
        emulator.RegisterComponent(control.GetComponent());
}

Przed uruchomieniem właściwego programu trzeba skompilować projekt emulatora, a następnie wybrać odpowiednio platformę do uruchomienia:


Kot dostępny na: https://kodfilemon.googlecode.com/svn/trunk/EmulatorTest/ ( Checkout )

Brak komentarzy:

Prześlij komentarz