Obsługa G-Sensora (HTC Touch HD) - ale nie koniecznie tylko ten model...
No właśnie mam z tym problem, większość przykładów jakie znalazłem dotyczy C# .NET - jednak mi chodzi o C++ Win API...
Jeszcze zrobię testy w C# czy czegoś nie pierniczę - ale czuję że nie wiele to da...
Niestety coś mi nie działa i jeszcze nie doszedłem co
Z tego co widziałem ludzie używają HTCSensorSDK.dll
Ot wygląda to PI*drzwi
tak :
typedef struct _SENSORDATA
{
SHORT TiltX; // From -1000 to 1000 (about), 0 is flat
SHORT TiltY; // From -1000 to 1000 (about), 0 is flat
SHORT Orientation; // From -1000 to 1000 (about)
// 0 = Straight up, -1000 = Flat, 1000 = Upside down
SHORT Unknown1; // Always zero
int AngleY; // From 0 to 359
int AngleX; // From 0 to 359
int Unknown2; // Bit field?
} SENSORDATA, *PSENSORDATA;
//DLL
typedef HANDLE (WINAPI* LPFNDLLFUNC1)(HANDLE, PSENSORDATA);
HINSTANCE hDLL_HTCSensorSDK; // Handle to DLL
LPFNDLLFUNC1 lHTCSensorGetDataOutput; // Function pointer
no i dalej:
SENSORDATA psd = {0};
hDLL_HTCSensorSDK = LoadLibrary(L"HTCSensorSDK");
if (hDLL_HTCSensorSDK != NULL)
{
lHTCSensorGetDataOutput = (LPFNDLLFUNC1)GetProcAddress(hDLL_HTCSensorSDK,
L"HTCSensorGetDataOutput");
if (!lHTCSensorGetDataOutput) MessageBox(NULL, TEXT("Bla Bla 1"), TEXT("Bla Bla 1"), NULL);
}
else {
MessageBox(NULL, TEXT("Bla Bla 2"), TEXT("Bla Bla 2"), NULL);
}
//
lHTCSensorGetDataOutput(hWnd,&psd);
FreeLibrary(hDLL_HTCSensorSDK);
itd.
No i zwraca mi zera
Znalazlem że funkcja w DLL wyglada mniejwiecej tak:
DWORD WINAPI HTCSensorGetDataOutput(HANDLE h, PSENSORDATA psd)
{
HANDLE hFile = CreateFile(L"ACS1:", 0, 0, NULL, OPEN_EXISTING, 0, NULL );
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD bytesReturned = 0;
DWORD InBuffer = 0;
DWORD InSize = sizeof(DWORD);
int OutBuffer[3];
DWORD OutSize = 0x0C;
memset(OutBuffer, 0, OutSize);
BOOL result = DeviceIoControl(hFile, 0x3F7, &InBuffer, InSize, &OutBuffer, OutSize, &bytesReturned, NULL);
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
psd->TiltX = OutBuffer[0];
psd->TiltY = OutBuffer[1];
psd->Orientation = OutBuffer[2];
psd->AngleX = 0;
psd->AngleY = 0;
psd->Unknown1 = 0;
psd->Unknown2 = 0;
}
return 1;
}
to jest chyba przeróbka na Omnie (juz nie pamietam gdzie to dorwałem) - bo HTC z tego co wiem zwraca tez AngleX i AngleY (tutaj sa zera).
Oczywiscie z tego co widac program prawidlowo laduje mi DLL-ke i prawidlowo uruchamia funkcje...
...jednak zwraca zera tak jak by ten warunek nie zostal spelniony if (hFile != INVALID_HANDLE_VALUE) - ot nie udaje sie w DLL CreateFile - czyli otwarcie strumienia do sprzetu...
Tak samo próbowałem zaimplementowac w/w kod z DLL-ki i taki objaw wlasnie dostaje.... Jednak myslalem ze z oryginalna bedzie to dzialac...
... jak sobie testuje z tym source i kompiluje wlasna DLL-ke ze zmiana typu:
DWORD WINAPI HTCSensorGetDataOutput(HANDLE h, PSENSORDATA psd)
{
psd->AngleX = 3;
psd->AngleY = 4;
HANDLE hFile = CreateFile(L"ACS1:", 0, 0, NULL, OPEN_EXISTING, 0, NULL );
if (hFile != INVALID_HANDLE_VALUE)
{
itd.
to oczywiscie zwraca wpisane wartosci ok
czyli nie jest to jakis dziwny problem z obsluga DLL. Choc w to to akurat watpilem - jednak w desperacji juz sprawdzilem...
Ma ktos jakies pomysly
Moze jakies dzialajace przyklady w C++
Cala zabawa w tym ze pod WinMobile pisze od niedawna... a C# to dopiero poczatki (ot napisalem tylko maly programik)... Dlatego analiza czyjegos kodu w C# nie jest dla mnie najlatwiejsza...
Choc w .NET i pod duzego Windowsa troche pisalem w Win ASM(masm32)/C++/MFC/C++ .NET...
hmmm jeszcze to chyba bede męczył... bo nie daje mi spokoju ten czujnik
jak nie to chyba IDA mnie czeka