summaryrefslogtreecommitdiff
path: root/include/adxl375.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/adxl375.hpp')
-rw-r--r--include/adxl375.hpp265
1 files changed, 265 insertions, 0 deletions
diff --git a/include/adxl375.hpp b/include/adxl375.hpp
new file mode 100644
index 0000000..21fe82c
--- /dev/null
+++ b/include/adxl375.hpp
@@ -0,0 +1,265 @@
+#pragma once
+
+#include <stdint.h>
+
+#include <hardware/i2c.h>
+
+#if ( USE_FREERTOS == 1)
+#include "FreeRTOS.h"
+#include "FreeRTOSConfig.h"
+#include "portmacro.h"
+#include "projdefs.h"
+#include "serial.hpp"
+#include "task.h"
+#include "semphr.h"
+#endif
+
+#define ADXL375_I2C_ADDRESS 0x1D
+
+// DEVID [Validation]
+#define R_ADXL375_DEVID 0x00
+#define B_ADXL375_DEVID_VALUE 0xE5
+
+// THRESH_SHOCK [Configuration, Threshold for shock interrupt (780mG/LSB)]
+#define R_ADXL375_THRESH_SHOCK 0x1D
+typedef uint8_t ADXL375_THRESH_SHOCK;
+
+// OFSX, OFSY, OFSZ [Configuration, User-configured offset of (0.196 g/LSB)]
+#define R_ADXL375_OFFSET_X 0x1E
+typedef uint8_t ADXL375_OFFSET_X;
+
+#define R_ADXL375_OFFSET_Y 0x1F
+typedef uint8_t ADXL375_OFFSET_Y;
+
+#define R_ADXL375_OFFSET_Z 0x20
+typedef uint8_t ADXL375_OFFSET_Z;
+
+// DUR [Configuration, Time above threshold as single shock interrupt (625us/LSB)]
+#define R_ADXL375_DUR 0x21
+typedef uint8_t ADXL375_DURATION;
+
+// LATENT [Configuration, Time after first shock interrupt second can occur (1.25ms/LSB)]
+#define R_ADXL375_LATENT 0x22
+typedef uint8_t ADXL375_LATENT;
+
+// WINDOW [Configuration, Time after latent period second shock can begin (1.25ms/LSB)]
+#define R_ADXL375_WINDOW 0x23
+typedef uint8_t ADXL375_WINDOW;
+
+// THRESH_ACT [Configuration, Threshold value for detecting activity (780mg/LSB)]
+#define R_ADXL375_THRESH_ACT 0x24
+typedef uint8_t ADXL375_THRESH_ACT;
+
+// THRESH_INACT [Configuration, Threshold value for detecting inactivity (780mg/LSB)]
+#define R_ADXL375_THRESH_INACT 0x25
+typedef uint8_t ADXL375_THRESH_INACT;
+
+// TIME_INACT [Configuration, Time below threshold as inactivity (1s/LSB)]
+#define R_ADXL375_TIME_INACT 0x26
+typedef uint8_t ADXL375_TIME_INACT;
+
+// ACT_INACT_CTL [Configuration, Activity/Inactivity interrupts enable and AC/DC coupling]
+#define R_ADXL375_ACT_INACT_CTL 0x27
+typedef union {
+ struct {
+ bool INACT_Z_ENABLE :1;
+ bool INACT_Y_ENABLE :1;
+ bool INACT_X_ENABLE :1;
+ bool INACT_AC_DC :1;
+ bool ACT_Z_ENABLE :1;
+ bool ACT_Y_ENABLE :1;
+ bool ACT_X_ENABLE :1;
+ bool ACT_AC_DC :1;
+ } fields;
+ uint8_t data;
+} ADXL375_ACT_INACT_CTL;
+
+// SHOCK_AXES [Configuration, axes used in shock interrupt]
+#define R_ADXL375_SHOCK_AXES 0x2A
+typedef union {
+ struct {
+ bool SHOCK_Z_ENABLE :1; //Z-Axis shock interrupt enable
+ bool SHOCK_Y_ENABLE :1; //Y-Axis shock interrupt enable
+ bool SHOCK_X_ENABLE :1; //X-Axis shock interrupt enable
+ bool SUPPRESS :1; //Suppresses double shock detection
+ uint8_t RESERVED :4; //Reserved
+ } fields;
+ uint8_t data;
+} ADXL375_SHOCK_AXES;
+
+// ACT_SHOCK_STATUS [Status, First axis involved in an activity or shock event]
+#define R_ADXL375_ACT_SHOCK_STATUS 0x2B
+typedef union {
+ struct {
+ bool SHOCK_Z_SOURCE :1;
+ bool SHOCK_Y_SOURCE :1;
+ bool SHOCK_X_SOURCE :1;
+ bool ASLEEP :1;
+ bool ACT_Z_SOURCE :1;
+ bool ACT_Y_SOURCE :1;
+ bool ACT_X_SOURCE :1;
+ bool RESERVED :1;
+ } fields;
+ uint8_t data;
+} ADXL375_ACT_SHOCK_STATUS;
+
+// BW_RATE [Configuration, Low Power Mode and ODR]
+#define R_ADXL375_BW_RATE 0x2C
+typedef union {
+ struct {
+ uint8_t RATE :4; //ODR configuration
+ bool LOW_POWER :1; //Low-power/Normal mode configuration
+ uint8_t RESERVED :3; //Reserved
+ } fields;
+ uint8_t data;
+} ADXL375_BW_RATE;
+#define B_ADXL375_ODR_100_HZ 0x0A
+#define B_ADXL375_ODR_400_HZ 0x0C
+#define B_ADXL375_ODR_800_HZ 0x0D
+#define B_ADXL375_ODR_3200_HZ 0x0F
+#define B_ADXL375_BW_RATE_LOW_POWER_MODE 0b1
+#define B_ADXL375_BW_RATE_NORMAL_POWER_MODE 0b0
+
+// POWER_CTL [State Configuration, Measurement mode (and sleep settings)]
+#define R_ADXL375_POWER_CTL 0x2D
+typedef union {
+ struct {
+ uint8_t WAKEUP :2; //Sampling rate control during sleep mode
+ bool SLEEP :1; //Sleep mode configuration
+ bool MEASURE :1; //Measurement/Standby mode configuration
+ bool AUTO_SLEEP :1; //Auto sleep function enable
+ bool LINK :1; //Link activity and inactivity functions
+ bool RESERVED :1; //Reserved
+ } fields;
+ uint8_t data;
+} ADXL375_POWER_CTL;
+
+// INT_ENABLE [State Configuration, interrupt enabling]
+#define R_ADXL375_INT_ENABLE 0x2E
+typedef union {
+ struct {
+ bool OVERRUN :1; //FIFO buffer overwrite interrupt enable
+ bool WATERMARK :1; //??? TODO: Figure out watermark bits
+ bool RESERVED :1; //Reserved
+ bool INACTIVITY :1; //Inactivity interrupt enable
+ bool ACTIVITY :1; //Activity interrupt enable
+ bool DOUBLE_SHOCK :1; //Double shock interrupt enable
+ bool SINGLE_SHOCK :1; //Single shock interrupt enable
+ bool DATA_READY :1; //FIFO buffer new data interrupt enable
+ } fields;
+ uint8_t data;
+} ADXL375_INT_ENABLE;
+
+// INT_MAP [Configuration, Interrupt --> Pin mapping (0 = INT1, 1 = INT2) */
+#define R_ADXL375_INT_MAP 0x2F
+typedef union {
+ struct {
+ bool OVERRUN :1; //FIFO buffer overwrite interrupt
+ bool WATERMARK :1; //??? TODO: Figure out watermark bits
+ bool RESERVED :1; //Reserved
+ bool INACTIVITY :1; //Inactivity interrupt
+ bool ACTIVITY :1; //Activity interrupt
+ bool DOUBLE_SHOCK :1; //Double shock interrupt
+ bool SINGLE_SHOCK :1; //Single shock interrupt
+ bool DATA_READY :1; //FIFO buffer new data interrupt
+ } fields;
+ uint8_t data;
+} ADXL375_INT_MAP;
+
+// INT_SOURCE [Status, Source of interrupt (read to clear SINGLE_SHOCK interrupt) */
+#define R_ADXL375_INT_SOURCE 0x30
+typedef union {
+ struct {
+ bool OVERRUN :1; //FIFO buffer overwrite interrupt
+ bool WATERMARK :1; //??? TODO: Figure out watermark bits
+ bool RESERVED :1; //Reserved
+ bool INACTIVITY :1; //Inactivity interrupt
+ bool ACTIVITY :1; //Activity interrupt
+ bool DOUBLE_SHOCK :1; //Double shock interrupt
+ bool SINGLE_SHOCK :1; //Single shock interrupt
+ bool DATA_READY :1; //FIFO buffer new data interrupt
+ } fields;
+ uint8_t data;
+} ADXL375_INT_SOURCE;
+
+// DATA_FORMAT [Configuration, Data output style/formatting (variety of things)] */
+#define R_ADXL375_DATA_FORMAT 0x31
+typedef union {
+ struct {
+ uint8_t RESERVED :2; //Reserved
+ bool JUSTIFY :1; //Left(MSB)/Right(LSB, Sign extended) output justification
+ uint8_t RESERVED_ :2; //Reserved
+ bool INT_INVERT :1; //Interrupt pin polarity configuration
+ bool SPI :1; //SPI 3/4 wire mode configuration
+ bool SELF_TEST :1; //Configure self-test mode
+ } fields;
+ uint8_t data;
+} ADXL375_DATA_FORMAT;
+#define B_ADXL375_DATA_FORMAT_JUSTIFY_RIGHT 0b0
+#define B_ADXL375_DATA_FORMAT_JUSTIFY_LEFT 0b1
+#define B_ADXL375_DATA_FORMAT_INTERRUPT_ACTIVE_HIGH 0b0
+#define B_ADXL375_DATA_FORMAT_INTERRUPT_ACTIVE_LOW 0b1
+#define B_ADXL375_DATA_FORMAT_ENABLE_SELF_TEST 0b1
+#define B_ADXL375_DATA_FORMAT_DISABLE_SELF_TEST 0b0
+
+// DATAX0-DATAZ1 [Output, 16b data for X/Y/Z (DATA_1 is MSByte, DATA_0 is LSByte)
+#define R_ADXL375_DATAX0 0x32
+#define R_ADXL375_DATAX1 0x33
+#define R_ADXL375_DATAY0 0x34
+#define R_ADXL375_DATAY1 0x35
+#define R_ADXL375_DATAZ0 0x36
+#define R_ADXL375_DATAZ1 0x37
+#define S_ADXL375_SCALE_FACTOR 20.5 // 1 LSB / 20.5
+
+#define ADXL375_SAMPLE_RATE_HZ 500
+
+class ADXL375 {
+ public:
+ ADXL375(i2c_inst_t* i2c) : i2c {i2c} {};
+
+ void initialize();
+
+ void sample();
+
+ int16_t get_ax() { return ax; }
+ int16_t get_ay() { return ay; }
+ int16_t get_az() { return az; }
+
+ static float scale(int16_t unscaled) { return ((float) unscaled) / S_ADXL375_SCALE_FACTOR; }
+
+#if (USE_FREERTOS == 1)
+ static void update_adxl375_task(void *pvParameters);
+
+ TaskHandle_t update_task_handle = NULL;
+#endif
+
+ private:
+ const uint8_t addr = ADXL375_I2C_ADDRESS;
+
+ i2c_inst_t* i2c;
+
+ uint8_t buffer[16];
+
+ ADXL375_THRESH_SHOCK shock_threshold;
+ ADXL375_OFFSET_X offset_ax;
+ ADXL375_OFFSET_Y offset_ay;
+ ADXL375_OFFSET_Z offset_az;
+ ADXL375_DURATION shock_duration;
+ ADXL375_LATENT latent_shock;
+ ADXL375_WINDOW window_shock;
+ ADXL375_THRESH_ACT activity_threshold;
+ ADXL375_THRESH_INACT inactivity_threshold;
+ ADXL375_TIME_INACT inactivity_duraction;
+ ADXL375_ACT_INACT_CTL act_inact_ctl;
+ ADXL375_SHOCK_AXES shock_axes;
+ ADXL375_ACT_SHOCK_STATUS act_shock_status;
+ ADXL375_BW_RATE bw_rate;
+ ADXL375_POWER_CTL power_ctl;
+ ADXL375_INT_ENABLE int_enable;
+ ADXL375_INT_MAP int_map;
+ ADXL375_INT_SOURCE int_source;
+ ADXL375_DATA_FORMAT data_format;
+
+ int16_t ax, ay, az;
+};
+