diff options
| author | Ned Konz <ned@metamagix.tech> | 2025-09-30 13:22:10 -0700 |
|---|---|---|
| committer | Damien George <damien@micropython.org> | 2025-10-13 12:06:24 +1100 |
| commit | c6a78515fba853ecfe3083cba5f5a09fb72d475d (patch) | |
| tree | f15ff0960f178729b93b11e38494424566c52b86 /ports/zephyr/modzsensor.c | |
| parent | d42a301afd2661618e2a1a6a09c668b2f044c3d8 (diff) | |
zephyr/modzsensor: Add set/get sensor attributes to zsensor.
This commit adds `Sensor.attr_set()` and `Sensor.attr_get_*()` methods that
are necessary to set various sensor attributes if they haven't been set
statically in the device tree.
This is needed, for example, because the LSM6DS3TR-C sensor on the XIAO BLE
NRF52840 SENSE board will not work with `zsensor` because it doesn't have
any default configuration for sampling frequency.
Various `SENSOR_ATTR_*` constants from
`zephyr/incude/zephyr/drivers/sensor.h` have been added as `ATTR_*`
constants in the `zsensor` module.
Signed-off-by: Ned Konz <ned@metamagix.tech>
Diffstat (limited to 'ports/zephyr/modzsensor.c')
| -rw-r--r-- | ports/zephyr/modzsensor.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/ports/zephyr/modzsensor.c b/ports/zephyr/modzsensor.c index 51b7b2dbf..c3a8b6d55 100644 --- a/ports/zephyr/modzsensor.c +++ b/ports/zephyr/modzsensor.c @@ -93,12 +93,77 @@ static mp_obj_t sensor_get_int(mp_obj_t self_in, mp_obj_t channel_in) { } MP_DEFINE_CONST_FUN_OBJ_2(sensor_get_int_obj, sensor_get_int); +static void sensor_attr_get_internal(mp_obj_t self_in, mp_obj_t channel_in, mp_obj_t attr_in, struct sensor_value *res) { + mp_obj_sensor_t *self = MP_OBJ_TO_PTR(self_in); + + int st = sensor_attr_get(self->dev, mp_obj_get_int(channel_in), mp_obj_get_int(attr_in), res); + if (st != 0) { + mp_raise_OSError(-st); + } +} + +static mp_obj_t sensor_attr_get_float(mp_obj_t self_in, mp_obj_t channel_in, mp_obj_t attr_in) { + struct sensor_value val; + sensor_attr_get_internal(self_in, channel_in, attr_in, &val); + return mp_obj_new_float(val.val1 + (mp_float_t)val.val2 / 1000000); +} +MP_DEFINE_CONST_FUN_OBJ_3(sensor_attr_get_float_obj, sensor_attr_get_float); + +static mp_obj_t sensor_attr_get_micros(mp_obj_t self_in, mp_obj_t channel_in, mp_obj_t attr_in) { + struct sensor_value val; + sensor_attr_get_internal(self_in, channel_in, attr_in, &val); + return MP_OBJ_NEW_SMALL_INT(val.val1 * 1000000 + val.val2); +} +MP_DEFINE_CONST_FUN_OBJ_3(sensor_attr_get_micros_obj, sensor_attr_get_micros); + +static mp_obj_t sensor_attr_get_millis(mp_obj_t self_in, mp_obj_t channel_in, mp_obj_t attr_in) { + struct sensor_value val; + sensor_attr_get_internal(self_in, channel_in, attr_in, &val); + return MP_OBJ_NEW_SMALL_INT(val.val1 * 1000 + val.val2 / 1000); +} +MP_DEFINE_CONST_FUN_OBJ_3(sensor_attr_get_millis_obj, sensor_attr_get_millis); + +static mp_obj_t sensor_attr_get_int(mp_obj_t self_in, mp_obj_t channel_in, mp_obj_t attr_in) { + struct sensor_value val; + sensor_attr_get_internal(self_in, channel_in, attr_in, &val); + return MP_OBJ_NEW_SMALL_INT(val.val1); +} +MP_DEFINE_CONST_FUN_OBJ_3(sensor_attr_get_int_obj, sensor_attr_get_int); + +static mp_obj_t mp_sensor_attr_set(size_t n_args, const mp_obj_t *args) { + mp_obj_sensor_t *self = MP_OBJ_TO_PTR(args[0]); + mp_obj_t channel_in = args[1]; + mp_obj_t attr_in = args[2]; + struct sensor_value val; + if (n_args == 4) { + // One float argument + float v = mp_obj_get_float(args[3]); + val.val1 = (int32_t)v; + val.val2 = (int32_t)((v - val.val1) * 1000000); + } else { + // Two integer arguments + val.val1 = mp_obj_get_int(args[3]); + val.val2 = mp_obj_get_int(args[4]); + } + int st = sensor_attr_set(self->dev, mp_obj_get_int(channel_in), mp_obj_get_int(attr_in), &val); + if (st != 0) { + mp_raise_OSError(-st); + } + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(sensor_attr_set_obj, 4, 5, mp_sensor_attr_set); + static const mp_rom_map_elem_t sensor_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_measure), MP_ROM_PTR(&sensor_measure_obj) }, { MP_ROM_QSTR(MP_QSTR_get_float), MP_ROM_PTR(&sensor_get_float_obj) }, { MP_ROM_QSTR(MP_QSTR_get_micros), MP_ROM_PTR(&sensor_get_micros_obj) }, { MP_ROM_QSTR(MP_QSTR_get_millis), MP_ROM_PTR(&sensor_get_millis_obj) }, { MP_ROM_QSTR(MP_QSTR_get_int), MP_ROM_PTR(&sensor_get_int_obj) }, + { MP_ROM_QSTR(MP_QSTR_attr_get_float), MP_ROM_PTR(&sensor_attr_get_float_obj) }, + { MP_ROM_QSTR(MP_QSTR_attr_get_micros), MP_ROM_PTR(&sensor_attr_get_micros_obj) }, + { MP_ROM_QSTR(MP_QSTR_attr_get_millis), MP_ROM_PTR(&sensor_attr_get_millis_obj) }, + { MP_ROM_QSTR(MP_QSTR_attr_get_int), MP_ROM_PTR(&sensor_attr_get_int_obj) }, + { MP_ROM_QSTR(MP_QSTR_attr_set), MP_ROM_PTR(&sensor_attr_set_obj) }, }; static MP_DEFINE_CONST_DICT(sensor_locals_dict, sensor_locals_dict_table); @@ -119,12 +184,15 @@ static const mp_rom_map_elem_t mp_module_zsensor_globals_table[] = { C(ACCEL_X), C(ACCEL_Y), C(ACCEL_Z), + C(ACCEL_XYZ), C(GYRO_X), C(GYRO_Y), C(GYRO_Z), + C(GYRO_XYZ), C(MAGN_X), C(MAGN_Y), C(MAGN_Z), + C(MAGN_XYZ), C(DIE_TEMP), C(AMBIENT_TEMP), C(PRESS), @@ -145,6 +213,26 @@ static const mp_rom_map_elem_t mp_module_zsensor_globals_table[] = { C(GAS_RES), C(VOLTAGE), #undef C +#define C(name) { MP_ROM_QSTR(MP_QSTR_ATTR_##name), MP_ROM_INT(SENSOR_ATTR_##name) } + C(SAMPLING_FREQUENCY), + C(LOWER_THRESH), + C(UPPER_THRESH), + C(SLOPE_TH), + C(SLOPE_DUR), + C(HYSTERESIS), + C(OVERSAMPLING), + C(FULL_SCALE), + C(OFFSET), + C(CALIB_TARGET), + C(CONFIGURATION), + C(CALIBRATION), + C(FEATURE_MASK), + C(ALERT), + C(FF_DUR), + C(BATCH_DURATION), + C(GAIN), + C(RESOLUTION), +#undef C }; static MP_DEFINE_CONST_DICT(mp_module_zsensor_globals, mp_module_zsensor_globals_table); |
