2011-07-13 92 views
1

我建立一個應用程序,它必須將各種傳感器值同時記錄到一個.csv文件(如果傳感器可用)。任何一個建議如何將值插入到csv文件中)。是否有可能在單個傳感器更改事件中記錄所有.csv值。Android傳感器同時記錄值

Anva

+0

我不是很理解這個問題,你問的是如何同步傳感器輸出,或者你問一個關於插入數據的問題? – Idistic

+0

您的意思是您想要將數據寫入傳感器的事件處理程序中嗎? –

+0

謝謝你的時間....我需要記錄所有的傳感器(accl,prox。,gps等)...... – Anva316

回答

2

只能在一個時間接收來自1個傳感器的數據,並且所述傳感器可以是在不同的時間間隔報告數據。

有幾種方法可以解決這個問題。

最簡單的方法是緩存每個傳感器的值,然後每當您獲取任何傳感器的新數據時,都會更新該傳感器的緩存值,然後用所有緩存的傳感器值寫入新的CSV行。這個新的CSV行只會與之前剛剛更新數據的1個傳感器不同。對於傳感器,你已經有了不成文的數據即數據 -

(Pseudo-code) 
onSensorChanged(SensorEvent event) { 
    //Note: in practice, you need to copy the values out of the event.values array 
    //using, for example, System.arraycopy 
    cached_values[event.sensor.getType()] = event.values; 
    writeCsvLine(cached_values); 
} 

或者,而不是每次都寫一行CSV的你會得到一個數據,你可以直到你得到一個「重複」緩存的傳感器值對於。然後,您將爲緩存值寫出一個CSV行,爲每個傳感器重置您的「is_written」標誌,並更新剛得到的傳感器的緩存值。這樣,CSV文件中的重複值不會很多,但仍然保證不會錯過任何報告的傳感器值。

(Pseudo-code) 
onSensorChanged(SensorEvent event) { 
    if (!cached_value_written[event.sensor.getType()]) { 
     writeCsvLine(cached_values); 
     cached_values_written.reset(); //reset all flags to true 
    } 
    cached_values[event.sensor.getType()] = event.values; 
    cached_value_written[event.sensor.getType()] = false; 
} 

另一種方法是緩存的傳感器值,你讓他們,然後在一個單獨的線程,你會搶的「當前」值每,比如說,1秒,並把它們寫出來。在這種方法中,您需要小心地同步對緩存值的訪問,因爲您將在單獨的線程中讀寫。

(Pseudo-code) 
onSensorChanged(SensorEvent event) { 
    synchronized(cached_values) { 
     cached_values[event.sensor.getType()] = event.values; 
    } 
} 

//on a separate thread: 
run() { 
    while (true) { 
     Thread.sleep(1000); 
     synchronized(cached_values) { 
      writeCsvLine(cached_values);    
     } 
    } 
} 

,或者,而不是一個單獨的線程,檢查每1秒,你可以存儲在你上次寫的值的時間,然後當你在一個新的價值得到,檢查1秒(或無論您希望使用哪個間隔),自上次寫入數據以來已過去了,如果是,請使用當前緩存的值編寫新的CSV行。

(Pseudo-code) 
onSensorChanged(SensorEvent event) { 
    long currentTime = System.currentTimeMillis(); 
    cached_values[event.sensor.getType()] = event.values; 
    if (currentTime - lastWrittenTime >= 1000) { 
     writeCsvLine(cached_values); 
     lastWrittenTime = currentTime; 
    } 
}