Ich hatte mir mal eine Klasse für den HTC G-Sensor gebaut, vor allem weil ich nirgends Möglichkeiten finden konnte, dann auch Code im Mobile Device Emulator testen zu können.
Auch fehlte mir ein simples aber brauchbares Event Handler System auf Basis von Callback Handlern.
Diese Klasse soll all denen helfen, die entweder im Mobile Device Emulator mit dem G-Sensor experimentieren wollen oder mit PocketFrog/PocketHAL oder anderen Game Lib's schaffen und den G-Sensor umsetzen wollen.
Verwendung des G-Sensor in PocketFrog
Bitte auch in GSensor.h und Sensor.cpp schauen, der Code ist recht gut dokumentiert, allerdings in schlechtem englisch.
1. Erzeuge Datenmember in deiner myGame.h und inkludiere die G-Sensor deklaration
2. Speichere hInstance ins DatenmemberCode:#include "GSensor.h" class myGame : public Game { ... public: HINSTANCE m_hInstance; GSensor m_GSensor; };
3. Initialisieren des G-Sensor in myGame.cppCode:int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPTSTR, int ) { _Module.Init( 0, hInstance ); myGame game; myGame.m_hInstance = hInstance; myGame.Run(); return 0; }
Wie hier recht gut zu sehen ist, es wird eigentlich nur das Instance-Handle der Anwendung gebraucht um den G-Sensor zu initialisieren.Code:bool myGame::GameInit() { Display* pDisplay = GetDisplay(); ... m_gSensor.Initialize( g_hInstance ); // initialize G-Sensor system m_gSensor.WaitToInitialize( 1 ); // wait 1 second return true; }
Das sollte in allen möglichen Anwendungstypen möglich sein.
Wie bekomme ich die Daten vom G-Sensor
Die Klasse bietet eine ganze Reihe an Methoden an.
für den Tilt-Sensor:
DWORD GetSensorData( PSENSORDATA a_pSensordata );
DWORD GetAngleX( void );
DWORD GetAngleY( void );
SHORT GetTiltX( void );
SHORT GetTiltY( void );
SHORT GetTiltZ( void );
Für den Gesture- und den D-Pad Sensor
bool IsPaneTouched( void );
bool IsPaneLeftTouched( void );
bool IsPaneRightTouched( void );
bool IsPaneWheelTouched( void );
bool IsPaneWheelCenterTouched( void );
BYTE GetPaneLeftTouchedX( void );
BYTE GetPaneLeftTouchedY( void );
BYTE GetPaneRightTouchedX( void );
BYTE GetPaneRightTouchedY( void );
BYTE GetPaneWheelAngle( void );
und für den Wechsel der Orientierung
ENUM_ORIENTATION GetOrientation( void );
Wie wird das Callback Event Handler System verwendet
Zuerst, jeder eigene Event-Handler hat diese Signatur:
Definiere für jedes gewünschte Event je eine eigene Funktion mit der obigen Signatur.Code:void OnMyEvent( void );
Einen CAllback Handler verbinden
Die Klasse hat drei Callback-Handler Systeme:
A: Events beim ändern der Orientierung
enum ENUM_ORIENTATION
{
ORIENTATION_LANDSCAPE = 0,
ORIENTATION_REVERSE_LANDSCAPE = 1,
ORIENTATION_PORTRAIT = 2,
ORIENTATION_UPSIDE_DOWN = 3,
ORIENTATION_FACE_DOWN = 4,
ORIENTATION_FACE_UP = 5,
ORIENTATION_UNKNOWN = 6
};
B: Events am Gesture-Sensor
enum ENUM_GESTURE
{
GESTURE_ROTATION_CLOCKWISE = 0,
GESTURE_ROTATION_COUNTERWISE = 1
};
C: Events am Touch-Pad Senor
enum ENUM_TOUCH
{
TOUCH_PANE = 0, // Einer für alle!
// oder separat, benutze TOUCH_PANE und die folgenden nie zur gleichen Zeit
// denn Touch_PANE wird dabei auch immer aufgerufen!
TOUCH_PANE_LEFT = 1,
TOUCH_PANE_RIGHT = 2,
TOUCH_PANE_WHEEL = 3, // gesture pane
TOUCH_PANE_WHEEL_CENTER = 4
};
Jeder Event-Typ hat seinen eingenen Connector.
Beispiel für Orientation Events:
Handler verbinden
Der Event-Handler hat dabei folgende Signatur:Code:m_GSensor.ConnectCallbackHandler( GSensor::ORIENTATION_PORTRAIT, OnOrientationPortrait );
void OnOrientationPortrait( void );
Also wird für jedes gewüschte Event je eine Funktion geschrieben und diese dann per ConnectCallbackHandler mit dem G-Sensor verbunden.
Den Enum (oben) sind die möglichen Handlertypen leicht zu entnehmen.
Beispiel für Gesture Events:
und ein Beispiel für das Touch-Pad:Code:m_GSensor.ConnectCallbackHandler( GSensor::GESTURE_ROTATION_CLOCKWISE, OnRotateClockwise );
Beachte: Der Tilt Sensor hat kein Event-Handler System!Code:m_GSensor.ConnectCallbackHandler( GSensor::TOUCH_PANE_LEFT, OnLeftPaneTouched );
Dessen Daten können nur per Polling abgefragt werden.
Verwenden des G-Sensor Emulator-Mode für den Windows Mobile Device Emulator
Kommentiere Zeile 7 in GSensor.h aus, das ist alles!
Wenn Du das gemacht hast werden eine ganze Reihe weiterer Methoden für den Emulator Mode aktiv. Mit diese können die Daten im G-Sensor verändert werden.
bool SetOrientation( ENUM_ORIENTATION a_enumOrientation );
void SetSensorData( PSENSORDATA a_pSensordata );
void SetAngleX( DWORD a_dwAngleX );
void SetAngleY( DWORD a_dwAngleY );
void SetTiltX( SHORT a_sTiltX );
void SetTiltY( SHORT a_sTiltY );
void SetTiltZ( SHORT a_sTiltZ );
void SetPaneTouched( bool a_bIsPaneTouched = true );
void SetPaneLeftTouched( bool a_bIsPaneLeftTouched = true );
void SetPaneRightTouched( bool a_bIsPaneRightTouched = true );
void SetPaneWheelTouched( bool a_bIsPaneWheelTouched = true );
void SetPaneWheelCenterTouched( bool a_bIsPaneWheelCenterTouched = true );
void SetPaneLeftTouchedX( BYTE a_byPaneLeftTouchedX );
void SetPaneLeftTouchedY( BYTE a_byPaneLeftTouchedY );
void SetPaneRightTouchedX( BYTE a_byPaneRightTouchedX );
void SetPaneRightTouchedY( BYTE a_byPaneRightTouchedY );
void SetPaneWheelAngle( BYTE a_byPaneWheelAngle );
Wenn Du Daten änderst, werden die verbundenen Callback-Handler aufgerufen!
Du kannst so testen, wie sich die Anwendung verhält - wenn sie bestimmte Sensordaten empfängt.
Klar ist natürlich: Der Emulator-Mode bietet nur eine Schnittstelle um die Sensordaten zu manipulieren, den G-Sensor wird nicht wirklich emuliert.
Er liefert die Daten, die Du ihm gegeben hast, nicht mehr und nicht weniger.
Immerhin, zum Testen im Geräteemulator ist das schon mehr als genug.
Wenn Du z.B. SetOrientation(...) aufrufst werden auch alle dazu gehörenden Sensor-Werte geändert:
AngleX, AngleY, TiltX, TiltY, TiltZ und - wenn verbunden - auch der dazu gehörende Event Handler aufgerufen.
Im echten Gerät muss man die Daten dann nicht von Hand setzen, der Rest bleibt aber gleich. Von daher nutze ich den Emulator-Mode recht intensiv.
Ich hoffe die Klasse ist hilfreich für dich.
Viel Glück und hab Spaß damit!
Grüßle CF
Downloads:
GSensor.h: http://www.desktophilfe.de/down/GSensor.h
GSensor.cpp: http://www.desktophilfe.de/down/GSensor.cpp
Hier noch eine kleine Orientierungshilfe:
![]()









Automatisch generierter Sicherheitshinweis



