我正在构建一个应用程序,它必须将各种传感器值同时记录到 .csv 文件中(如果传感器可用)。任何人都可以建议将值插入到 csv 文件(表格形式)中的方法。是否可以记录所有单个传感器更改事件中的 .csv 值。
安瓦
我正在构建一个应用程序,它必须将各种传感器值同时记录到 .csv 文件中(如果传感器可用)。任何人都可以建议将值插入到 csv 文件(表格形式)中的方法。是否可以记录所有单个传感器更改事件中的 .csv 值。
安瓦
您一次只能从 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;
}
}