Android Sensor записывает значения одновременно - PullRequest
1 голос
/ 13 июля 2011

Я создаю приложение, которое должно одновременно записывать различные значения датчиков в файл .csv (если датчики доступны). Может ли кто-нибудь предложить способы продолжать вставлять значения в файл csv (в виде таблицы). Возможно ли это записать все значения .csv в одном событии смены датчика.

ANVA

1 Ответ

2 голосов
/ 28 апреля 2012

Одновременно можно получать данные только от одного датчика, и датчики могут передавать данные через разные промежутки времени.

Есть несколько способов подойти к этому.

Простейшим было бы кэширование значений для каждого датчика, а затем всякий раз, когда вы получаете новые данные для любого датчика, вы обновляете кэшированное значение для этого датчика, а затем записываете новую строку 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;
    }
}
...