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:
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.
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
Witam.
Spodobał mi się twój projekt i wykonanie go. W międzyczasie zrobiłem parę ulepszeń do niego:
– Przeniosłem serwis WCF z oddzielnego projektu do projektu MaciejGrabek.WP7AccelerometerEmulatorUI (dzięki czemu nie ma już potrzeby otwierania solucji w VS, wystarczy tylko odpalić exe)
– Utworzyłem projekt setup aby można było ową binarkę sobie zainstalować.
– Obecnie pracuję nad tym aby móc odpalić bez VS po zainstalowaniu projekt z DEMO. Mam już koncept jak to zrobić ale brakuje mi dll’ki Microsoft.SmartDevices.Connectivity i nie mogę jej nigdzie znaleść.
Proszę o kontakt, abym mógł przesłać Panu projekt po zmianach.
Pozdrawiam,
Maciej Redzik
Rozdzielenie warstwy prezentacji od proxy było tu celowe:
1 – nie jestem pewien, jak zachowa się uruchomienie usługi dzialającej na HTTP w kontekście zwykłego użytkownika – sprawdzałeś? Sądzę, że nie będzie możliwy taki nasłuch, ale to trzeba by sprawdzić na Twoim kodzie.
2 – rozdzielamy odpowiedzialność poszczegółnych elementów projektu – preferuję taką architekturę
3 – zawsze musisz pamiętać o uruchomieniu UI przed demo – w aktualnej sytuacji sewer deweloperski cały czas działa w tle, więc emulator czyta z niego dane nawet jak nie działa UI, które możesz odpalić w dowolnym momencie. Dodatkowo możesz sobie postawić proxy na IIS i się nim nie przejmować
Nie do końca rozumiem kwestię demo – a konkretniej co chcesz z nim osiągnąć i jaki jest tego sens? Uruchomienie demo bezpośrednio na emulatorze? Mamy do tego narzędzie Application Deployment i wybieramy jako target Windows Phone 7 Emulator – chyba, że chodzi Ci o coś innego?
świetny pomysł, brawo.
Witam,
Nie wiem jak przetestować twoją solucję. Mógłbyś napisać jak mógłbym odpalić razem projekty WebService, UI i Demo, bo chyba wszystkie muszą być odpalone dla działania aplikacji? Odpaliłem sobie projekt WebService, potem UI. Następnie otwarłem solucje (drugi raz, bo jedną mam już otwartą) w Visual Studio i odpaliłem projekt Demo. Zmieniam położenie telefonu w Demo i nic się na UI nie dzieje nie wiem dlaczego. Proszę o wyjaśnienie.
Pozdrawiam.
Trzeba mieć pewność, że jest zaznaczony checkbox odpowiadający za wysyłanie danych z UI do serwisu. Ogólnie rzecz biorąc, to od czasu wprowadzenia WP7.1 Mango projekt ten stracił na atrakcyjności ponieważ w standardowym emulatorze jest już dodane pełne wsparcie dla akcelerometru. Więcej na http://channel9.msdn.com/Series/Kurs-programowania-Windows-Phone-pisz-na-Mango/Nowe-moliwoci-emulatora–Kurs-Windows-Phone-7-pisz-na-Mango-cz-12