@ -10,7 +10,8 @@
# include <sys/types.h>
# include <sys/resource.h>
# include <pthread.h>
# include <map>
# include <set>
# include <cutils/log.h>
# include <hardware/sensors.h>
@ -20,15 +21,14 @@
# include "common/timing.h"
# include "common/swaglog.h"
// ACCELEROMETER_UNCALIBRATED is only in Android O
// https://developer.android.com/reference/android/hardware/Sensor.html#STRING_TYPE_ACCELEROMETER_UNCALIBRATED
# define SENSOR_ACCELEROMETER 1
# define SENSOR_MAGNETOMETER 2
# define SENSOR_GYRO 4
// ACCELEROMETER_UNCALIBRATED is only in Android O
// https://developer.android.com/reference/android/hardware/Sensor.html#STRING_TYPE_ACCELEROMETER_UNCALIBRATED
# define SENSOR_MAGNETOMETER_UNCALIBRATED 3
# define SENSOR_GYRO_UNCALIBRATED 5
# define SENSOR_PROXIMITY 6
# define SENSOR_LIGHT 7
@ -70,30 +70,33 @@ void sensor_loop() {
LOGD ( " sensor %4d: %4d %60s %d-%ld us " , i , list [ i ] . handle , list [ i ] . name , list [ i ] . minDelay , list [ i ] . maxDelay ) ;
}
device - > activate ( device , SENSOR_MAGNETOMETER_UNCALIBRATED , 0 ) ;
device - > activate ( device , SENSOR_GYRO_UNCALIBRATED , 0 ) ;
device - > activate ( device , SENSOR_ACCELEROMETER , 0 ) ;
device - > activate ( device , SENSOR_MAGNETOMETER , 0 ) ;
device - > activate ( device , SENSOR_GYRO , 0 ) ;
device - > activate ( device , SENSOR_PROXIMITY , 0 ) ;
device - > activate ( device , SENSOR_LIGHT , 0 ) ;
device - > activate ( device , SENSOR_MAGNETOMETER_UNCALIBRATED , 1 ) ;
device - > activate ( device , SENSOR_GYRO_UNCALIBRATED , 1 ) ;
device - > activate ( device , SENSOR_ACCELEROMETER , 1 ) ;
device - > activate ( device , SENSOR_MAGNETOMETER , 1 ) ;
device - > activate ( device , SENSOR_GYRO , 1 ) ;
device - > activate ( device , SENSOR_PROXIMITY , 1 ) ;
device - > activate ( device , SENSOR_LIGHT , 1 ) ;
device - > setDelay ( device , SENSOR_GYRO_UNCALIBRATED , ms2ns ( 10 ) ) ;
device - > setDelay ( device , SENSOR_MAGNETOMETER_UNCALIBRATED , ms2ns ( 100 ) ) ;
device - > setDelay ( device , SENSOR_ACCELEROMETER , ms2ns ( 10 ) ) ;
device - > setDelay ( device , SENSOR_GYRO , ms2ns ( 10 ) ) ;
device - > setDelay ( device , SENSOR_MAGNETOMETER , ms2ns ( 100 ) ) ;
device - > setDelay ( device , SENSOR_PROXIMITY , ms2ns ( 100 ) ) ;
device - > setDelay ( device , SENSOR_LIGHT , ms2ns ( 100 ) ) ;
std : : set < int > sensor_types = {
SENSOR_TYPE_ACCELEROMETER ,
SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED ,
SENSOR_TYPE_MAGNETIC_FIELD ,
SENSOR_TYPE_GYROSCOPE_UNCALIBRATED ,
SENSOR_TYPE_GYROSCOPE ,
SENSOR_TYPE_PROXIMITY ,
SENSOR_TYPE_LIGHT ,
} ;
std : : map < int , int64_t > sensors = {
{ SENSOR_GYRO_UNCALIBRATED , ms2ns ( 10 ) } ,
{ SENSOR_MAGNETOMETER_UNCALIBRATED , ms2ns ( 100 ) } ,
{ SENSOR_ACCELEROMETER , ms2ns ( 10 ) } ,
{ SENSOR_GYRO , ms2ns ( 10 ) } ,
{ SENSOR_MAGNETOMETER , ms2ns ( 100 ) } ,
{ SENSOR_PROXIMITY , ms2ns ( 100 ) } ,
{ SENSOR_LIGHT , ms2ns ( 100 ) }
} ;
for ( auto & s : sensors ) {
device - > activate ( device , s . first , 0 ) ;
device - > activate ( device , s . first , 1 ) ;
device - > setDelay ( device , s . first , s . second ) ;
}
// TODO: why is this 16?
static const size_t numEvents = 16 ;
sensors_event_t buffer [ numEvents ] ;
@ -107,26 +110,14 @@ void sensor_loop() {
int log_events = 0 ;
for ( int i = 0 ; i < n ; i + + ) {
switch ( buffer [ i ] . type ) {
case SENSOR_TYPE_ACCELEROMETER :
case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED :
case SENSOR_TYPE_MAGNETIC_FIELD :
case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED :
case SENSOR_TYPE_GYROSCOPE :
case SENSOR_TYPE_PROXIMITY :
case SENSOR_TYPE_LIGHT :
if ( sensor_types . find ( buffer [ i ] . type ) ! = sensor_types . end ( ) ) {
log_events + + ;
break ;
default :
continue ;
}
}
uint64_t log_time = nanos_since_boot ( ) ;
capnp : : MallocMessageBuilder msg ;
cereal : : Event : : Builder event = msg . initRoot < cereal : : Event > ( ) ;
event . setLogMonoTime ( log_time ) ;
event . setLogMonoTime ( nanos_since_boot ( ) ) ;
auto sensor_events = event . initSensorEvents ( log_events ) ;
@ -135,21 +126,11 @@ void sensor_loop() {
const sensors_event_t & data = buffer [ i ] ;
switch ( data . type ) {
case SENSOR_TYPE_ACCELEROMETER :
case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED :
case SENSOR_TYPE_MAGNETIC_FIELD :
case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED :
case SENSOR_TYPE_GYROSCOPE :
case SENSOR_TYPE_PROXIMITY :
case SENSOR_TYPE_LIGHT :
break ;
default :
if ( sensor_types . find ( data . type ) = = sensor_types . end ( ) ) {
continue ;
}
auto log_event = sensor_events [ log_i ] ;
log_event . setSource ( cereal : : SensorEventData : : SensorSource : : ANDROID ) ;
log_event . setVersion ( data . version ) ;
log_event . setSensor ( data . sensor ) ;