diff --git a/samples/subsys/sensing/simple/boards/native_posix.overlay b/samples/subsys/sensing/simple/boards/native_posix.overlay index d11630cd5d98af1..4f51532424fe151 100644 --- a/samples/subsys/sensing/simple/boards/native_posix.overlay +++ b/samples/subsys/sensing/simple/boards/native_posix.overlay @@ -41,5 +41,15 @@ minimal-interval = <625>; underlying-device = <&bmi160_spi>; }; + + hinge_angle: hinge-angle { + compatible = "zephyr,sensing-hinge-angle"; + status = "okay"; + sensor-type = <0x20B>; + friendly-name = "Hinge Angle Sensor"; + reporters = <&base_accel &lid_accel>; + minimal-interval = <100000>; + stream-mode; + }; }; }; diff --git a/samples/subsys/sensing/simple/src/main.c b/samples/subsys/sensing/simple/src/main.c index 7884acef3a61e91..277517bd30718a2 100644 --- a/samples/subsys/sensing/simple/src/main.c +++ b/samples/subsys/sensing/simple/src/main.c @@ -17,6 +17,7 @@ static void acc_data_event_callback(sensing_sensor_handle_t handle, const void * { const struct sensing_sensor_info *info = sensing_get_sensor_info(handle); struct sensing_sensor_value_3d_q31 *sample = (struct sensing_sensor_value_3d_q31 *)buf; + ARG_UNUSED(context); LOG_INF("%s(%d), handle:%p, Sensor:%s data:(x:%d, y:%d, z:%d)", @@ -26,6 +27,17 @@ static void acc_data_event_callback(sensing_sensor_handle_t handle, const void * sample->readings[0].z); } +static void hinge_angle_data_event_callback(sensing_sensor_handle_t handle, const void *buf, + void *context) +{ + const struct sensing_sensor_info *info = sensing_get_sensor_info(handle); + struct sensing_sensor_value_q31 *sample = (struct sensing_sensor_value_q31 *)buf; + + ARG_UNUSED(context); + + LOG_INF("handle:%p, Sensor:%s data:(v:%d)", handle, info->name, sample->readings[0].v); +} + int main(void) { const struct sensing_callback_list base_acc_cb_list = { @@ -34,9 +46,17 @@ int main(void) const struct sensing_callback_list lid_acc_cb_list = { .on_data_event = &acc_data_event_callback, }; + const struct sensing_callback_list hinge_angle_cb_list = { + .on_data_event = &hinge_angle_data_event_callback, + }; const struct sensing_sensor_info *info; sensing_sensor_handle_t base_acc; sensing_sensor_handle_t lid_acc; + sensing_sensor_handle_t hinge_angle; + struct sensing_sensor_config base_acc_config; + struct sensing_sensor_config lid_acc_config; + struct sensing_sensor_config hinge_angle_config; + const struct sensing_sensor_info *tmp_sensor_info; int ret, i, num = 0; ret = sensing_get_sensors(&num, &info); @@ -65,18 +85,118 @@ int main(void) &lid_acc_cb_list, &lid_acc); if (ret) { - LOG_ERR("sensing_open_sensor, type:0x%x index:1 error:%d", + LOG_ERR("sensing_open_sensor_by_dt, type:0x%x index:1 error:%d", SENSING_SENSOR_TYPE_MOTION_ACCELEROMETER_3D, ret); } + ret = sensing_open_sensor_by_dt(DEVICE_DT_GET(DT_NODELABEL(hinge_angle)), + &hinge_angle_cb_list, + &hinge_angle); + if (ret) { + LOG_ERR("sensing_open_sensor_by_type, type:0x%x index:0 error:%d", + SENSING_SENSOR_TYPE_MOTION_HINGE_ANGLE, ret); + } + + /* set base acc, lid acc, hinge sensor interval */ + base_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_INTERVAL; + base_acc_config.interval = 100 * USEC_PER_MSEC; + ret = sensing_set_config(base_acc, &base_acc_config, 1); + if (ret) { + LOG_ERR("base_acc sensing_set_interval error:%d\n", ret); + } + + lid_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_INTERVAL; + lid_acc_config.interval = 100 * USEC_PER_MSEC; + ret = sensing_set_config(lid_acc, &lid_acc_config, 1); + if (ret) { + LOG_ERR("lid_acc sensing_set_interval error:%d\n", ret); + } + + tmp_sensor_info = sensing_get_sensor_info(hinge_angle); + hinge_angle_config.attri = SENSING_SENSOR_ATTRIBUTE_INTERVAL; + hinge_angle_config.interval = tmp_sensor_info->minimal_interval; + ret = sensing_set_config(hinge_angle, &hinge_angle_config, 1); + if (ret) { + LOG_ERR("hinge_angle sensing_set_interval error:%d\n", ret); + } + + memset(&base_acc_config, 0x00, sizeof(struct sensing_sensor_config)); + memset(&lid_acc_config, 0x00, sizeof(struct sensing_sensor_config)); + memset(&hinge_angle_config, 0x00, sizeof(struct sensing_sensor_config)); + + /* get base acc, lid acc, hinge sensor interval */ + base_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_INTERVAL; + ret = sensing_get_config(base_acc, &base_acc_config, 1); + if (ret) { + LOG_ERR("base_acc sensing_get_interval error:%d\n", ret); + } + + lid_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_INTERVAL; + ret = sensing_get_config(lid_acc, &lid_acc_config, 1); + if (ret) { + LOG_ERR("lid_acc sensing_get_interval error:%d\n", ret); + } + + hinge_angle_config.attri = SENSING_SENSOR_ATTRIBUTE_INTERVAL; + ret = sensing_get_config(hinge_angle, &hinge_angle_config, 1); + if (ret) { + LOG_ERR("hinge_angle sensing_get_interval error:%d\n", ret); + } + + /* set base acc, lid acc, hinge sensor sensitivity */ + base_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_SENSITIVITY; + base_acc_config.data_field = SENSING_SENSITIVITY_INDEX_ALL; + base_acc_config.sensitivity = 0; + ret = sensing_set_config(base_acc, &base_acc_config, 1); + if (ret) { + LOG_ERR("base_acc sensing_set_sensitivity error:%d\n", ret); + } + + lid_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_SENSITIVITY; + lid_acc_config.data_field = SENSING_SENSITIVITY_INDEX_ALL; + lid_acc_config.sensitivity = 0; + ret = sensing_set_config(lid_acc, &lid_acc_config, 1); + if (ret) { + LOG_ERR("lid_acc sensing_set_sensitivity error:%d\n", ret); + } + + hinge_angle_config.attri = SENSING_SENSOR_ATTRIBUTE_SENSITIVITY; + hinge_angle_config.data_field = SENSING_SENSITIVITY_INDEX_ALL; + hinge_angle_config.sensitivity = 1; + ret = sensing_set_config(hinge_angle, &hinge_angle_config, 1); + if (ret) { + LOG_ERR("hinge_angle sensing_set_sensitivity error:%d\n", ret); + } + + memset(&base_acc_config, 0x00, sizeof(struct sensing_sensor_config)); + memset(&lid_acc_config, 0x00, sizeof(struct sensing_sensor_config)); + memset(&hinge_angle_config, 0x00, sizeof(struct sensing_sensor_config)); + + /* get base acc, lid acc, hinge sensor sensitivity */ + base_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_SENSITIVITY; + base_acc_config.data_field = SENSING_SENSITIVITY_INDEX_ALL; + ret = sensing_get_config(base_acc, &base_acc_config, 1); + if (ret) { + LOG_ERR("base_acc sensing_get_sensitivity error:%d\n", ret); + } + + lid_acc_config.attri = SENSING_SENSOR_ATTRIBUTE_SENSITIVITY; + lid_acc_config.data_field = SENSING_SENSITIVITY_INDEX_ALL; + ret = sensing_get_config(lid_acc, &lid_acc_config, 1); + if (ret) { + LOG_ERR("lid_acc sensing_get_sensitivity error:%d\n", ret); + } - ret = sensing_close_sensor(&base_acc); + hinge_angle_config.attri = SENSING_SENSOR_ATTRIBUTE_SENSITIVITY; + hinge_angle_config.data_field = SENSING_SENSITIVITY_INDEX_ALL; + ret = sensing_get_config(hinge_angle, &hinge_angle_config, 1); if (ret) { - LOG_ERR("sensing_close_sensor:%p error:%d", base_acc, ret); + LOG_ERR("hinge_angle sensing_get_sensitivity error:%d\n", ret); } ret = sensing_close_sensor(&lid_acc); if (ret) { LOG_ERR("sensing_close_sensor:%p error:%d", lid_acc, ret); } + return 0; }