2011-07-13 21 views
1

さまざまなセンサー値を.csvファイルにシームレスに記録するアプリケーションを構築する(センサーが利用可能な場合)。csvファイルに値を挿入する方法を提案できますか(テーブル形式).csv値をすべて1回のセンサーチェンジイベントに記録することができます。Androidセンサーで同時に値を記録する

Anva

+0

私は本当にあなたがセンサ出力を同期する方法を求めているか、データの挿入について質問をされている、この質問を理解していないのですか? – Idistic

+0

センサーのイベントハンドラにデータを書きたいのですか? –

+0

あなたの時間をありがとう....私はすべてのセンサー(accl、prox。、gpsなど)simultaeouslyを記録する必要があります... – 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; 
    } 
} 
関連する問題