środa, 31 marca 2010

Fusy i JNI

W pracy dostałem bardzo ciekawe zadanie. Otóż jest sobie pewne urządzenie nad którym mój zespół pracuje. Urządzenie to składa się z wielu elementów. Elementy mogą mieć pod elementy i parametry. Urządzenie jest podłączane do komputera PC poprzez port szeregowy RS232. Trzeba zapewnić oprogramowaniu na PC prosty dostęp do wszystkich parametrów wszystkich elementów urządzenia.

Ponieważ struktura urządzenia bardzo przypomina strukturę katalogów i plików na dysku twardym i jednocześnie trzeba zapewnić prosty i równoległy (jednego parametru może potrzebować więcej niż jedna aplikacja) dostęp, to pod linuxem wykorzystano tzw. FUSE. Moim zadaniem było opracowanie rozwiązania działającego na Windowsie. Zdecydowałem się na identyczne podejście. Co prawda nigdy w życiu nie napisałem sterownika dla Windowsa, ale ...

W ramach poszukiwań jak cały problem ugryźć trafiłem na bibliotekę Dokan na licencji LGPL i MIT, która robi dokładnie to czego potrzebowałem, tj. montuje urządzenie ze sterownikiem systemu plików, który przekierowuje wszystkie żądania do wskazanych callbacków. Jedynym zgryzem jest to, że próba debugowania kodu funkcji zwrotnych kończy się prawie zawsze BSODem. Nie można oczekiwać aby wielozadaniowy system działał stabilnie w momencie gdy ktoś zatrzymuje mu breakpointem kod jądra. A może można, tylko ja się już tak przyzwyczaiłem do fanaberii produktów Microsoftu?

Kolejnym ciekawym zadaniem, które mi się trafiło była realizacja aplikacji rysującej przebiegi parametrów w formie kontrolki na stronę internetową. Ponieważ wszystko ma działać również pod linuxem wybór padł na applet javy, który w jakiś sposób korzysta z OpenGL.
Wykorzystanie OGL z poziomu javy jest możliwe na przykład za pomocą biblioteki JOGL. Ja jednak miałem już gotowy kod w C++, który realizował całe rysowanie w OGL i nie miałem ochoty się narobić przy przenoszeniu tego do javy (zwłaszcza, że mi osobiście to jego działanie się nie podoba i chciałbym zostawić sobie możliwość poprawek). Akurat gdy zacząłem szukać alternatyw dla JOGLa pojawił się wpis na blogu Wojciecha Tomana na temat JNI. Dłużej nie musiałem szukać :) Zamknięcie renderingu w dllce okazało się prostsze niż się tego początkowo spodziewałem. Najwięcej problemów miałem z samym appletem (jak ja nie lubię javy). Jedna rzecz, która mi się nie podobała w rozwiązaniu Pana Wojciecha to użycie SWT. Na szczęście udało mi się to obejść: informacje o tym jak wydobyć uchwyt okna bez użycia swt.