blob: d0749d3b52cd98e1beb9d180ea7fd20c07fdcc26 [file] [log] [blame]
/*
* Copyright (c) 2023 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/logging/log.h>
#include <zephyr/sys_clock.h>
#include <zephyr/sensing/sensing.h>
LOG_MODULE_REGISTER(main, LOG_LEVEL_INF);
static void acc_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_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)",
__func__, __LINE__, handle, info->name,
sample->readings[0].x,
sample->readings[0].y,
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);
}
static struct sensing_callback_list base_acc_cb_list = {
.on_data_event = &acc_data_event_callback,
};
static struct sensing_callback_list hinge_angle_cb_list = {
.on_data_event = &hinge_angle_data_event_callback,
};
int main(void)
{
const struct sensing_sensor_info *info;
sensing_sensor_handle_t base_acc;
sensing_sensor_handle_t hinge_angle;
struct sensing_sensor_config base_acc_config;
struct sensing_sensor_config hinge_angle_config;
const struct sensing_sensor_info *tmp_sensor_info = NULL;
const struct sensing_sensor_info *accle_info = NULL;
const struct sensing_sensor_info *hinge_info = NULL;
int ret, i, num = 0;
ret = sensing_get_sensors(&num, &info);
if (ret) {
LOG_ERR("sensing_get_sensors error");
return 0;
}
for (i = 0; i < num; ++i) {
LOG_INF("Sensor %d: name: %s friendly_name: %s type: %d",
i,
info[i].name,
info[i].friendly_name,
info[i].type);
switch (info[i].type) {
case SENSING_SENSOR_TYPE_MOTION_ACCELEROMETER_3D:
accle_info = &info[i];
break;
case SENSING_SENSOR_TYPE_MOTION_HINGE_ANGLE:
hinge_info = &info[i];
break;
default:
break;
}
}
LOG_INF("sensing subsystem run successfully");
ret = sensing_open_sensor(accle_info, &base_acc_cb_list, &base_acc);
if (ret) {
LOG_ERR("sensing_open_sensor, type:0x%x index:0 error:%d",
SENSING_SENSOR_TYPE_MOTION_ACCELEROMETER_3D, ret);
}
ret = sensing_open_sensor(hinge_info, &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);
}
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(&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);
}
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);
}
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(&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);
}
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("hinge_angle sensing_get_sensitivity error:%d\n", ret);
}
return 0;
}