From 37d26eb65fad4be0f2c741a49ef0f543ccfa482a Mon Sep 17 00:00:00 2001 From: Pim van Pelt Date: Thu, 19 Apr 2018 15:32:00 +0200 Subject: [PATCH] Move private IMU data into its mgos_imu_internal.h --- include/mgos_imu.h | 76 ++++++----------------------------- src/mgos_imu.c | 51 ++++++++++++++++++++++++ src/mgos_imu_internal.h | 88 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+), 64 deletions(-) create mode 100644 src/mgos_imu.c create mode 100644 src/mgos_imu_internal.h diff --git a/include/mgos_imu.h b/include/mgos_imu.h index 998a62b..16fc96d 100644 --- a/include/mgos_imu.h +++ b/include/mgos_imu.h @@ -17,20 +17,11 @@ #pragma once #include "mgos.h" +#include "mgos_i2c.h" -struct mgos_imu_mag; -struct mgos_imu_acc; -struct mgos_imu_gyro; - -typedef bool (*mgos_imu_mag_detect_fn)(struct mgos_imu_mag *dev); -typedef bool (*mgos_imu_mag_start_fn)(struct mgos_imu_mag *dev); -typedef bool (*mgos_imu_mag_read_fn)(struct mgos_imu_mag *dev); -typedef bool (*mgos_imu_acc_detect_fn)(struct mgos_imu_acc *dev); -typedef bool (*mgos_imu_acc_start_fn)(struct mgos_imu_acc *dev); -typedef bool (*mgos_imu_acc_read_fn)(struct mgos_imu_acc *dev); -typedef bool (*mgos_imu_gyro_detect_fn)(struct mgos_imu_gyro *dev); -typedef bool (*mgos_imu_gyro_start_fn)(struct mgos_imu_gyro *dev); -typedef bool (*mgos_imu_gyro_read_fn)(struct mgos_imu_gyro *dev); +#ifdef __cplusplus +extern "C" { +#endif enum mgos_imu_acc_type { ACC_NONE = 0, @@ -47,53 +38,7 @@ enum mgos_imu_mag_type { MAG_AK8963 }; -struct mgos_imu { - struct mgos_imu_mag *mag; - struct mgos_imu_acc *acc; - struct mgos_imu_gyro *gyro; -}; - -struct mgos_imu_mag { - mgos_imu_mag_detect_fn detect; - mgos_imu_mag_start_fn start; - mgos_imu_mag_read_fn read; - - struct mgos_i2c *i2c; - uint8_t i2caddr; - enum mgos_imu_mag_type type; - - float gain[3]; - int16_t data[3]; -}; - -struct mgos_imu_acc { - mgos_imu_acc_detect_fn detect; - mgos_imu_acc_start_fn start; - mgos_imu_acc_read_fn read; - - struct mgos_i2c *i2c; - uint8_t i2caddr; - enum mgos_imu_acc_type type; - - float scale; - int16_t data[3]; -}; - -struct mgos_imu_gyro { - mgos_imu_gyro_detect_fn detect; - mgos_imu_gyro_start_fn start; - mgos_imu_gyro_read_fn read; - - struct mgos_i2c *i2c; - uint8_t i2caddr; - enum mgos_imu_gyro_type type; - - float scale; - float bias[3]; - int16_t data[3]; - int16_t temperature; -}; - +struct mgos_imu; struct mgos_imu *mgos_imu_create_i2c(struct mgos_i2c *i2c); bool mgos_imu_add_gyroscope_i2c(struct mgos_imu *sensor, uint8_t i2caddr, enum mgos_imu_gyro_type type); @@ -106,23 +51,26 @@ bool mgos_imu_has_accelerometer(struct mgos_imu *sensor); bool mgos_imu_has_gyroscope(struct mgos_imu *sensor); bool mgos_imu_has_magnetometer(struct mgos_imu *sensor); -/* Read all available sensor data in the IMU */ +/* Read all available sensor data from the IMU */ bool mgos_imu_read(struct mgos_imu *sensor); -/* Return accelerometer data in units of G */ +/* Return accelerometer data in units of m/s/s */ bool mgos_imu_get_accelerometer(struct mgos_imu *sensor, float *x, float *y, float *z); /* Return accelerometer data in units of deg/sec rotation rate */ bool mgos_imu_get_gyroscope(struct mgos_imu *sensor, float *x, float *y, float *z); -/* Return magnetometer data in units of microTesla */ +/* Return magnetometer data in units of microtesla (1 microtesla = 10 milligauss) */ bool mgos_imu_get_magnetometer(struct mgos_imu *sensor, float *x, float *y, float *z); +/* Return compass heading based on magnetometer data, from [0..359] */ +bool mgos_imu_get_compass_heading(struct mgos_imu *sensor, uint16_t *heading); + /* * Initialization function for MGOS -- currently a noop. */ bool mgos_imu_init(void); - #ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/src/mgos_imu.c b/src/mgos_imu.c new file mode 100644 index 0000000..4333102 --- /dev/null +++ b/src/mgos_imu.c @@ -0,0 +1,51 @@ +/* + * Copyright 2018 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "mgos.h" +#include "mgos_imu_internal.h" + +// Private functions follow +// Private functions end + +// Public functions follow +struct mgos_imu *mgos_imu_create(struct mgos_i2c *i2c, uint8_t i2caddr) { + struct mgos_imu *sensor; + + if (!i2c) { + return NULL; + } + + sensor = calloc(1, sizeof(struct mgos_imu)); + if (!sensor) { + return NULL; + } + return sensor; +} + +void mgos_imu_destroy(struct mgos_imu **sensor) { + if (!*sensor) { + return; + } + free(*sensor); + *sensor = NULL; + return; +} + +bool mgos_imu_init(void) { + return true; +} + +// Public functions end diff --git a/src/mgos_imu_internal.h b/src/mgos_imu_internal.h new file mode 100644 index 0000000..7725132 --- /dev/null +++ b/src/mgos_imu_internal.h @@ -0,0 +1,88 @@ +/* + * Copyright 2018 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "mgos.h" +#include "mgos_imu.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct mgos_imu_mag; +struct mgos_imu_acc; +struct mgos_imu_gyro; + +typedef bool (*mgos_imu_mag_detect_fn)(struct mgos_imu_mag *dev); +typedef bool (*mgos_imu_mag_start_fn)(struct mgos_imu_mag *dev); +typedef bool (*mgos_imu_mag_read_fn)(struct mgos_imu_mag *dev); +typedef bool (*mgos_imu_acc_detect_fn)(struct mgos_imu_acc *dev); +typedef bool (*mgos_imu_acc_start_fn)(struct mgos_imu_acc *dev); +typedef bool (*mgos_imu_acc_read_fn)(struct mgos_imu_acc *dev); +typedef bool (*mgos_imu_gyro_detect_fn)(struct mgos_imu_gyro *dev); +typedef bool (*mgos_imu_gyro_start_fn)(struct mgos_imu_gyro *dev); +typedef bool (*mgos_imu_gyro_read_fn)(struct mgos_imu_gyro *dev); +struct mgos_imu { + struct mgos_imu_mag * mag; + struct mgos_imu_acc * acc; + struct mgos_imu_gyro *gyro; +}; + +struct mgos_imu_mag { + mgos_imu_mag_detect_fn detect; + mgos_imu_mag_start_fn start; + mgos_imu_mag_read_fn read; + + struct mgos_i2c * i2c; + uint8_t i2caddr; + enum mgos_imu_mag_type type; + + float gain[3]; + int16_t data[3]; +}; + +struct mgos_imu_acc { + mgos_imu_acc_detect_fn detect; + mgos_imu_acc_start_fn start; + mgos_imu_acc_read_fn read; + + struct mgos_i2c * i2c; + uint8_t i2caddr; + enum mgos_imu_acc_type type; + + float scale; + int16_t data[3]; +}; + +struct mgos_imu_gyro { + mgos_imu_gyro_detect_fn detect; + mgos_imu_gyro_start_fn start; + mgos_imu_gyro_read_fn read; + + struct mgos_i2c * i2c; + uint8_t i2caddr; + enum mgos_imu_gyro_type type; + + float scale; + float bias[3]; + int16_t data[3]; + int16_t temperature; +}; + +#ifdef __cplusplus +} +#endif