lis2dw_set_data_rate(LIS2DW_DATA_RATE_HP_400_HZ);
lis2dw_set_mode(LIS2DW_MODE_LOW_POWER);
lis2dw_enable_double_tap();
+ lis2dw12_int_notification_set(LIS2DW12_INT_LATCHED);
// Settling time (1 sample duration, i.e. 1/400Hz)
delay_ms(3);
lis2dw_set_data_rate(movement_state.accelerometer_background_rate);
lis2dw_set_mode(LIS2DW_MODE_LOW_POWER);
lis2dw_disable_double_tap();
+ lis2dw12_int_notification_set(LIS2DW12_INT_PULSED);
// ...disable Z axis (not sure if this is needed, does this save power?)...
lis2dw_configure_tap_threshold(0, 0, 0, 0);
watch_register_interrupt_callback(HAL_GPIO_A3_pin(), cb_accelerometer_event, INTERRUPT_TRIGGER_RISING);
// Enable the interrupts...
- lis2dw_latched_interrupts();
lis2dw_enable_interrupts();
// At first boot, this next line sets the accelerometer's sampling rate to 0, which is LIS2DW_DATA_RATE_POWERDOWN.
#endif
}
+void lis2dw12_int_notification_set(lis2dw12_lir_t val) {
+#ifdef I2C_SERCOM
+ uint8_t configuration = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL3);
+ if (val == LIS2DW12_INT_LATCHED) {
+ configuration |= LIS2DW_CTRL3_VAL_LIR;
+ } else {
+ configuration &= ~LIS2DW_CTRL7_VAL_DRDY_PULSED;
+ }
+ watch_i2c_write8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL3, configuration);
+#else
+ (void)val;
+#endif
+}
+
+lis2dw12_lir_t lis2dw12_int_notification_get(void) {
+#ifdef I2C_SERCOM
+ uint8_t configuration = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL3);
+ if (configuration & LIS2DW12_INT_LATCHED) {
+ return LIS2DW12_INT_LATCHED;
+ } else {
+ return LIS2DW12_INT_PULSED;
+ }
+#else
+ return LIS2DW12_INT_PULSED;
+#endif
+}
+
void lis2dw_enable_interrupts(void) {
#ifdef I2C_SERCOM
uint8_t configuration = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL7);
#endif
}
-void lis2dw_pulsed_interrupts(void) {
+void lis2dw_pulsed_drdy_interrupts(void) {
#ifdef I2C_SERCOM
uint8_t configuration = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL7);
watch_i2c_write8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL7, configuration | LIS2DW_CTRL7_VAL_DRDY_PULSED);
#endif
}
-void lis2dw_latched_interrupts(void) {
+void lis2dw_latched_drdy_interrupts(void) {
#ifdef I2C_SERCOM
uint8_t configuration = watch_i2c_read8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL7);
watch_i2c_write8(LIS2DW_ADDRESS, LIS2DW_REG_CTRL7, configuration & ~LIS2DW_CTRL7_VAL_DRDY_PULSED);
LIS2DW_FILTER_HIGH_PASS = 1,
} lis2dw_filter_t;
+typedef enum
+{
+ LIS2DW12_INT_PULSED = 0,
+ LIS2DW12_INT_LATCHED = 1,
+} lis2dw12_lir_t;
+
typedef enum {
LIS2DW_RANGE_16_G = 0b11, // +/- 16g
LIS2DW_RANGE_8_G = 0b10, // +/- 8g
void lis2dw_configure_tap_duration(uint8_t latency, uint8_t quiet, uint8_t shock);
+void lis2dw12_int_notification_set(lis2dw12_lir_t val);
+
+lis2dw12_lir_t lis2dw12_int_notification_get(void);
+
void lis2dw_configure_int1(uint8_t sources);
void lis2dw_configure_int2(uint8_t sources);
void lis2dw_disable_interrupts(void);
-void lis2dw_pulsed_interrupts(void);
+void lis2dw_pulsed_drdy_interrupts(void);
-void lis2dw_latched_interrupts(void);
+void lis2dw_latched_drdy_interrupts(void);
lis2dw_interrupt_source_t lis2dw_get_interrupt_source(void);