@@ -87,7 +87,12 @@ int BoschSensorClass::begin(CfgBoshSensor_t cfg) {
8787
8888
8989void BoschSensorClass::setContinuousMode () {
90+ continuousModeFifoFrame.data = continuousModeFifoData;
91+ continuousModeFifoFrame.length = sizeof (continuousModeFifoData);
9092 bmi2_set_fifo_config (BMI2_FIFO_GYR_EN | BMI2_FIFO_ACC_EN, 1 , &bmi2);
93+ bmi2_set_fifo_config (BMI2_FIFO_HEADER_EN, BMI2_DISABLE, &bmi2);
94+ bmi2_map_data_int (BMI2_FWM_INT, BMI2_INT1, &bmi2);
95+ bmi2_set_fifo_wm ((sizeof (continuousModeFifoData)), &bmi2); // 32 samples of accel+gyro, match LSM9DS1
9196 continuousMode = true ;
9297}
9398
@@ -102,7 +107,17 @@ void BoschSensorClass::oneShotMode() {
102107// Accelerometer
103108int BoschSensorClass::readAcceleration (float & x, float & y, float & z) {
104109 struct bmi2_sens_data sensor_data;
105- auto ret = bmi2_get_sensor_data (&sensor_data, &bmi2);
110+ int ret = 0 ;
111+
112+ if (continuousModeAvailableA > 0 ) {
113+ sensor_data.acc .x = fifo_accel_data[8 - continuousModeAvailableA].x ;
114+ sensor_data.acc .y = fifo_accel_data[8 - continuousModeAvailableA].y ;
115+ sensor_data.acc .z = fifo_accel_data[8 - continuousModeAvailableA].z ;
116+ continuousModeAvailableA--;
117+ } else {
118+ ret = bmi2_get_sensor_data (&sensor_data, &bmi2);
119+ }
120+
106121 #ifdef TARGET_ARDUINO_NANO33BLE
107122 x = -sensor_data.acc .y / INT16_to_G;
108123 y = -sensor_data.acc .x / INT16_to_G;
@@ -116,11 +131,31 @@ int BoschSensorClass::readAcceleration(float& x, float& y, float& z) {
116131
117132int BoschSensorClass::accelerationAvailable () {
118133 uint16_t status;
134+ if (continuousModeAvailableA > 0 ) {
135+ return continuousModeAvailableA;
136+ }
137+ if (continuousMode) {
138+ bmi2_get_int_status (&status, &bmi2);
139+ if ((status & BMI2_FWM_INT_STATUS_MASK) == 0 ) {
140+ return 0 ;
141+ }
142+ bmi2_get_fifo_length (&status, &bmi2);
143+ auto ret = bmi2_read_fifo_data (&continuousModeFifoFrame, &bmi2);
144+ if (ret != 0 ) {
145+ return 0 ;
146+ }
147+ continuousModeAvailable = min (status, sizeof (continuousModeFifoData)) / (6 + 6 ); // 6 bytes per accel sample
148+ continuousModeAvailableG = continuousModeAvailable;
149+ continuousModeAvailableA = continuousModeAvailable;
150+ ret = bmi2_extract_accel (fifo_accel_data, &continuousModeAvailable, &continuousModeFifoFrame, &bmi2);
151+ ret = bmi2_extract_gyro (fifo_gyro_data, &continuousModeAvailable, &continuousModeFifoFrame, &bmi2);
152+ return continuousModeAvailable;
153+ }
119154 bmi2_get_int_status (&status, &bmi2);
120155 int ret = ((status | _int_status) & BMI2_ACC_DRDY_INT_MASK);
121156 _int_status = status;
122157 _int_status &= ~BMI2_ACC_DRDY_INT_MASK;
123- return ret;
158+ return ret > 0 ;
124159}
125160
126161float BoschSensorClass::accelerationSampleRate () {
@@ -136,7 +171,16 @@ float BoschSensorClass::accelerationSampleRate() {
136171// Gyroscope
137172int BoschSensorClass::readGyroscope (float & x, float & y, float & z) {
138173 struct bmi2_sens_data sensor_data;
139- auto ret = bmi2_get_sensor_data (&sensor_data, &bmi2);
174+ int ret = 0 ;
175+
176+ if (continuousModeAvailableG > 0 ) {
177+ sensor_data.gyr .x = fifo_gyro_data[8 - continuousModeAvailableG].x ;
178+ sensor_data.gyr .y = fifo_gyro_data[8 - continuousModeAvailableG].y ;
179+ sensor_data.gyr .z = fifo_gyro_data[8 - continuousModeAvailableG].z ;
180+ continuousModeAvailableG--;
181+ } else {
182+ ret = bmi2_get_sensor_data (&sensor_data, &bmi2);
183+ }
140184 #ifdef TARGET_ARDUINO_NANO33BLE
141185 x = -sensor_data.gyr .y / INT16_to_DPS;
142186 y = -sensor_data.gyr .x / INT16_to_DPS;
@@ -150,11 +194,32 @@ int BoschSensorClass::readGyroscope(float& x, float& y, float& z) {
150194
151195int BoschSensorClass::gyroscopeAvailable () {
152196 uint16_t status;
197+ if (continuousModeAvailableG > 0 ) {
198+ return continuousModeAvailableG;
199+ }
200+ if (continuousMode) {
201+ bmi2_get_int_status (&status, &bmi2);
202+ if ((status & BMI2_FWM_INT_STATUS_MASK) == 0 ) {
203+ return 0 ;
204+ }
205+ bmi2_get_fifo_length (&status, &bmi2);
206+ auto ret = bmi2_read_fifo_data (&continuousModeFifoFrame, &bmi2);
207+ if (ret != 0 ) {
208+ return 0 ;
209+ }
210+ continuousModeAvailable = min (status, sizeof (continuousModeFifoData)) / (6 + 6 ); // 6 bytes per accel sample
211+ continuousModeAvailableG = continuousModeAvailable;
212+ continuousModeAvailableA = continuousModeAvailable;
213+ ret = bmi2_extract_accel (fifo_accel_data, &continuousModeAvailable, &continuousModeFifoFrame, &bmi2);
214+ ret = bmi2_extract_gyro (fifo_gyro_data, &continuousModeAvailable, &continuousModeFifoFrame, &bmi2);
215+
216+ return continuousModeAvailable;
217+ }
153218 bmi2_get_int_status (&status, &bmi2);
154219 int ret = ((status | _int_status) & BMI2_GYR_DRDY_INT_MASK);
155220 _int_status = status;
156221 _int_status &= ~BMI2_GYR_DRDY_INT_MASK;
157- return ret;
222+ return ret > 0 ;
158223}
159224
160225float BoschSensorClass::gyroscopeSampleRate () {
@@ -282,7 +347,7 @@ int8_t BoschSensorClass::configure_sensor(struct bmm150_dev *dev)
282347
283348int8_t BoschSensorClass::bmi2_i2c_read (uint8_t reg_addr, uint8_t *reg_data, uint32_t len, void *intf_ptr)
284349{
285- if ((reg_data == NULL ) || (len == 0 ) || (len > 32 )) {
350+ if ((reg_data == NULL ) || (len == 0 ) || (len > 128 )) {
286351 return -1 ;
287352 }
288353 uint8_t bytes_received;
@@ -308,18 +373,15 @@ int8_t BoschSensorClass::bmi2_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint
308373
309374int8_t BoschSensorClass::bmi2_i2c_write (uint8_t reg_addr, const uint8_t *reg_data, uint32_t len, void *intf_ptr)
310375{
311- if ((reg_data == NULL ) || (len == 0 ) || (len > 32 )) {
376+ if ((reg_data == NULL ) || (len == 0 ) || (len > 128 )) {
312377 return -1 ;
313378 }
314379
315380 struct dev_info * dev_info = (struct dev_info *)intf_ptr;
316381 uint8_t dev_id = dev_info->dev_addr ;
317382 dev_info->_wire ->beginTransmission (dev_id);
318383 dev_info->_wire ->write (reg_addr);
319- for (uint16_t i = 0 ; i < len; i++)
320- {
321- dev_info->_wire ->write (reg_data[i]);
322- }
384+ dev_info->_wire ->write (reg_data, (size_t )len);
323385 if (dev_info->_wire ->endTransmission () != 0 ) {
324386 return -1 ;
325387 }
0 commit comments