summaryrefslogtreecommitdiff
path: root/ports/zephyr/modzsensor.c
diff options
context:
space:
mode:
authorNed Konz <ned@metamagix.tech>2025-09-30 13:22:10 -0700
committerDamien George <damien@micropython.org>2025-10-13 12:06:24 +1100
commitc6a78515fba853ecfe3083cba5f5a09fb72d475d (patch)
treef15ff0960f178729b93b11e38494424566c52b86 /ports/zephyr/modzsensor.c
parentd42a301afd2661618e2a1a6a09c668b2f044c3d8 (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.c88
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);