diff --git a/Documentation/pycardium/bme680.rst b/Documentation/pycardium/bme680.rst index 907d5956b8287646734fa4a3907b12ea09b9e6ac..a3cda52183bc2c037d20850b7d7034ebaf1c07d0 100644 --- a/Documentation/pycardium/bme680.rst +++ b/Documentation/pycardium/bme680.rst @@ -1,7 +1,11 @@ ``bme680`` - 4-in-1 Sensor ========================== -.. py:function:: bme680.get_bme_data() +.. py:function:: bme680.init() + + Before being able to read data from the sensor, you have to call init(). + +.. py:function:: bme680.get_data() Does a single measurement to get environmental data. diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index e93a8b51195ef2fe2c81a5198fa20a3ddeb21c12..5492d662f131f88f1e1c789d7894b60dd78b9f77 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -106,7 +106,8 @@ typedef _Bool bool; #define API_PERSONAL_STATE_GET 0xc1 #define API_PERSONAL_STATE_IS_PERSISTENT 0xc2 -#define API_BME680_GET_DATA 0xD0 +#define API_BME680_INIT 0xD0 +#define API_BME680_GET_DATA 0xD1 /* clang-format on */ @@ -683,6 +684,20 @@ struct bme680_sensor_data { float gas_resistance; }; +/** + * Initialize the BM680 sensor. + * + * :param data: Where to store the environmental data. + * :return: 0 on success or ``-Exxx`` on error. The following + * errors might occur: + * + * - ``-EFAULT``: On NULL-pointer. + * - ``-EINVAL``: Invalid configuration. + * - ``-EIO``: Communication with the device failed. + * - ``-ENODEV``: Device was not found. + */ +API(API_BME680_INIT, int epic_bme680_init()); + /** * Get the current BME680 data. * diff --git a/epicardium/modules/bme680.c b/epicardium/modules/bme680.c index ab57bd02e1e475df5117b81ed600ac5a8554baa7..d98b07aa06748e35eaef83a11b6f39e784a98c02 100644 --- a/epicardium/modules/bme680.c +++ b/epicardium/modules/bme680.c @@ -15,6 +15,7 @@ static bool initialized; static struct bme680_dev bme; +uint16_t settings_sel; static int convert_error(int8_t error) { @@ -32,12 +33,10 @@ static int convert_error(int8_t error) } } -int epic_bme680_read_sensors(struct bme680_sensor_data *data) -{ - int8_t result = BME680_OK; - uint16_t settings_sel; +int epic_bme680_init() { + int8_t result = BME680_OK; - if (__builtin_expect(!initialized, 0)) { + if (__builtin_expect(!initialized, 0)) { bme.dev_id = BME680_I2C_ADDR_PRIMARY; bme.intf = BME680_I2C_INTF; @@ -84,7 +83,17 @@ int epic_bme680_read_sensors(struct bme680_sensor_data *data) initialized = true; } + return 0; +} + +int epic_bme680_read_sensors(struct bme680_sensor_data *data) +{ + if(!initialized) { + LOG_ERR("bme680", "bme680 sensor not initialized"); + return -1; + } + int8_t result = BME680_OK; struct bme680_field_data raw_data; uint16_t profile_dur = 0; diff --git a/pycardium/modules/bme680.c b/pycardium/modules/bme680.c index d1e628c6b1e6b4d96d71d963cf1ddb8562107ddf..7c2bef547a22622d4b04bebd5c350826d1fadf4f 100644 --- a/pycardium/modules/bme680.c +++ b/pycardium/modules/bme680.c @@ -4,7 +4,7 @@ #include "epicardium.h" -static mp_obj_t mp_get_bme_data() +static mp_obj_t mp_bme680_get_data() { struct bme680_sensor_data data; int ret = epic_bme680_read_sensors(&data); @@ -21,19 +21,32 @@ static mp_obj_t mp_get_bme_data() }; return mp_obj_new_tuple(4, values_list); } -static MP_DEFINE_CONST_FUN_OBJ_0(bme_get_bme_data_obj, mp_get_bme_data); +static MP_DEFINE_CONST_FUN_OBJ_0(bme680_get_data_obj, mp_bme680_get_data); -static const mp_rom_map_elem_t bme_module_globals_table[] = { +static mp_obj_t mp_bme680_init() +{ + int ret = epic_bme680_init(); + + if (ret < 0) { + mp_raise_OSError(-ret); + } + + return 0; +} +static MP_DEFINE_CONST_FUN_OBJ_0(bme680_init_obj, mp_bme680_init); + +static const mp_rom_map_elem_t bme680_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_bme680) }, - { MP_ROM_QSTR(MP_QSTR_get_bme_data), MP_ROM_PTR(&bme_get_bme_data_obj) }, + { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&bme680_init_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_data), MP_ROM_PTR(&bme680_get_data_obj) }, }; -static MP_DEFINE_CONST_DICT(bme_module_globals, bme_module_globals_table); +static MP_DEFINE_CONST_DICT(bme680_module_globals, bme680_module_globals_table); -const mp_obj_module_t bme_module = { +const mp_obj_module_t bme680_module = { .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&bme_module_globals, + .globals = (mp_obj_dict_t *)&bme680_module_globals, }; /* Register the module to make it available in Python */ -MP_REGISTER_MODULE(MP_QSTR_bme680, bme_module, MODULE_BME680_ENABLED); +MP_REGISTER_MODULE(MP_QSTR_bme680, bme680_module, MODULE_BME680_ENABLED); diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index 46e9cf54536737f6cfe3c07c65f6624d2f7e00dd..64830be94103cde25ad1132b52b40b8c6ab56501 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -76,7 +76,8 @@ Q(stop) /* bme680 */ Q(bme680) -Q(get_bme_data) +Q(init) +Q(get_data) /* file */ Q(__del__)