stm32duino / LSM6DSOX

Arduino library to support the LSM6DSOX 3D accelerometer and 3D gyroscope
27 stars 16 forks source link

Add support for FIFO compression #18

Closed patricklaf closed 2 years ago

patricklaf commented 2 years ago

Add function to initialize compression. Must be called with FIFO set in Bypass mode.

LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Compression_Algo_Init(uint8_t Status)

Add functions to enable or disable compression.

LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Compression_Algo_Enable(uint8_t Status)

int32_t lsm6dsox_compression_algo_enable_set(lsm6dsox_ctx_t *ctx, uint8_t val);

Add function to configure and enable or disable compression.

LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Compression_Algo_Set(uint8_t Compression)

Add function to enable or disable compression in real time.

LSM6DSOXStatusTypeDef LSM6DSOXSensor::Set_FIFO_Compression_Algo_Real_Time_Set(uint8_t Status)

Example code:

// Flush any previous value in FIFO before last
lsm6dsox.Set_FIFO_Mode(LSM6DSOX_BYPASS_MODE);
// Enable FIFO full interrupt on sensor INT1 pin
lsm6dsox.Set_FIFO_INT1_FIFO_Full(1);
// Enable timestamp
lsm6dsox.Set_Timestamp_Status(1);
lsm6dsox.Set_FIFO_Timestamp_Decimation(decimation);
// Compression
lsm6dsox.Set_FIFO_Compression_Algo_Init(1); // Must be called with FIFO set in bypass mode
lsm6dsox.Set_FIFO_Compression_Algo_Enable(1);
lsm6dsox.Set_FIFO_Compression_Algo_Set(LSM6DSOX_CMP_ALWAYS);
// Start batching in continuous mode
lsm6dsox.Set_FIFO_Mode(LSM6DSOX_STREAM_MODE);

Tested with Nucleo-L432KC and Adafruit LSM6DOX, Arduino core 2.3.0.

cparata commented 2 years ago

Hello @patricklaf , thanks for the contribution. Instead of adding a new function in the reg file (lsm6dsox_compression_algo_enable_set), you can use directly the "lsm6dsox_embedded_sens_set" that should already do the job. Could you update the PR accordingly? You just need to call:

lsm6dsox_emb_sens_t val;
if (lsm6dsox_embedded_sens_get(&reg_ctx, &val) != LSM6DSOX_OK)
{
   return LSM6DSOX_ERROR;
}

val.fifo_compr = Status;

if (lsm6dsox_embedded_sens_set(&reg_ctx, &val) != LSM6DSOX_OK)
{
   return LSM6DSOX_ERROR;
}

Best Regards, Carlo

patricklaf commented 2 years ago

Hello @cparata, That's done.

Best regards, Patrick

cparata commented 2 years ago

Thanks a lot @patricklaf ! PR merged in the main branch. I have also created a new release (2.3.0) that includes the new feature. Best Regards, Carlo