@ -28,6 +28,10 @@
ExitHandler do_exit ;
ExitHandler do_exit ;
std : : mutex pm_mutex ;
std : : mutex pm_mutex ;
// filter first values (0.5sec) as those may contain inaccuracies
uint64_t init_ts = 0 ;
constexpr uint64_t init_delay = 500 * 1e6 ;
void interrupt_loop ( int fd , std : : vector < Sensor * > & sensors , PubMaster & pm ) {
void interrupt_loop ( int fd , std : : vector < Sensor * > & sensors , PubMaster & pm ) {
struct pollfd fd_list [ 1 ] = { 0 } ;
struct pollfd fd_list [ 1 ] = { 0 } ;
fd_list [ 0 ] . fd = fd ;
fd_list [ 0 ] . fd = fd ;
@ -88,6 +92,10 @@ void interrupt_loop(int fd, std::vector<Sensor *>& sensors, PubMaster& pm) {
events . adoptWithCaveats ( i , kj : : mv ( collected_events [ i ] ) ) ;
events . adoptWithCaveats ( i , kj : : mv ( collected_events [ i ] ) ) ;
}
}
if ( ts - init_ts < init_delay ) {
continue ;
}
std : : lock_guard < std : : mutex > lock ( pm_mutex ) ;
std : : lock_guard < std : : mutex > lock ( pm_mutex ) ;
pm . send ( " sensorEvents " , msg ) ;
pm . send ( " sensorEvents " , msg ) ;
}
}
@ -167,6 +175,7 @@ int sensor_loop() {
}
}
PubMaster pm ( { " sensorEvents " } ) ;
PubMaster pm ( { " sensorEvents " } ) ;
init_ts = nanos_since_boot ( ) ;
// thread for reading events via interrupts
// thread for reading events via interrupts
std : : vector < Sensor * > lsm_interrupt_sensors = { & lsm6ds3_accel , & lsm6ds3_gyro } ;
std : : vector < Sensor * > lsm_interrupt_sensors = { & lsm6ds3_accel , & lsm6ds3_gyro } ;
@ -185,6 +194,10 @@ int sensor_loop() {
sensors [ i ] - > get_event ( event ) ;
sensors [ i ] - > get_event ( event ) ;
}
}
if ( nanos_since_boot ( ) - init_ts < init_delay ) {
continue ;
}
{
{
std : : lock_guard < std : : mutex > lock ( pm_mutex ) ;
std : : lock_guard < std : : mutex > lock ( pm_mutex ) ;
pm . send ( " sensorEvents " , msg ) ;
pm . send ( " sensorEvents " , msg ) ;
@ -194,6 +207,10 @@ int sensor_loop() {
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 10 ) - ( end - begin ) ) ;
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 10 ) - ( end - begin ) ) ;
}
}
for ( Sensor * sensor : sensors ) {
sensor - > shutdown ( ) ;
}
lsm_interrupt_thread . join ( ) ;
lsm_interrupt_thread . join ( ) ;
delete i2c_bus_imu ;
delete i2c_bus_imu ;
return 0 ;
return 0 ;