Как собрать данные с нескольких мобильных датчиков одновременно в Java? - PullRequest
0 голосов
/ 24 января 2020

Я хочу собрать данные с акселерометра, гироскопа и магнитометра одновременно. В настоящее время я использую сервис SensorManager, основанный на SensorEvent. Проблема в том, что я могу получить данные только от одного датчика в данный момент времени. Таким образом, во время t1 я получаю данные от ускорителя, в t2 я получаю данные от гироскопа, а в t3 я получаю данные от магнитометра.

Мой код выглядит следующим образом:

public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
        sText.setText("S: " + event.sensor.getStringType());
    }
    else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE){
        sText.setText("S: " + event.sensor.getStringType());
    } 
    else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
        sText.setText("S: " + event.sensor.getStringType());
    }
}

Вместо того, чтобы работать с тремя датчиками в 3 разных времени, я хочу иметь возможность собирать данные со всех датчиков за один раз интервал. Это возможно?

1 Ответ

0 голосов
/ 24 января 2020

Когда датчики будут заменены, вы получите все события, связанные с каждым из них. Для каждого события будет вызываться onSensorChanged.

Если вы хотите получить доступ ко всем этим событиям одновременно, вы должны поместить их в некоторый буфер.

Один из способов сделать это заключается в следующем

// At class level
private Map<Integer, Stack<SensorEvent>> eventsBuffer = new HashMap<>();

// to be called from constructor
private void initEventsBuffer() { 
     eventsBuffer.put(Sensor.TYPE_ACCELEROMETER, new Stack<>());
}

public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
        eventsBuffer.get(Sensor.TYPE_ACCELEROMETER).push(event);
    }
    else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE){
        eventsBuffer.get(Sensor.TYPE_GYROSCOPE).push(event);
    } 
    else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
        eventsBuffer.get(Sensor.TYPE_MAGNETIC_FIELD).push(event);
    }
   processEvents();
}

   private void processEvents() {
   // Start reading from the stack based on event type
       for (Map.Entry<Integer, Stack<SensorEvent>> entry : stack.entrySet()) {
            SensorEvent sensorEvent = entry.getValue().pop();
            Integer eventType = entry.getKey();
            // process now
        }
}
...