/* * Copyright (c) 2023 Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include "sensor_mgmt.h" #include 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); }