PDAclub.pl - Forum użytkowników technologii mobilnych
Windows Mobile (Classic, Professional, Standard), Windows Phone 6.x oraz 7/8.x/10 => Oprogramowanie PPC => Dla programistów => Wątek zaczęty przez: tplewa w 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 :)
-
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.
-
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...
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:
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)...
-
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 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....
-
A kod tego gostka widziałeś może http://scottandmichelle.net/scott/comments.html?entry=784 (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/ (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ć ...
-
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 :)
-
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
-
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 :)
-
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:
-
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.