From 5d3d1437f920a9e09304913dd279945150e0e42b Mon Sep 17 00:00:00 2001 From: William Clark Date: Sat, 23 Dec 2023 13:31:59 +0000 Subject: [PATCH] c99 + comments --- Makefile | 2 +- lis3dh.c | 50 ++++++++++++++++++++--------------------- lis3dh.h | 68 ++++++++++++++++++++++++++++---------------------------- main.c | 33 +++++++++++++++++++-------- 4 files changed, 84 insertions(+), 69 deletions(-) diff --git a/Makefile b/Makefile index be92e2a..5a034c8 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CC=gcc -CFLAGS=-O2 -std=gnu99 -W -Werror -Wall -Wextra -I. +CFLAGS=-O2 -std=c99 -W -Werror -Wall -Wextra -pedantic -I. LFLAGS=-lm all: $(CC) $(CFLAGS) main.c i2c.c lis3dh.c -o lis3dh $(LFLAGS) diff --git a/lis3dh.c b/lis3dh.c index 3f7cc48..db15e57 100644 --- a/lis3dh.c +++ b/lis3dh.c @@ -9,27 +9,27 @@ static int lis3dh_reset(lis3dh_t *lis3dh) { err |= lis3dh->dev.write(REG_CTRL_REG5, 0x80); /* write default values to rw regs */ - err |= lis3dh->dev.write(REG_CTRL_REG0, 0b10000); - err |= lis3dh->dev.write(REG_CTRL_REG1, 0b111); - err |= lis3dh->dev.write(REG_CTRL_REG2, 0); - err |= lis3dh->dev.write(REG_CTRL_REG3, 0); - err |= lis3dh->dev.write(REG_CTRL_REG4, 0); - err |= lis3dh->dev.write(REG_CTRL_REG5, 0); - err |= lis3dh->dev.write(REG_CTRL_REG6, 0); - err |= lis3dh->dev.write(REG_FIFO_CTRL_REG, 0); - err |= lis3dh->dev.write(REG_INT1_CFG, 0); - err |= lis3dh->dev.write(REG_INT1_THS, 0); - err |= lis3dh->dev.write(REG_INT1_DURATION, 0); - err |= lis3dh->dev.write(REG_INT2_CFG, 0); - err |= lis3dh->dev.write(REG_INT2_THS, 0); - err |= lis3dh->dev.write(REG_INT2_DURATION, 0); - err |= lis3dh->dev.write(REG_CLICK_CFG, 0); - err |= lis3dh->dev.write(REG_CLICK_THS, 0); - err |= lis3dh->dev.write(REG_TIME_LIMIT, 0); - err |= lis3dh->dev.write(REG_TIME_LATENCY, 0); - err |= lis3dh->dev.write(REG_TIME_WINDOW, 0); - err |= lis3dh->dev.write(REG_ACT_THS, 0); - err |= lis3dh->dev.write(REG_ACT_DUR, 0); + err |= lis3dh->dev.write(REG_CTRL_REG0, 0x10); + err |= lis3dh->dev.write(REG_CTRL_REG1, 0x07); + err |= lis3dh->dev.write(REG_CTRL_REG2, 0x00); + err |= lis3dh->dev.write(REG_CTRL_REG3, 0x00); + err |= lis3dh->dev.write(REG_CTRL_REG4, 0x00); + err |= lis3dh->dev.write(REG_CTRL_REG5, 0x00); + err |= lis3dh->dev.write(REG_CTRL_REG6, 0x00); + err |= lis3dh->dev.write(REG_FIFO_CTRL_REG, 0x00); + err |= lis3dh->dev.write(REG_INT1_CFG, 0x00); + err |= lis3dh->dev.write(REG_INT1_THS, 0x00); + err |= lis3dh->dev.write(REG_INT1_DURATION, 0x00); + err |= lis3dh->dev.write(REG_INT2_CFG, 0x00); + err |= lis3dh->dev.write(REG_INT2_THS, 0x00); + err |= lis3dh->dev.write(REG_INT2_DURATION, 0x00); + err |= lis3dh->dev.write(REG_CLICK_CFG, 0x00); + err |= lis3dh->dev.write(REG_CLICK_THS, 0x00); + err |= lis3dh->dev.write(REG_TIME_LIMIT, 0x00); + err |= lis3dh->dev.write(REG_TIME_LATENCY, 0x00); + err |= lis3dh->dev.write(REG_TIME_WINDOW, 0x00); + err |= lis3dh->dev.write(REG_ACT_THS, 0x00); + err |= lis3dh->dev.write(REG_ACT_DUR, 0x00); return err; } @@ -77,7 +77,7 @@ int lis3dh_configure(lis3dh_t *lis3dh) { int err = 0; /* last 0b111 enables Z, Y and X axis */ - ctrl_reg1 = 0 | (lis3dh->cfg.rate << 4) | 0b111; + ctrl_reg1 = 0 | (lis3dh->cfg.rate << 4) | 0x07; ctrl_reg2 = 0; ctrl_reg4 = 0 | (lis3dh->cfg.range << 4); ctrl_reg5 = 0; @@ -93,8 +93,8 @@ int lis3dh_configure(lis3dh_t *lis3dh) { /* set enable filter */ if (lis3dh->cfg.filter.mode != 0xFF) { - ctrl_reg2 |= ((lis3dh->cfg.filter.mode & 0b11) << 6); - ctrl_reg2 |= ((lis3dh->cfg.filter.cutoff & 0b11) << 4); + ctrl_reg2 |= ((lis3dh->cfg.filter.mode & 0x03) << 6); + ctrl_reg2 |= ((lis3dh->cfg.filter.cutoff & 0x03) << 4); ctrl_reg2 |= ((lis3dh->cfg.filter.fds & 1) << 3); ctrl_reg2 |= ((lis3dh->cfg.filter.hpclick & 1) << 2); ctrl_reg2 |= ((lis3dh->cfg.filter.ia1 & 1) << 1); @@ -111,7 +111,7 @@ int lis3dh_configure(lis3dh_t *lis3dh) { /* set LPen */ if (lis3dh->cfg.mode == LIS3DH_MODE_LP) { - ctrl_reg1 |= 0b1000; + ctrl_reg1 |= 0x08; } err |= lis3dh->dev.write(REG_CTRL_REG1, ctrl_reg1); diff --git a/lis3dh.h b/lis3dh.h index 05da0ef..8fb3bd4 100644 --- a/lis3dh.h +++ b/lis3dh.h @@ -4,55 +4,55 @@ #include /* rates */ -#define LIS3DH_ODR_POWEROFF 0b0000 -#define LIS3DH_ODR_1_HZ 0b0001 -#define LIS3DH_ODR_10_HZ 0b0010 -#define LIS3DH_ODR_25_HZ 0b0011 -#define LIS3DH_ODR_50_HZ 0b0100 -#define LIS3DH_ODR_100_HZ 0b0101 -#define LIS3DH_ODR_200_HZ 0b0110 -#define LIS3DH_ODR_400_HZ 0b0111 -#define LIS3DH_ODR_NORM_1344_HZ 0b1001 -#define LIS3DH_ODR_LP_1600_HZ 0b1000 -#define LIS3DH_ODR_LP_5376_HZ 0b1001 +#define LIS3DH_ODR_POWEROFF 0x00 +#define LIS3DH_ODR_1_HZ 0x01 +#define LIS3DH_ODR_10_HZ 0x02 +#define LIS3DH_ODR_25_HZ 0x03 +#define LIS3DH_ODR_50_HZ 0x04 +#define LIS3DH_ODR_100_HZ 0x05 +#define LIS3DH_ODR_200_HZ 0x06 +#define LIS3DH_ODR_400_HZ 0x07 +#define LIS3DH_ODR_NORM_1344_HZ 0x09 +#define LIS3DH_ODR_LP_1600_HZ 0x08 +#define LIS3DH_ODR_LP_5376_HZ 0x09 /* range/sens */ -#define LIS3DH_FS_2G 0b00 -#define LIS3DH_FS_4G 0b01 -#define LIS3DH_FS_8G 0b10 -#define LIS3DH_FS_16G 0b11 +#define LIS3DH_FS_2G 0x00 +#define LIS3DH_FS_4G 0x01 +#define LIS3DH_FS_8G 0x02 +#define LIS3DH_FS_16G 0x03 /* operating modes */ -#define LIS3DH_MODE_HR 0b00 -#define LIS3DH_MODE_LP 0b01 -#define LIS3DH_MODE_NORMAL 0b10 +#define LIS3DH_MODE_HR 0x00 +#define LIS3DH_MODE_LP 0x01 +#define LIS3DH_MODE_NORMAL 0x02 /* FIFO modes */ -#define LIS3DH_FIFO_MODE_BYPASS 0b00 -#define LIS3DH_FIFO_MODE_NORMAL 0b01 /* "FIFO" */ -#define LIS3DH_FIFO_MODE_STREAM 0b10 -#define LIS3DH_FIFO_MODE_STREAM_TO_FIFO 0b11 +#define LIS3DH_FIFO_MODE_BYPASS 0x00 +#define LIS3DH_FIFO_MODE_NORMAL 0x01 /* "FIFO" */ +#define LIS3DH_FIFO_MODE_STREAM 0x02 +#define LIS3DH_FIFO_MODE_STREAM_TO_FIFO 0x03 /* FIFO trigger pin selection */ -#define LIS3DH_FIFO_TRIG_INT1 0b0 -#define LIS3DH_FIFO_TRIG_INT2 0b1 +#define LIS3DH_FIFO_TRIG_INT1 0x00 +#define LIS3DH_FIFO_TRIG_INT2 0x01 /* filter modes */ /* this one is reset by reading REFERENCE (0x26) */ -#define LIS3DH_FILTER_MODE_NORMAL 0b00 -#define LIS3DH_FILTER_MODE_REFERENCE 0b01 -#define LIS3DH_FILTER_MODE_NORMAL2 0b10 /* same as 00? */ -#define LIS3DH_FILTER_MODE_AUTORESET 0b11 +#define LIS3DH_FILTER_MODE_NORMAL 0x00 +#define LIS3DH_FILTER_MODE_REFERENCE 0x01 +#define LIS3DH_FILTER_MODE_NORMAL2 0x02 /* same as 00? */ +#define LIS3DH_FILTER_MODE_AUTORESET 0x03 /* filter cutoff */ /* unfortunately, there is only a table for low-power mode, and the actual cutoff-frequency depends on the ODR. Naming scheme after ODR@400Hz AN3308 > section 4.3.1.1 */ -#define LIS3DH_FILTER_CUTOFF_8 0b00 /* highest freq */ -#define LIS3DH_FILTER_CUTOFF_4 0b01 -#define LIS3DH_FILTER_CUTOFF_2 0b10 -#define LIS3DH_FILTER_CUTOFF_1 0b11 /* lowest freq */ +#define LIS3DH_FILTER_CUTOFF_8 0x00 /* highest freq */ +#define LIS3DH_FILTER_CUTOFF_4 0x01 +#define LIS3DH_FILTER_CUTOFF_2 0x02 +#define LIS3DH_FILTER_CUTOFF_1 0x03 /* lowest freq */ struct lis3dh_device { @@ -73,9 +73,9 @@ struct lis3dh_filter_config { }; struct lis3dh_fifo_config { - uint8_t fth; + uint8_t fth; /* user-specified watermark level 0-32 */ uint8_t trig; - uint8_t mode; + uint8_t mode; }; struct lis3dh_config { diff --git a/main.c b/main.c index d898680..5668ae1 100644 --- a/main.c +++ b/main.c @@ -1,19 +1,29 @@ #define _GNU_SOURCE #include +#include #include #include #include "lis3dh.h" #include "i2c.h" +/* calc magnitude of accel [x y z] vector */ float mag(float x, float y, float z) { return sqrt( powf(x, 2) + powf(y, 2) + powf(z, 2) ); } +/* print message then exit */ +void quit(const char *msg, lis3dh_t *lis) { + lis->dev.deinit(); + fprintf(stderr, "%s\n", msg); + exit(1); +} + int main() { lis3dh_t lis; struct lis3dh_fifo_data fifo; + /* set fn ptrs to rw on bus (i2c or SPI) */ lis.dev.init = i2c_init; lis.dev.read = i2c_read; lis.dev.write = i2c_write; @@ -21,28 +31,32 @@ int main() { lis.dev.deinit = i2c_deinit; - /* write config after init() */ + /* initialise struct */ if (lis3dh_init(&lis)) { - puts("init ERR"); + quit("init()", &lis); } + /* set up config */ lis.cfg.mode = LIS3DH_MODE_HR; lis.cfg.range = LIS3DH_FS_2G; lis.cfg.rate = LIS3DH_ODR_100_HZ; lis.cfg.fifo.mode = LIS3DH_FIFO_MODE_STREAM; + /* write device config */ if (lis3dh_configure(&lis)) { - puts("configure ERR"); + quit("configure()", &lis); } - for(int i=0; i<100; i++) { + for (int i=0; i<50; i++) { + /* poll fifo reg */ if (lis3dh_poll_fifo(&lis)) { - puts("poll_fifo ERR"); + quit("poll_fifo()", &lis); } + /* read stored fifo data into `fifo' struct */ if (lis3dh_read_fifo(&lis, &fifo)) { - puts("read_fifo ERR"); + quit("read_fifo()", &lis); } for(int k=0; k