2011-08-29 19 views
5

Quiero trazar datos en tiempo real desde un dispositivo bluetooth. Tengo un dispositivo Bluetooth con el que el teléfono se conectará y leerá los datos que provengan de él. Los datos son niveles de voltaje de algunos sensores y tienen una frecuencia de muestreo de 300 muestras por segundo. La mayoría de las librerías de trazado (como aiChart, Android plot, achartengine, ...) que he visto no pueden manejar esa cantidad de datos y volver a pintar el gráfico. Así que busqué en OpenGL y Android NDK y parece que podría graficar usando cualquiera de estos con las tasas de muestra que tengo. ¿Alguien tiene un código de muestra para el trazado de gráfico de línea OpenGL en muestra de código de Android/Java y/o NDK?Gráfico dinámico Trazado con OpenGL en Android

Respuesta

3

Hicimos algo así simplemente creando una clase de matriz de puntos con varias páginas y dibujando en OpenGL con desplazamiento para que el punto actual esté siempre en el mismo lugar.

La idea es usar arreglos de tamaño fijo con un contador separado para no tener problemas de asignación de memoria que causarían la entrada de gc. Una vez que una página está llena, pase a la página siguiente mostrando la anterior también. La idea es que si tiene 5 páginas, puede escribir en una, mostrar las otras 3 y por lotes escribir la última en sqlite en una tarjeta SD en un hilo separado para que pueda extraer todos los datos más adelante.

Mientras que sólo tiene un hilo de escritura a la matriz que puede salirse con algo como

arrayPoint[] p; 
.... 
int currentPos = 0; 
arrayPoint current = p[currentPos]; 

..... 
while(.... 

if(current.end < current.max) 
{ 
     .... get datax and datay 
    current.end++; 
    current.x[current.end] = datax; 
    current.y[current.end] = datay; 
} 
else 
{ 
    currentPos = getNextPos(); 
    current = p[currentPos]; 
    current.end = -1; // truncate the array without actually freeing or allocating mem 
    ..... flip volatile bool to let other thread know its ok to get exclusive access to its data etc  
} 

Es muy rápido y debe hacer lo que necesita. A continuación, puede generar como un punto en un lienzo o dibujar en OpenGL es

Espero que ayude.

+0

Tu idea tiene sentido acerca de la escritura para decir 5 páginas de datos ... de hecho, la última página puede enviarse a un proceso/hilo secundario para escribir en SD. Aunque su método de código no iría, eso parece demasiado lento. Como los datos pueden ser de tamaño y tasas variables, y presionar una matriz, digamos cuando tienes 10 nuevos puntos de datos y la nueva indexación sería demasiado lenta. De ahí que use LinkedLists si este es el código Java del que estamos hablando. – JPM

+0

Una pregunta en su código OpenGL ¿lo escribió en Android/Java o en C/NDK? – JPM

+0

Hola JPM La razón por la que fui con las matrices estáticas es para evitar gc, ya que ese era mi cuello principal de botella. He descubierto por experiencia personal que las clases dinámicas crean miles de objetos y que matarán cualquier posibilidad de mantener el flujo de datos rápido. El uso de una matriz estática con un índice para el final significa su única operación para restablecerlo (estableciendo el final en -1) y los datos se escriben como agregados. Juega con DDMS y puedes rastrear dónde estás creando objetos. Escribí todo en Android Java y fue lo suficientemente rápido una vez que eliminé GC. – Kactus