2011-08-29 11 views
5

Voglio tracciare dati in tempo reale da un dispositivo bluetooth. Dispongo di un dispositivo Bluetooth al quale il telefono si connetterà e leggerà i dati provenienti da esso. I dati sono livelli di tensione di alcuni sensori e hanno una frequenza di campionamento di 300 campioni al secondo. La maggior parte delle librerie di grafici (come aiChart, Androidplot, achartengine, ...) che ho visto non possono gestire quella quantità di dati e ridipingere il grafico. Così ho esaminato OpenGL e Android NDK e sembra che potrei essere in grado di rappresentare graficamente utilizzando uno di questi con le frequenze di campionamento che ho. Qualcuno ha un codice di esempio per il tracciamento del grafico a linee openGL nell'esempio di codice Android/Java e/o NDK?Rappresentazione grafica dinamica con openGL in Android

risposta

3

Abbiamo fatto qualcosa di simile semplicemente creando una classe di array di punti con più pagine e disegnando in opengl con offset in modo che il punto corrente si trovi sempre nello stesso punto.

L'idea utilizza matrici di dimensioni fisse con un contatore separato in modo da non incorrere in problemi di allocazione della memoria che potrebbero causare l'avvio di gc. Una volta che una pagina è piena, scorrere alla pagina successiva visualizzando anche il vecchio. L'idea è che se hai 5 pagine, puoi scrivere su uno, visualizzare l'altro 3 e scrivere in batch l'ultimo in sqlite su una sdcard in un thread separato in modo da poter estrarre tutti i dati in un secondo momento.

Finché si ha solo scritto un thread alla matrice si può ottenere via con qualcosa di simile a

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  
} 

E 'molto veloce e dovrebbe fare quello che ti serve. È quindi possibile stampare come punto su una tela o disegnare in op.

Sperare che aiuti.

+0

La tua idea ha senso scrivere per dire 5 pagine di dati ... infatti l'ultima pagina può essere lanciata in un processo/thread laterale per fare la scrittura su SD. Anche se il tuo metodo di codice non andrebbe con quello che sembra troppo lento. Dal momento che i dati possono essere di dimensioni e velocità variabili e spingendo un array dire quando si hanno 10 nuovi punti di dati e la ri-indicizzazione sarebbe troppo lenta. Quindi perché uso LinkedLists se questo è il codice Java di cui stiamo parlando. – JPM

+0

Una domanda nel codice openGL l'hai scritta in Android/Java o in C/NDK? – JPM

+0

Hi JPM Il motivo per cui sono andato con gli array statici è di evitare gc dato che quello era il mio collo principale. Ho trovato dall'esperienza personale che le classi dinamiche fanno migliaia di oggetti e che uccideranno ogni possibilità di mantenere un flusso di dati veloce. L'utilizzo di una matrice statica con un indice da terminare indica la sua unica operazione per reimpostarla (impostando la fine su -1) e i dati vengono sovrascritti come aggiunti. Gioca con il DDMS e puoi tracciare dove stai creando oggetti. Ho scritto tutto in Android Java ed è stato abbastanza veloce una volta rimosso GC. – Kactus