6060_ICM20X_REG_INT_ENABLE_0 = 0x10 # Interrupt enable register 0
6161_ICM20X_REG_INT_ENABLE_1 = 0x11 # Interrupt enable register 1
6262
63+ _ICM20X_REG_INT_STATUS_0 = (
64+ 0x19 # Interrupt status register 0 Wake on motion, DMP int, i2c int
65+ )
66+ _ICM20X_REG_INT_STATUS_1 = (
67+ 0x1A # Interrupt status register 1 data register from all sensors
68+ )
69+ _ICM20X_REG_INT_STATUS_2 = 0x1B # Interrupt status register 2 FIFO overflow
70+ _ICM20X_REG_INT_STATUS_3 = 0x1C # Interrupt status register 3 Watermark interrupt
71+
6372# Bank 2
6473_ICM20X_GYRO_SMPLRT_DIV = 0x00
6574_ICM20X_GYRO_CONFIG_1 = 0x01
@@ -159,6 +168,8 @@ class ICM20X: # pylint:disable=too-many-instance-attributes
159168
160169 _lp_config_reg = UnaryStruct (_ICM20X_LP_CONFIG , ">B" )
161170
171+ _data_ready = ROBit (_ICM20X_REG_INT_STATUS_1 , 0 )
172+
162173 _i2c_master_cycle_en = RWBit (_ICM20X_LP_CONFIG , 6 )
163174 _accel_cycle_en = RWBit (_ICM20X_LP_CONFIG , 5 )
164175 _gyro_cycle_en = RWBit (_ICM20X_LP_CONFIG , 4 )
@@ -237,6 +248,8 @@ def initialize(self):
237248 self .accelerometer_data_rate_divisor = 20 # ~53.57Hz
238249 self .gyro_data_rate_divisor = 10 # ~100Hz
239250
251+ self ._gravity = G_TO_ACCEL
252+
240253 def reset (self ):
241254 """Resets the internal registers and restores the default settings"""
242255 self ._bank = 0
@@ -247,6 +260,11 @@ def reset(self):
247260 while self ._reset :
248261 sleep (0.005 )
249262
263+ def data_ready (self ):
264+ """Checks if new data is available"""
265+ self ._bank = 0
266+ return self ._data_ready
267+
250268 @property
251269 def _sleep (self ):
252270 self ._bank = 0
@@ -286,7 +304,9 @@ def gyro(self):
286304 return (x , y , z )
287305
288306 def _scale_xl_data (self , raw_measurement ):
289- return raw_measurement / AccelRange .lsb [self ._cached_accel_range ] * G_TO_ACCEL
307+ return (
308+ raw_measurement / AccelRange .lsb [self ._cached_accel_range ] * self ._gravity
309+ )
290310
291311 def _scale_gyro_data (self , raw_measurement ):
292312 return (
@@ -422,7 +442,8 @@ def accelerometer_data_rate(self, value):
422442 raise AttributeError (
423443 "Accelerometer data rate must be between 0.27 and 1125.0"
424444 )
425- self .accelerometer_data_rate_divisor = value
445+ divisor = round (((1125.0 - value ) / value ))
446+ self .accelerometer_data_rate_divisor = divisor
426447
427448 @property
428449 def gyro_data_rate (self ):
@@ -445,8 +466,7 @@ def gyro_data_rate(self):
445466 def gyro_data_rate (self , value ):
446467 if value < self ._gyro_rate_calc (4095 ) or value > self ._gyro_rate_calc (0 ):
447468 raise AttributeError ("Gyro data rate must be between 4.30 and 1100.0" )
448-
449- divisor = round (((1125.0 - value ) / value ))
469+ divisor = round (((1100.0 - value ) / value ))
450470 self .gyro_data_rate_divisor = divisor
451471
452472 @property
@@ -511,6 +531,15 @@ def _low_power(self, enabled):
511531 self ._bank = 0
512532 self ._low_power_en = enabled
513533
534+ @property
535+ def gravity (self ):
536+ """The gravity magnitude in m/s^2."""
537+ return self ._gravity
538+
539+ @gravity .setter
540+ def gravity (self , value ):
541+ self ._gravity = value
542+
514543
515544class ICM20649 (ICM20X ):
516545 """Library for the ST ICM-20649 Wide-Range 6-DoF Accelerometer and Gyro.
@@ -740,7 +769,7 @@ def _mag_id(self):
740769
741770 @property
742771 def magnetic (self ):
743- """The current magnetic field strengths onthe X, Y, and Z axes in uT (micro-teslas)"""
772+ """The current magnetic field strengths on the X, Y, and Z axes in uT (micro-teslas)"""
744773
745774 self ._bank = 0
746775 full_data = self ._raw_mag_data
0 commit comments