1

さまざまなセンサー値を.csvファイルに同時に記録する必要があるアプリケーションを構築しています(センサーが利用可能な場合).csvファイル(表形式)に値を挿入し続ける方法を提案できますか.すべてを記録することは可能ですか単一のセンサー変更イベントの .csv 値。

アンバ

4

1 に答える 1

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;
    }
}
于 2012-04-27T23:21:38.917 に答える