diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 29b8244a13309468c599dfae01021fe95756083c..e865f8b547dcc44c3ce6dba5b2c29066838959b2 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -112,9 +112,12 @@ API(API_INTERRUPT_DISABLE, int epic_interrupt_disable(api_int_id_t int_id)); #define EPIC_INT_UART_RX 2 /** RTC Alarm interrupt. See :c:func:`epic_isr_rtc_alarm` */ #define EPIC_INT_RTC_ALARM 3 +/** TODO: BHI */ +#define EPIC_INT_BHI160_ACCELEROMETER 4 +API_ISR(EPIC_INT_BHI160_ACCELEROMETER, epic_isr_bhi160_accelerometer); /* Number of defined interrupts. */ -#define EPIC_INT_NUM 4 +#define EPIC_INT_NUM 5 /* clang-format on */ API_ISR(EPIC_INT_RESET, epic_isr_reset); diff --git a/epicardium/modules/bhi.c b/epicardium/modules/bhi.c index 79ce0a724fcf9e11c14d0c6185d116a293f77cad..77ad773f5e013bdee71a1a297a80c407139a5ae1 100644 --- a/epicardium/modules/bhi.c +++ b/epicardium/modules/bhi.c @@ -11,6 +11,7 @@ #include "semphr.h" #include "queue.h" +#include "api/interrupt-sender.h" #include "epicardium.h" #include "modules/log.h" #include "modules/modules.h" @@ -215,6 +216,9 @@ bhi160_handle_packet(bhy_data_type_t data_type, bhy_data_generic_t *sensor_data) &data_vector, BHI160_MUTEX_WAIT_MS ); + if (sensor_id == VS_ID_ACCELEROMETER_WAKEUP) { + api_interrupt_trigger(EPIC_INT_BHI160_ACCELEROMETER); + } break; default: break; diff --git a/pycardium/meson.build b/pycardium/meson.build index cf5f5ba57ecdbdb4d321cd5d6bc08dfc151024ff..763431b353187691a0a6494c10516ffed9a217da 100644 --- a/pycardium/meson.build +++ b/pycardium/meson.build @@ -1,6 +1,7 @@ name = 'pycardium' modsrc = files( + 'modules/bhi160-sys.c', 'modules/interrupt.c', 'modules/leds.c', 'modules/sys_display.c', diff --git a/pycardium/modules/bhi160-sys.c b/pycardium/modules/bhi160-sys.c new file mode 100644 index 0000000000000000000000000000000000000000..35d81b257f3f43d1a16c97e6788ce808d5cd022d --- /dev/null +++ b/pycardium/modules/bhi160-sys.c @@ -0,0 +1,61 @@ +#include "py/obj.h" +#include "py/runtime.h" +#include "py/builtin.h" +#include "epicardium.h" +#include "api/common.h" +#include "mphalport.h" + +STATIC mp_obj_t mp_bhi160_enable_sensor(size_t n_args, const mp_obj_t *args) +{ + int sensor_type = mp_obj_get_int(args[0]); + + struct bhi160_sensor_config cfg = { 0 }; + cfg.sample_buffer_len = mp_obj_get_int(args[1]); + cfg.sample_rate = mp_obj_get_int(args[2]); + cfg.dynamic_range = mp_obj_get_int(args[3]); + + //cfg.sample_buffer_len = 200; + //cfg.sample_rate = 4; + //cfg.dynamic_range = 2; + + int sd = epic_bhi160_enable_sensor(sensor_type, &cfg); + + return MP_OBJ_NEW_SMALL_INT(sd); +} + +STATIC mp_obj_t mp_bhi160_read_sensor(mp_obj_t stream_id_in) +{ + struct bhi160_data_vector buf[100]; + int sd = mp_obj_get_int(stream_id_in); + + int n = epic_stream_read(sd, buf, sizeof(buf)); + + return MP_OBJ_NEW_SMALL_INT(n); +} + +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( + mp_bhi160_enable_sensor_obj, 4, 4, mp_bhi160_enable_sensor +); + +STATIC MP_DEFINE_CONST_FUN_OBJ_1( + mp_bhi160_read_sensor_obj, mp_bhi160_read_sensor +); + +STATIC const mp_rom_map_elem_t bhi160_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_sys_bhi160) }, + { MP_ROM_QSTR(MP_QSTR_enable_sensor), + MP_ROM_PTR(&mp_bhi160_enable_sensor_obj) }, + { MP_ROM_QSTR(MP_QSTR_read_sensor), + MP_ROM_PTR(&mp_bhi160_read_sensor_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(bhi160_module_globals, bhi160_module_globals_table); + +// Define module object. +const mp_obj_module_t bhi160_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&bhi160_module_globals, +}; + +/* clang-format off */ +// Register the module to make it available in Python +MP_REGISTER_MODULE(MP_QSTR_sys_bhi160, bhi160_module, MODULE_BHI160_ENABLED); diff --git a/pycardium/modules/interrupt.c b/pycardium/modules/interrupt.c index 10770a19648a9bd9af182dfd58e2f0fddbf32def..90dd700a8fc0022163c65ce10a883baed3d75b45 100644 --- a/pycardium/modules/interrupt.c +++ b/pycardium/modules/interrupt.c @@ -85,6 +85,8 @@ static const mp_rom_map_elem_t interrupt_module_globals_table[] = { /* Interrupt Numbers */ { MP_ROM_QSTR(MP_QSTR_RTC_ALARM), MP_OBJ_NEW_SMALL_INT(EPIC_INT_RTC_ALARM) }, + { MP_ROM_QSTR(MP_QSTR_BHI160_ACCELEROMETER), + MP_OBJ_NEW_SMALL_INT(EPIC_INT_BHI160_ACCELEROMETER) }, }; static MP_DEFINE_CONST_DICT( interrupt_module_globals, interrupt_module_globals_table diff --git a/pycardium/modules/py/bhi160.py b/pycardium/modules/py/bhi160.py new file mode 100644 index 0000000000000000000000000000000000000000..4d13895f64b36d453d02c4a5ca3883b17601133d --- /dev/null +++ b/pycardium/modules/py/bhi160.py @@ -0,0 +1,38 @@ +import sys_bhi160 +import interrupt + + +class BHI160Accelerometer: + def __init__( + self, sample_rate=4, dynamic_range=2, callback=None, sample_buffer_len=200 + ): + interrupt.disable_callback(interrupt.BHI160_ACCELEROMETER) + interrupt.set_callback( + interrupt.BHI160_ACCELEROMETER, self._accelerometer_interrupt + ) + self.acc_sd = sys_bhi160.enable_sensor( + 0, sample_buffer_len, sample_rate, dynamic_range + ) + self._callback = callback + if callback: + interrupt.enable_callback(interrupt.BHI160_ACCELEROMETER) + + def __enter__(self): + return self + + def __exit__(self, _et, _ev, _t): + self.close() + + def close(self): + if self.acc_sd is not None: + self.acc_sd = None + self.acc_sd = sys_bhi160.disable_sensor(0) + interrupt.disable_callback(interrupt.BHI160_ACCELEROMETER) + interrupt.set_callback(interrupt.BHI160_ACCELEROMETER, None) + + def _accelerometer_interrupt(self, _): + if self.acc_sd is not None: + data = sys_bhi160.read_sensor(self.acc_sd) + print(data) + if self._callback: + self._callback(data) diff --git a/pycardium/modules/py/meson.build b/pycardium/modules/py/meson.build index eab92f959051c62bfc4ab065d3385e721d6711f2..d164445c681176d34bc377f70cc4e51d7eca9c54 100644 --- a/pycardium/modules/py/meson.build +++ b/pycardium/modules/py/meson.build @@ -1,4 +1,5 @@ python_modules = files( + 'bhi160.py', 'color.py', 'htmlcolor.py', 'display.py', diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index dedc57c05513debe59a7441493dcf7d86ec0060d..8b6495cf46287ed610749cf168936e387fa5e055 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -33,9 +33,14 @@ Q(vibrate) Q(set_callback) Q(enable_callback) Q(disable_callback) -Q(BHI160) +Q(BHI160_ACCELEROMETER) Q(RTC_ALARM) +/* bhi160 */ +Q(sys_bhi160) +Q(enable_sensor) +Q(read_sensor) + /* display */ Q(sys_display) Q(display) diff --git a/pycardium/mpconfigport.h b/pycardium/mpconfigport.h index 233c01bbb82dd986e9ec54c53275ffef96631269..4b57b43a5ca18e4e25ac03a8018dfe59b0dcf4c8 100644 --- a/pycardium/mpconfigport.h +++ b/pycardium/mpconfigport.h @@ -39,6 +39,7 @@ /* Modules */ #define MODULE_UTIME_ENABLED (1) +#define MODULE_BHI160_ENABLED (1) #define MODULE_LEDS_ENABLED (1) #define MODULE_VIBRA_ENABLED (1) #define MODULE_INTERRUPT_ENABLED (1)