Obsluga G-Sensora Touch HD i nie tylko...

  • 10 Odpowiedzi
  • 3887 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

*

Offline tplewa

  • ****
  • 688
  • Płeć: Mężczyzna
  • Sprzęt: HTC Touch HD
Obsluga G-Sensora Touch HD i nie tylko...
« dnia: Sierpień 24, 2009, 19:22:52 »
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 :)

« Ostatnia zmiana: Sierpień 24, 2009, 19:37:40 wysłana przez tplewa »
"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe."

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: Obsluga G-Sensora Touch HD i nie tylko...
« Odpowiedź #1 dnia: Sierpień 24, 2009, 19:56:38 »
To jest kod w czystym C a nie w C# więc w zasadzie to o co Ci chodzi ( C++ jest rozszerzeniem C w uproszeniu pewnym). To, co Ci nie chodzi to najwyraźniej niewłaściwa nazwa pliku urządzenia "ACS1" Poszperaj jakie device masz odpalone na fonie i spróbuj zgadnąć które to czujnik.
Kod po prostu otwiera urządzenie i wywołuje jego usługę. To tak wygląda skomplikowanie bo dochodzą szczegóły z buforami (robi się to wszystko na najniższym poziomie właściwie niżej byś tylko w ASM-ie to mógł rozpisać ), następnie dekompresuje info do tej struktury interfejsu. Sama funkcja jest tylko owijaczem dającym kulturalny dostęp do funkcji czujnika.
Aha w tym wypadku urządzenie nie działa jak strumień :P Raczej jest to uchwyt, na którym możesz wykonywać operacje.

*

Offline tplewa

  • ****
  • 688
  • Płeć: Mężczyzna
  • Sprzęt: HTC Touch HD
Odp: Obsluga G-Sensora Touch HD i nie tylko...
« Odpowiedź #2 dnia: Sierpień 24, 2009, 20:12:53 »
To ze przyklad jest w C to wiem - mam inne (dzialajace w C# - ale ich nie przeanalizowalem dokladnie choc tez uzywaja HTCSensorSDK.dll


Co do nazwy urzadzenia to tutaj nie ma problemu, ACS1: - jest tylko w przykladowym source dll-ki jaki mam. Natomiast uzywam oryginalnej
HTCSensorSDK.dll - ktorej uzywa dzialajacy przyklad w C# - jaki znalazlem. Poprostu staram sie uzyc funkcje z DLL-ki i to nie dziala :) pytanie dlaczego :)

Czy kod w C jest dla mnie skomplikowany - akurat tuaj nie i go swietnie rozumiem. Nie wiem tylko dlaczego importowana funkcja z czyjejes DLL ki mi nie dziala :) Natomiast przegladajac kody w C# tez uzywaja tej DLL-ki i im jakos to dziala :)

W sumie narazie czarna magia - jak dla mnie - jeszcze przegladne kod czy gdzies nie zrobilem jakiekiegos ewidentnego babola (przez nieuwage).

Akurat jesli chodzi o programowanie to robie to wiele lat - z tym ze na WinMobile poswiecilem moze z 48godzin zabawy w programowanie. W miedzyczasie popisalem sobie troche w C# dla zabawy i w C++ WinAPI potestowalem obsluge DirectX 3D Mobile...

Cytuj
Poszperaj jakie device masz odpalone na fonie i spróbuj zgadnąć które to czujnik.

no wlasnie troche tego chcialem unikac, tzn. wole wziasc IDA i juz cos zdisassemblowac :) i bede wiedzial :) niz szukac po omacku :)

A niestety to co znalazlem odnosnie czujnikow w HTC to tylko przyklady i biblioteki w C# (ktory jakos srednio trawie)....

ot fragment z dzialajacego przykladu w C#:

        [DllImport("HTCSensorSDK")]
        extern static IntPtr HTCSensorGetDataOutput(IntPtr handle, out HTCGSensorData sensorData);




        public HTCGSensorData GetRawSensorData()
        {
            HTCGSensorData data;
            HTCSensorGetDataOutput(myHandle, out data);
            return data;
        }



Co do:
Cytuj
Aha w tym wypadku urządzenie nie działa jak strumień język Raczej jest to uchwyt,

Jak zwal tak zwal :) w Windows od X czasu mamy dostep przez Otwarcie pliku do urzadzen :) Wiec tutaj klucenie sie czy to uchwyt czy plik czy strumien :) nie ma sensu :) Choc uscislajac to uchwyt mamy faktycznie  hFile (do pliku)...


« Ostatnia zmiana: Sierpień 24, 2009, 20:21:13 wysłana przez tplewa »
"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe."

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: Obsluga G-Sensora Touch HD i nie tylko...
« Odpowiedź #3 dnia: Sierpień 24, 2009, 20:28:55 »
No ale Twoja wypowiedź była tak chaotyczna, że mnie zmyliłeś całkowicie. Zresztą ją sobie przeczytaj ...
Rozumiem, że stoisz na tym otwieraniu urządzenia - zaraz zerknę dokładniej ...
Napisane: Sierpień 24, 2009, 20:27:08
A czemu 0 w drugim parametrze? Nie powinieneś dać chociaż GENERIC_READ ?

*

Offline tplewa

  • ****
  • 688
  • Płeć: Mężczyzna
  • Sprzęt: HTC Touch HD
Odp: Obsluga G-Sensora Touch HD i nie tylko...
« Odpowiedź #4 dnia: Sierpień 24, 2009, 20:42:34 »
No ale Twoja wypowiedź była tak chaotyczna, że mnie zmyliłeś całkowicie. Zresztą ją sobie przeczytaj ...
Rozumiem, że stoisz na tym otwieraniu urządzenia - zaraz zerknę dokładniej ...
Napisane: Sierpień 24, 2009, 20:27:08
A czemu 0 w drugim parametrze? Nie powinieneś dać chociaż GENERIC_READ ?

No faktycznie troche zamieszalem....

Co do HANDLE hFile = CreateFile(L"ACS1:", 0, 0, NULL, OPEN_EXISTING, 0, NULL );

to jest akurat z jakiegos przykladu (chyba dla Omni) znalezionego w internecie (napisany podobno na podstawie HTCSensorSDK.dll).

Wiec w to nie wnikalem dokladnie... teoretycznie w  HTCSensorSDK.dll jaka mam w telefonie (oryginalnie)... powinno byc to napisane poprawnie... dlatego na poczatku chcialem sobie zaimportowac z niej funkcje - jednak cos nie dziala :) i tu pies pogrzebany.

Najdziwiniejsze to ze innym w C# dziala importowanie z tej DLL-ki i program ladnie obsluguje G-Sensor.

Choc tutaj nie o sam import chodzi he he :) bo to co napisalem musi dzialac :)

Moze ktos znajacy C# moze zerknac na kod dostepnego sensorapi dla HTC i cos podpowiedziec... moze cos pominelem z tego kodu co jest istotne dla uzywania HTCSensorSDK.dll....



"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe."

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: Obsluga G-Sensora Touch HD i nie tylko...
« Odpowiedź #5 dnia: Sierpień 24, 2009, 21:07:31 »
A kod tego gostka widziałeś może http://scottandmichelle.net/scott/comments.html?entry=784 Ja bym od niego zaczął...

On tam jeszcze przed wywołaniem tej funkcji do odczytu danych wywołuje funkcję otwarcia czytnika ...

A tutaj jakiś owijacz do net-u: http://blog.enterprisemobile.com/2008/07/using-htc-diamonds-sensor-sdk-from-managed-code/ - daję żeby nie zgubić linku :P Może ktoś w C# będzie chciał się do niego dobrać ...
« Ostatnia zmiana: Sierpień 24, 2009, 21:17:51 wysłana przez miba »

*

Offline tplewa

  • ****
  • 688
  • Płeć: Mężczyzna
  • Sprzęt: HTC Touch HD
Odp: Obsluga G-Sensora Touch HD i nie tylko...
« Odpowiedź #6 dnia: Sierpień 25, 2009, 06:12:18 »
Dobra temat juz nie aktualny :) jak zwykle zle podejscie i klasyczny babol :)

Zasugerowalem sie niepotrzebnie znowu fragmentem source niby tej dll-ki... ktory przy funkcji HTCSensorOpen wygladal tak:


HANDLE WINAPI HTCSensorOpen(DWORD)
{
DWORD OutBuffer = 0;
HANDLE hFile = CreateFile(L"ACS1:", 0, 0, NULL, OPEN_EXISTING, 0, NULL );
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD bytesReturned = 0;
//DWORD InBuffer = 0x8002D70C;
DWORD InBuffer = 0;
DWORD InSize = sizeof(DWORD);
DWORD OutSize = sizeof(DWORD);
BOOL result = DeviceIoControl(hFile, ACCOnRot, &InBuffer, InSize, &OutBuffer, OutSize, &bytesReturned, NULL);
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
return (HANDLE) 1;
}



a faktycznie jako parametr powinno sie podac (wykopane z c#) - choc wyzej tez nie napisalem ze uzywalem tez funkcji HTCSensorOpen
(nie widac tego w wklejonym fragmencie kodu)...



    enum HTCSensor : uint
    {
        Something = 0,
        GSensor = 1,
        Light = 2,
        Another = 3,
    }


no i przy podaniu jedynki nagle zaczelo dzialac  :mrgreen:

a kod w skrocie wyglada tak...
//DLL
typedef HANDLE (WINAPI* LPFNDLLFUNC1)(HANDLE, PSENSORDATA);
typedef HANDLE (CALLBACK* LPFNDLLFUNC2)(DWORD);
typedef void (CALLBACK* LPFNDLLFUNC3)(HANDLE);

HINSTANCE hDLL_HTCSensorSDK;               // Handle to DLL
LPFNDLLFUNC1 lHTCSensorGetDataOutput;    // Function pointer
LPFNDLLFUNC2 lHTCSensorOpen;    // Function pointer
LPFNDLLFUNC3 lHTCSensorClose;    // Function pointer

no i dalej:

hDLL_HTCSensorSDK = LoadLibrary(L"HTCSensorSDK");

if (hDLL_HTCSensorSDK != NULL)
{
lHTCSensorGetDataOutput = (LPFNDLLFUNC1)GetProcAddress(hDLL_HTCSensorSDK,
                                           L"HTCSensorGetDataOutput");

if (!lHTCSensorGetDataOutput) MessageBox....

lHTCSensorOpen = (LPFNDLLFUNC2)GetProcAddress(hDLL_HTCSensorSDK,
                                           L"HTCSensorOpen");

if (!lHTCSensorOpen) MessageBox....


lHTCSensorClose = (LPFNDLLFUNC3)GetProcAddress(hDLL_HTCSensorSDK,
                                           L"HTCSensorClose");

if (!lHTCSensorClose) MessageBox....

}
else {

MessageBox...

}

//
SensorHandle = lHTCSensorOpen(1);
lHTCSensorGetDataOutput(SensorHandle,&psd);
lHTCSensorClose(SensorHandle);

FreeLibrary(hDLL_HTCSensorSDK);




Jeszcze jak znajde chwile przeanalizuje ta oryginalna dll-ke i napisze kod ktory robi to samo - umieszczajac go tutaj dla potomnych he he

Podsumowujac chyba bedzie trzeba wkoncu zabrac sie za lepsze poznanie C# - grrrr a myslalem ze mnie to ominie  :mrgreen:  (jak dla mnie to okropny wynalazek - choc jak zwykle kwestia przyzwyczajen ma tu wieksze znaczenie he he )

Jednak z drugiej strony zaczyna mi sie podobac pisanie pod Windows Mobile :) - szkoda ze wczesniej nie wzielo mnie na jakies PDA lub Smartfona :)

« Ostatnia zmiana: Sierpień 25, 2009, 06:16:57 wysłana przez tplewa »
"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe."

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: Obsluga G-Sensora Touch HD i nie tylko...
« Odpowiedź #7 dnia: Sierpień 25, 2009, 08:42:05 »
Ten gość, do którego link podałem zamieścił demonstracyjną aplikację w klasycznym stylu i pokazuje jak się podłączyć do tej dll-ki. Dodatkowo zdaje się, że używa event-ów zamiast poolingu, co jest właściwym podejściem.
Chyba jednak nie trzeba się wcale tego c# uczyć - masz także zarządzany C++, w którym możesz kod netu pisać.
A na marginesie to pominięcie faktu, że wywołujesz funkcje otwierające to właściwie rujnuje cały opis problemu.  :S

*

Offline tplewa

  • ****
  • 688
  • Płeć: Mężczyzna
  • Sprzęt: HTC Touch HD
Odp: Obsluga G-Sensora Touch HD i nie tylko...
« Odpowiedź #8 dnia: Sierpień 25, 2009, 10:40:06 »
Ten gość, do którego link podałem zamieścił demonstracyjną aplikację w klasycznym stylu i pokazuje jak się podłączyć do tej dll-ki. Dodatkowo zdaje się, że używa event-ów zamiast poolingu, co jest właściwym podejściem.
Chyba jednak nie trzeba się wcale tego c# uczyć - masz także zarządzany C++, w którym możesz kod netu pisać.
A na marginesie to pominięcie faktu, że wywołujesz funkcje otwierające to właściwie rujnuje cały opis problemu.  :S

No co do pominiecia to faktycznie zrobilem babol-a kopiowalem z notatnika a nie z Visual Studio :) i dopiero potem zauwazylem...

Co do uzywania Eventow to oczywiscie dobre podejscie - ale na razie tego nie robilem - ot prosta procka SetTimer i w obsludze WM_TIMER odczyt danych i wypchanie ich przez DrawText :)

Po prostu tak sobie narazie testuje obsluge czujnikow w moim HTC... wiec kod pisany tak aby tylko dzialalo i bylo malo pisania  :mrgreen:

Ahh i na szybko odpalilem IDA   przy otwieraniu odwolanie jest do SEN0:... odbieranie danych wyglada calkiem inaczej niz w omni...
zreszta uwzglednione sa inne czujniki i dla G-sensora odpalany jest tez Event... cos w stylu CreateEvent(NULL, FALSE, FALSE, _T("HTC_GSENSOR_SERVICESTART"));


Natomiast co do pisania w C++ .NET to wiem bo tak od czasu do czasu pisze dla wiekszych wind :), jednak wiekszosc kodu to C# - wiec trudniej sie analizuje jak chce sie cos podgladnac....

Zreszta jakos nie trawie tego calego .NET - fajne jak sie chce napisac cos na szybko i nie potrzeba wiekszej wydajnosci (choc na PC czesciowo pomijalne przy obecnych procesorach). Jednak jak zalezy na wydajnym kodzie to niestety lepiej omijac...

Po czesci chce napisac wlasnie sobie cos w stylu gyrator-a bo brakuje mi w nim kilku spraw, a wiekszosc ma dla mnie zbednych (potrzebuje tylko obracanie - ale z ciekawsza mozliwoscia selekcji aplikacji)... do tego denerwuje mnie dlugi start i zjadanie na dzien dobry 1MB RAM-u (no ale to wlasnie bolaczka .NET) :)

Jednak wole WinAPI :)



"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe."

*

Offline miba

  • *****
  • 4050
  • Płeć: Mężczyzna
  • Sprzęt: Toshiba G900, doszedł x51v
Odp: Obsluga G-Sensora Touch HD i nie tylko...
« Odpowiedź #9 dnia: Sierpień 25, 2009, 14:41:31 »
W desktopowych windach też używasz czystego win api ( mam na myśli głównie kontrolki )? Bez jakiś owijaczy obiektowych i wspomagaczy? Trochę wolno się tak pisze... :)
Jak coś ciekawego Ci podczas tej zabawy z czujnikami wyjdzie to podrzuć na forum - może się komuś przyda. Niestety nie mam w swoim pda tych czujników, więc nawet nie mogę tego programiku przetestować :( A może jest jakaś wtyczka HTC do emulatorów WM wzbogacająca je o wirtualny czujnik?  :mysli:

*

Offline tplewa

  • ****
  • 688
  • Płeć: Mężczyzna
  • Sprzęt: HTC Touch HD
Odp: Obsluga G-Sensora Touch HD i nie tylko...
« Odpowiedź #10 dnia: Sierpień 25, 2009, 15:45:18 »
W desktopowych windach też używasz czystego win api ( mam na myśli głównie kontrolki )? Bez jakiś owijaczy obiektowych i wspomagaczy? Trochę wolno się tak pisze... :)
Jak coś ciekawego Ci podczas tej zabawy z czujnikami wyjdzie to podrzuć na forum - może się komuś przyda. Niestety nie mam w swoim pda tych czujników, więc nawet nie mogę tego programiku przetestować :( A może jest jakaś wtyczka HTC do emulatorów WM wzbogacająca je o wirtualny czujnik?  :mysli:

No nie raz tak mialem i tak pisalem :) nawet jedna aplikacje graficzna (do konwersji i obrabiania plikow dla maszyn tkajacych dywany) - calosc napisana w WinASM :) ot tak z nudow :) Choc najczesciej lepiej uzyc bylo MFC - choc zakrecone to i tak wydajniejsze od .NET :)

Co do programiku jak cos powstanie napewno umieszcze, ale jeszcze musze troche sie pobawic nowa zabawka - obczaic co to jeszcze potrafi :)
No i powoli zbieram pomysly na ten programik oraz analizuje jakies tam warianty jak to ma dzialac - tak aby bylo wygodne...

Odnosnie wtyczek to nie mam pojecia czy cos takiego istnieje... HTC-ka posiadam od niedawna i tak jakos mnie wzielo na zabawe w programowanie na ten sprzet. Bedzie przydatne bo w pracy uzywam troche specyficznych aplikacji - ktorych jak nie napisze to nigdzie nie dostane.



"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe."