OpenGL USB i akcelerometr

0

Witam. Mam do zrealizowania mały projekt w którym korzystam z akcelerometry i żyroskopu. Dane z sensorów odbierane są z częstotliwością 50Hz.
Korzystam z dostępnej biblioteki dll w c++. Przy obsłudze tych sensorów niezwykle ważny jest czas reakcji.
Posiadam przykładowy program konsolowy wygląda on mniej więcej tak

DWORD StartTick = GetTickCount();
while ((GetTickCount() - StartTick) <= 100000)
{
	do
	{
	iErr = INEMO2_GetDataSample(hDevice, &frame);
	if (iErr == INEMO2_ERROR_NONE)
	process();	

Mój problem pojawia się, gdy chcę wizualizować rotację obiektu powiedzmy "online" w openGL.

Z tego co czytałem 'każdy' program musi korzystać glutMainLoop();.
Jeżeli funkcję tą glutMainLoop(); wywołam przed kodem to wyświetla mi się okno openGl, ale nie odbieram danych w konsoli.
Jeżeli zrobię rzecz odwrotną to program odbiera dane w konsoli, ale nie wyświetla okna OpenGL.

Pomyślałem,więc że zrobię coś takiego
w funkcji process() dodałem iErr = INEMO2_GetDataSample(hDevice, &frame);
a w funkcji main.
glutTimerFunc(20,process,0);
Nie korzystam z pętli while, tylko cyklicznie wywołuje funkcję timera.
Teoretycznie 20ms (1/50Hz) powinno być ok, w praktyce sprawa się komplikuje. Ruszam sensorem, a reakcja w konsoli jest opóźniona o 1,5 sekundy.
Spróbowałem zmniejszyć czas do 10ms:

  • katuje komputer zbyt częstym odświeżaniem
  • sensory nie zdążają z wysyłaniem ramek, część ramek które chcę analizować są puste.

Chciałbym zrobić coś takiego.

  1. uruchomienie pętli while
  2. odczyt ramki
  3. analiza ramki
  4. aktualizacja okna openGl
  5. powrót na początek pętli

Jestem całkowicie nowy w OpenGl, może ktoś coś podpowie:)
Z góry dziękuje za jakiekolwiek podpowiedzi:)

0

Hej. Opcji jest kilka, możesz np. odczytywać dane z sensora w osobnym wątku, a w głównym tylko wyświetlać, możesz nie korzystać z gluta tylko np. z SDLa/WinAPI/cokolwiek (http://www.libsdl.org/release/SDL-1.2.15/docs/html/guidevideoopengl.html http://nehe.gamedev.net/tutorial/creating_an_opengl_window_%28win32%29/13001/), gdzie ma się większą kontrolę nad tym jak wykonuje się główna pętla programu.

0

Witam, dzięki za odpowiedź.
Nie chciałem zmieniać biblioteki- zostałem przy glut.
Tak jak podpowiedziałeś zrobiłem to na 2 wątkach i śmiga całkiem nieźle.
Co prawda w wątku odpowiadającym za wyświetlanie musiałem dać funkcję odświeżającą co określony czas( mało eleganckie rozwiązanie), ale program działa.

W wypadku, gdy chciałem wykonać funkcję glutPostRedisplay(); w funkcji z obliczaniem danych z akcelerometru program się przestawał współpracować
Pozdrawiam:)

0

glutIdleFunc może być latwiejsze w użyciu niż dwa wątki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1