PO/X. 1. Smartphone jako uniwersalny kontroler (myszka/gamepad

Transkrypt

PO/X. 1. Smartphone jako uniwersalny kontroler (myszka/gamepad
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/

Podobne dokumenty