Wstęp

Jak zapewne wszyscy wiemy emulator dla paltfromy Windows Pone 7 nie wspiera w żaden sposob akceleratora. Oznacza to, że w celu przetestowania naszej aplikacji, która korzysta z dobrodziejstw akcelerometru musimy wgrać ją na urządzenie. Oczywiście istnieją rozwiązania, które wykorzystują na przykład kontrolery do Wii czy też XBox 360 do przekazania emulatorowi danych o wychyleniu urządzenia. Mają one jednak jedną zasadniczą wadę – wymagają dodatkowego sprzętu. Pewnego dnia postanowiłem wykorzystać wolną chwilę i rozwiązać ten problem. Po paru godzinach udało mi się i oto przedstawiam wam projekt o nazwie MaciejGrabek.WP7AccelerometerEmulator.

Jak to działa?

Solucja składa się z trzech projektów:

1. MaciejGrabek.WP7Accelerometer – główna biblioteka do wykorzystania w aplikacji. Zawiera w sobie klasę WP7AccelerometerProvider, która dostarcza pełną funkcjonalność analogiczną do akcelerometru z przestrzeni nazw Microsoft.Devices.Sensors, czyli metody Start i Stop oraz zdarzenie ReadingChanged, które przekazuje informację o siłach działających na urządzenie i ich wektorach.

2. MaciejGrabek.WP7AccelerometerEmulatorUI – projekt pozwalający w łatwy sposób emulować ułożenie telefonu w przestrzeniu poprzez wykorzystanie trzech suwaków dla każdej z osi rotacji (X, Y, Z). Dane te są następnie wysyłane do Proxy.

3. MaciejGrabek.WP7AccelerometerEmulatorProxy – projekt ten odpowiada za odbieranie danych z UI i umożliwia ich odczyt przez emulator, a konkretnie klasę WP7AccelerometerProvider.

Jeżeli aplikacja jest uruchamiana na emulatorze wówczas WP7AccelerometerProvider stara się pobrać dane z Proxy. Jeżeli podczas tej operacji wystąpi błąd (np proxy jest niedostępne), wówczas przełącza się on w tryb danych losowych. Aby ponowić próbę odczytu danych z proxy należy wykonać metory Start() i Stop().

Jak z tego skorzystać?

Jest to tak samo łatwe jak wykorzystanie standardowej klasy akcelerometra. Po stworzeniu projektu aplikacji dla WP7 wystarczy dodać referencję do biblioteki (lub projektu) MaciejGrabek.WP7Accelerometer. Następnym krokiem jest uwtorzenie instancji akcelerometru jak na poniższym listingu:

1
var acc = new WP7AccelerometerProvider();

Teraz należy dodać obsługę zdarzenia AccelerometerProviderReadingChanged:

1
2
3
4
5
6
7
acc.ReadingChanged += OnAccelerometerProviderReadingChanged;
 
private void OnAccelerometerProviderReadingChanged(object sender, WP7AccelerometerReadingEventArgs args)
{
    //do what you want with data
    ProcessAccelerometerData(args.X, args.Y, args.Z, args.Timestamp);
}

a następnie uruchomić WP7AccelerometerProvider i cieszyć się danymi:

1
2
3
4
5
6
7
8
try
{
    acc.Start();
}
catch (Exception exc)
{
    txtblk.Text = exc.Message;
}

To wszystko, co należy zrobić po stronie aplikacji. Teraz przyjrzyjmy się panelowi kontrolnemu. W tym celu uruchamiamy projekt MaciejGrabek.WP7AccelerometerEmulatorUI oraz MaciejGrabek.WP7AccelerometerEmulatorProxy (ten drugi powinien uruchomić się automatycznie, jednakże jeżeli tak nie jest, wówczas należy zrobić to ręcznie). Teraz wystarczy uruchomić tworzoną aplikację oraz w okienku MaciejGrabek.WP7AccelerometerEmulatorUI zaznaczyć checkbox “Send data to emulator” i cieszyć się działaniem aplikacji. Rezultaty widać poniżej:

WP7 Accelerometer Emulator UI

WP7 Accelerometer Emulator UI

Tak jak widzicie, jest to łatwe i intuicyjne w użyciu.

Gdzie można znaleźć projekt?

Projekt można pobrać z tego miejsca a następnie wystarczy go użyć w wyżej opisany sposób. Dla ułatwienia solucja zawiera również demo, aby nie pozostawiać wątpliwości co do użycia providera.

Co w przyszłości.

1. Czasem można zauważyć efekt blokady przegubów (Gimbal Lock) w wolnej chwili postaram się go rozwiązać.
2. Dodanie kontroli rotacji przy użyciu myszki
3. Dodanie sekwencji ruchów, które można nagrać a następnie “odtworzyć” (na przykład potrząsanie, obracanie itp)
4. Dodanie możliwości modyfikacji siły przyłożonej do telefonu (np potrząsanie)

Zapraszam do pozostawiania komentarzy na temat projektu.

April Update

Nagrywanie sekwencji użytkownika.

Wyobraźmy sobie sytuację, w której piszemy jakiś kawałek kodu, który ma się zachować w określony sposób przy danej sekwencji ruchów, jaką wykona użytkownik telefonu. Do tej pory jeżeli korzystaliście z mojego projektu trzeba było wykonywać te sekwencje samemu przy każdym teście. Teraz to się zmieniło. Wystarczy raz nagrać taką sekwencję, a następnie przy kolejnych testach można ją odtworzyć. Jeżeli chcemy skorzystać z aktualnej sekwencji w późniejszych testach wystarczy zapisać sekwencję do pliku XML. Po ponownym rozpoczęciu pracy wczytać do emulatora plik z zapisem sekwencji. Eksport ten daje również możliwość testowania przez kilku programistów tej samej sekwencji poprzez zwykłą wymianę pliku symulacji.

WP7 Accelerometer Emulator Recording Panel

Użycie:
1 – przycisk Start
2 – wykonujemy sekwencję
3 – przycisk Stop
4 – aby odtworzyć wybieramy Play
5 – aby zatrzymać sekwencję w dowolnym momencie klikamy Stop
6 – jeżeli chcemy zachować sekwencję testową wybieramy Save
7 – aby wczytać wcześniej przygotowaną sekwencję wybieramy Load.
W razie gdyby w sekwencji coś poszło nie tak (wykonaliśmy nie nie ten ruch, który zamierzaliśmy), można wyczyścić zgromaczone dane przy pomocy przycisku Clear.

Jeszcze może słowo na temat opcji Limit – ograniczamy w ten sposób ilość zapamiętanych przez program stanów, dzięki czemu nie będzie sytuacji, w której po rozpoczęciu nagrania aplikacja zacznie pochłaniać pamięć. Wstępnie ustawiłem maksymalną wartość na 500, co daje nam ok 50s sekwencji – moim zdaniem dużo :)

WP7Accelerometer Emulator April Update

Paczka ze źródłami