| /* |
| * Copyright (c) 2023 Intel Corporation. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/sensing/sensing.h> |
| #include <zephyr/sensing/sensing_sensor.h> |
| #include <stdlib.h> |
| #include "sensor_mgmt.h" |
| |
| #include <zephyr/logging/log.h> |
| LOG_MODULE_DECLARE(sensing, CONFIG_SENSING_LOG_LEVEL); |
| |
| /* sensing_open_sensor is normally called by applications: hid, chre, zephyr main, etc */ |
| int sensing_open_sensor(const struct sensing_sensor_info *sensor_info, |
| struct sensing_callback_list *cb_list, |
| sensing_sensor_handle_t *handle) |
| { |
| int ret = 0; |
| |
| if (sensor_info == NULL || handle == NULL) { |
| return -ENODEV; |
| } |
| |
| STRUCT_SECTION_FOREACH(sensing_sensor, sensor) { |
| if (sensor_info == sensor->info) { |
| ret = open_sensor(sensor, (struct sensing_connection **)handle); |
| if (ret) { |
| return -EINVAL; |
| } |
| break; |
| } |
| } |
| |
| return sensing_register_callback(*handle, cb_list); |
| } |
| |
| int sensing_open_sensor_by_dt(const struct device *dev, |
| struct sensing_callback_list *cb_list, |
| sensing_sensor_handle_t *handle) |
| { |
| int ret = 0; |
| struct sensing_sensor *sensor; |
| |
| if (handle == NULL) { |
| return -ENODEV; |
| } |
| |
| sensor = get_sensor_by_dev(dev); |
| if (sensor == NULL) { |
| LOG_ERR("cannot get sensor from dev:%p", dev); |
| return -ENODEV; |
| } |
| |
| ret = open_sensor(sensor, (struct sensing_connection **)handle); |
| if (ret) { |
| return -EINVAL; |
| } |
| |
| return sensing_register_callback(*handle, cb_list); |
| } |
| |
| /* sensing_close_sensor is normally called by applications: hid, chre, zephyr main, etc */ |
| int sensing_close_sensor(sensing_sensor_handle_t *handle) |
| { |
| if (handle == NULL) { |
| return -ENODEV; |
| } |
| |
| return close_sensor((struct sensing_connection **)handle); |
| } |
| |
| int sensing_set_config(sensing_sensor_handle_t handle, |
| struct sensing_sensor_config *configs, |
| int count) |
| { |
| struct sensing_sensor_config *cfg; |
| int i, ret = 0; |
| |
| if (handle == NULL || configs == NULL) { |
| return -ENODEV; |
| } |
| |
| if (count <= 0 || count > SENSING_SENSOR_ATTRIBUTE_MAX) { |
| LOG_ERR("invalid config count:%d", count); |
| return -EINVAL; |
| } |
| |
| for (i = 0; i < count; i++) { |
| cfg = &configs[i]; |
| switch (cfg->attri) { |
| case SENSING_SENSOR_ATTRIBUTE_INTERVAL: |
| ret |= set_interval(handle, cfg->interval); |
| break; |
| |
| case SENSING_SENSOR_ATTRIBUTE_SENSITIVITY: |
| ret |= set_sensitivity(handle, cfg->data_field, cfg->sensitivity); |
| break; |
| |
| case SENSING_SENSOR_ATTRIBUTE_LATENCY: |
| break; |
| |
| default: |
| ret = -EINVAL; |
| LOG_ERR("invalid config attribute:%d\n", cfg->attri); |
| break; |
| } |
| } |
| |
| return ret; |
| } |
| |
| int sensing_get_config(sensing_sensor_handle_t handle, |
| struct sensing_sensor_config *configs, |
| int count) |
| { |
| struct sensing_sensor_config *cfg; |
| int i, ret = 0; |
| |
| if (handle == NULL || configs == NULL) { |
| return -ENODEV; |
| } |
| |
| if (count <= 0 || count > SENSING_SENSOR_ATTRIBUTE_MAX) { |
| LOG_ERR("invalid config count:%d", count); |
| return -EINVAL; |
| } |
| |
| for (i = 0; i < count; i++) { |
| cfg = &configs[i]; |
| switch (cfg->attri) { |
| case SENSING_SENSOR_ATTRIBUTE_INTERVAL: |
| ret |= get_interval(handle, &cfg->interval); |
| break; |
| |
| case SENSING_SENSOR_ATTRIBUTE_SENSITIVITY: |
| ret |= get_sensitivity(handle, cfg->data_field, &cfg->sensitivity); |
| break; |
| |
| case SENSING_SENSOR_ATTRIBUTE_LATENCY: |
| break; |
| |
| default: |
| ret = -EINVAL; |
| LOG_ERR("invalid config attribute:%d\n", cfg->attri); |
| break; |
| } |
| } |
| |
| return ret; |
| } |
| |
| const struct sensing_sensor_info *sensing_get_sensor_info(sensing_sensor_handle_t handle) |
| { |
| return get_sensor_info(handle); |
| } |