3d)

Kraków, 2012 PO/X. 1. Smartphone jako uniwersalny kontroler (myszka/gamepad/pistolet/3d) opiekun projektu: mgr inż. Patryk Orzechowski Skład grupy: D...
Author: Liliana Tomczak
3 downloads 3 Views 912KB Size
Kraków, 2012

PO/X. 1. Smartphone jako uniwersalny kontroler (myszka/gamepad/pistolet/3d) opiekun projektu: mgr inż. Patryk Orzechowski Skład grupy: Daniel Jagielski Tomasz Kmiecik Marcin Marzyński

Cel projektu Naszym zadaniem było stworzenie oprogramowania, dzięki któremu komórka z systemem Android staje się uniwersalnym, bezprzewodowym( dzięki technologii WI-FI) kontrolerem do komputera/laptopa. Pod nazwą uniwersalny kontroler kryją się takie urządzenia jak: myszka, klawiatura, pad do gier, pistolet 3d, a także pilot. Pistolet 3d ma symulować działanie prawdziwego pistoletu i zapewniać w ten sposób nowe doznania płynące z rozgrywki elektronicznej. Pilot natomiast ma ułatwiać posługiwanie się programami użytkowymi oraz oglądanie filmów na ekranie komputera (nie wyklucza się też użycia go w grach).

Technologie Projekt wykonany został przy użyciu technologii Javowych. Serwer bazuje na JavieSE i wykorzystuje sockety do komunikacji. Aplikacja na telefon przeznaczona jest dla systemu Android i również za pomocą socketów łączy się z serwerem (preferowane wifi ze względu na szybkość transmisji). Dysponowaliśmy urządzeniami z systemem Android 2.1 dlatego zakładaliśmy uruchamianie aplikacji właśnie na tej wersji platformy (lub nowszej).

Narzędzia • • • •

W stworzeniu projektu pomocne były następujące narzędzia: Eclipse IDE z wtyczką ADT zainstalowane Android SDK oraz JavaSDK TortoiseSVN

Te narzędzia posłużyły nam do stworzenia kodu, kompilowania, synchronizacji oraz przesyłu na urządzenie oraz debuggowania bezpośrednio na komórce z Androidem.

Wymagania Klient: •

Urządzenie działające na systemie operacyjnym Android

Serwer: • Urządzenie działające na systemie operacyjnym Android • Windows/Linux • JRE • Serwer musi być widoczny w sieci tzn. musi mieć publiczne IP lub musi być w tej samej sieci co klient

Opis komunikacji Pomiędzy urządzeniami przesyłane są pakiety zawierające następujące informacje: Type (int) Content (int) Parameters (LinkedList) Dostępne typy wiadomości są następujące: • T_FAIL - wysyłana w razie niepowodzenia zidentyfikowania urządzenia przez serwer • T_HELLO – wysyłana na początku komunikacji przez klienta • T_ACCEPT - wysyłana przez serwer, gdy przyjął połączenie od klienta • T_IDENTIFY – identyfikacja typu urządzenia klienta (pilot, gamepad, pistolet) • T_READY – wysyłana gdy serwer jest gotowy do odbierania wiadomości • T_EVENT – polecenie wykonania akcji przysłane od klienta • T_BYE – klient wysyła tą wiadomość gdy kończy połączenie Dostępne typy urządzeń to: • DEV_KEYBOARD • DEV_MOUSE • DEV_GAMEPAD • DEV_PISTOL Poniższy diagram przedstawia schemat komunikacji pomiędzy serwerem i klientem:

Mapowanie Serwer trzyma hashMapę mapującą przysyłane eventy na rzeczywiste akcje. Do implementacji akcji stworzyliśmy uniwersalny interfejs ExecutionHelper, który pozwala na mapowanie podanych eventów na akcję wykonywane przez javową klasę Robot. Takie podejście pozwala na wykonywanie akcji typowych dla klawiatury i myszki.

Dostępne są następujące ExecutionHelpery: • KeyPressExHelper - naciska i trzyma podany klawisz. W konstruktorze podawany klawisz. PARAMS=[] • KeyReleaseExHelper - zwalnia podany klawisz. W konstruktorze podawany klawisz. PARAMS=[] • MouseMoveExHelper - zaczyna ruszać mysz z podaną prędkością. W konstruktorze podana oś w której przesuwa. PARAMS = [int speed], speed wyrażony jako ilość procent długości lub szerokości ekranu (odpowiednio dla osi Y lub osi X) • MousePointExHelper - przesuwa kursor na podane współrzędne. W konstruktorze podana rozdzielczość Width x Height. PARAMS = [float x% float y%] gdzie x i y to odległość od środka ekranu do odpowiedniej krawędzi. Jeśli x lub y >=0 to bierzemy odpowiednio prawą lub dolną krawędź, w przeciwnym wypadku lewą lub górną • MousePointMoveExHelper - cały czas przesuwa kursor na podane współrzędne. W konstruktorze podana rozdzielczość Width x Height. PARAMS = [float x% float y%] gdzie x i y to odległość od środka ekranu do odpowiedniej krawędzi. Jeśli x lub y >=0 to bierzemy odpowiednio prawą lub dolną krawędź, w przeciwnym wypadku lewą lub górną • MouseReleaseExHelper - zwalnia podany przycisk. W konstruktorze podany przycisk PARAMS = [] • MousePressExHelper - naciska i trzyma podany przycisk. W konstruktorze podawany klawisz. PARAMS=[] • NbuttonPressExHelper - naciska podany przycisk. PARAMS=[static int] • NbuttonReleaseExHelper - zwalnia podany przycisk. PARAMS = [static int] • KeyHoldExHelper - naciska i trzyma przyciski podane w konstruktorze.. PARAMS = [] • KeyReleaseHoldExHelper - zwalnia trzymanie przycisków podanych jako parametry konstruktora.. PARAMS = []

Przy implementacji powyższych klas wsparliśmy się pomocniczą klasą ContinuousEventRobot, która umożliwia na przytrzymanie klawiszy, bądź kontynuowanie akcji. Możliwe typy zdarzeń przesyłanych przez klienta są następujące: • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •

EVENT_STICK1_DOWN EVENT_STICK1_LEFT EVENT_STICK1_RIGHT EVENT_STICK1_UR EVENT_STICK1_UL EVENT_STICK1_DL EVENT_STICK1_DR EVENT_STICK1_CENTER EVENT_STICK2_UP EVENT_STICK2_DOWN EVENT_STICK2_LEFT EVENT_STICK2_RIGHT EVENT_STICK2_UR EVENT_STICK2_UL EVENT_STICK2_DL EVENT_STICK2_DR EVENT_STICK2_CENTER EVENT_BTN1_PRESS EVENT_BTN1_DOWN EVENT_BTN1_RELEASE EVENT_BTN2_PRESS EVENT_BTN2_DOWN EVENT_BTN2_RELEASE EVENT_BTN3_PRESS EVENT_BTN3_DOWN EVENT_BTN3_RELEASE EVENT_BTN4_PRESS EVENT_BTN4_DOWN EVENT_BTN4_RELEASE EVENT_BTN5_PRESS EVENT_BTN5_DOWN EVENT_BTN5_RELEASE EVENT_BTN6_PRESS

• • • • • • • • • • • • • • • •

EVENT_BTN6_DOWN EVENT_BTN6_RELEASE EVENT_BTN7_PRESS EVENT_BTN7_DOWN EVENT_BTN7_RELEASE EVENT_MOVE_UP_START EVENT_MOVE_DOWN_START EVENT_MOVE_LEFT_START EVENT_MOVE_RIGHT_START EVENT_MOVE_X_STOP EVENT_MOVE_Y_STOP EVENT_SET_X EVENT_SET_Y EVENT_TWIST_RIGHT EVENT_TWIST_LEFT EVENT_SET_POINT

Instrukcja obsługi klienta Główne okno aplikacji pozwala wybrać kontroler który chcemy używać. Pod przyciskiem menu mamy dostęp do konfiguracji ustawień wifi.

Okno konfiguracji połączenia. Podajemy IP serwera (serwer musi mieć publiczne IP lub musi być w tej samej sieci lokalnej co klient). Okno to wyskakuje automatycznie przy pierwszym uruchomieniu.

Okno nawiązywania połączenia. Połączenie nawiązywane jest gdy uruchamiamy konkretny kontroler.

Widok pistoletu. Pistolet wykorzystuje cztery przyciski oraz ruch. Na początku należy go skalibrować. Kalibracji dokonujemy w następujący sposób: 1. Celujemy w środek ekranu i naciskamy Button1 2. Celujemy w prawą krawędź ekranu (lepiej trochę za nią) i naciskamy Button1 3. Celujemy w lewą krawędź ekranu (lepiej trochę za nią) i naciskamy Button1 4. Celujemy w górną krawędź ekranu (lepiej trochę za nią) i naciskamy Button1 5. Celujemy w dolną krawędź ekranu (lepiej trochę za nią) i naciskamy Button1 6. Przycisk powinien zmienić etykietę. Pistolet jest gotowy do użycia. Aby go aktywować celujemy w środek ekranu i naciskamy Button1

Gamepad posiada dwa przyciski zwykłe (małe) oraz dwie manetki (duże) obsługiwane jak w zwykłym gamepadzie przez przesuwanie na bok. Również przyciski głośności służą jako klawisze, głośność w dół to Button3 a pogłośnienie to Button4.

W menu gamepada znajduje się opcja pozwalająca obrócić wyświetlanie gamepada. Przydatne gdy przyciski regulacji głośności znajdują się po drugiej stronie obudowy.

Widok myszy i klawiatury. Tak jak w innych modułach, przy inicjalizacji kontrolera myszy i klawiatury ustanawiane jest połączenie z serwerem. Jeśli połączenie powiodło się, włączany jest akcelerometr, którego odczyty z osi X oraz Y telefonu służą do poruszania wskaźnika myszy. Najwygodniej i najprecyzyjniej steruje się telefonem obracając go, zamiast przemieszczania. Wynika to ze specyfiki wartości zwracanych przez akcelerometr. Wartości te są w zależności od wychylenia odpowiednio skalowane i przekształcane na prędkość wskaźnika w danej osi. Prędkość można regulować poprzez suwak na ekranie.

Oprócz konfiguracji prędkości mamy, podobnie jak w niektórych grach komputerowych, możliwość odwrócenia orientacji osi Y, ze względu na różne preferencje użytkowników. Dodatkowo do obsługi na ekranie mamy przyciski takie jak Pokaż klawiaturę - wywołuje systemową klawiaturę systemu Android. Wpisane przez nas znaki będą przesyłane do serwera na komputerze. Oprócz tego mamy możliwość używania najpopularniejszych klawiszy z klawiatury komputera, a mianowicie: Escape, Caps Lock, Delete, Page Up, Page Down,Control, Alt, Shift, strzałki - wszystkie kierunki, oraz Enter. Backspace jest wbudowany w klawiaturę. Są tam 2 rodzaje przycisków: zwykły, oraz przycisk stanowy, który imituje ciągłe naciskanie danego klawisza. Np. chcąć przetrzymać Control, klikamy na niego, następnie wykonujemy żadaną ekcję, i po skończeniu naszej akcji zwalniamy przycisk, również klikając na niego. Dwa duże pola na środku ekranu oznaczają odpowiednio lewy i prawy przycisk myszy.

Linki Przy tworzeniu projektu bardzo pomocnymi okazały się oficjalne dokumentacje Androida http://developer.android.com oraz Javy http://docs.oracle.com/javase/6/docs/ . Często też swoje problemy rozwiązywaliśmy czytając forum http://stackoverflow.com/