You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.4 KiB
134 lines
3.4 KiB
/* |
|
* Copyright (c) 2023 Intel Corporation. |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#ifndef SENSOR_MGMT_H_ |
|
#define SENSOR_MGMT_H_ |
|
|
|
#include <zephyr/sensing/sensing_datatypes.h> |
|
#include <zephyr/sensing/sensing_sensor.h> |
|
#include <zephyr/kernel.h> |
|
#include <zephyr/sys/slist.h> |
|
#include <zephyr/sys/ring_buffer.h> |
|
#include <string.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
#define for_each_sensor(sensor) \ |
|
STRUCT_SECTION_FOREACH(sensing_sensor, sensor) |
|
|
|
#define for_each_sensor_reverse(sensor) \ |
|
STRUCT_SECTION_START_EXTERN(sensing_sensor); \ |
|
STRUCT_SECTION_END_EXTERN(sensing_sensor); \ |
|
for (struct sensing_sensor *sensor = STRUCT_SECTION_END(sensing_sensor) \ |
|
- 1; \ |
|
({ __ASSERT(sensor >= STRUCT_SECTION_START(sensing_sensor), \ |
|
"unexpected list start location"); \ |
|
sensor >= STRUCT_SECTION_START(sensing_sensor); }); \ |
|
sensor--) |
|
|
|
|
|
#define for_each_client_conn(sensor, client) \ |
|
SYS_SLIST_FOR_EACH_CONTAINER(&sensor->client_list, client, snode) |
|
|
|
#define EXEC_TIME_INIT 0 |
|
#define EXEC_TIME_OFF UINT64_MAX |
|
|
|
extern struct rtio sensing_rtio_ctx; |
|
/** |
|
* @struct sensing_context |
|
* @brief sensing subsystem context to include global variables |
|
*/ |
|
struct sensing_context { |
|
bool sensing_initialized; |
|
struct k_sem event_sem; |
|
atomic_t event_flag; |
|
}; |
|
|
|
int open_sensor(struct sensing_sensor *sensor, struct sensing_connection **conn); |
|
int close_sensor(struct sensing_connection **conn); |
|
int sensing_register_callback(struct sensing_connection *conn, |
|
struct sensing_callback_list *cb_list); |
|
int set_interval(struct sensing_connection *conn, uint32_t interval); |
|
int get_interval(struct sensing_connection *con, uint32_t *sensitivity); |
|
int set_sensitivity(struct sensing_connection *conn, int8_t index, uint32_t interval); |
|
int get_sensitivity(struct sensing_connection *con, int8_t index, uint32_t *sensitivity); |
|
|
|
static inline struct sensing_sensor *get_sensor_by_dev(const struct device *dev) |
|
{ |
|
STRUCT_SECTION_FOREACH(sensing_sensor, sensor) { |
|
if (sensor->dev == dev) { |
|
return sensor; |
|
} |
|
} |
|
|
|
__ASSERT(false, "device %s is not a sensing sensor", dev->name); |
|
|
|
return NULL; |
|
} |
|
|
|
static inline struct sensing_sensor *get_reporter_sensor(struct sensing_sensor *sensor, int index) |
|
{ |
|
if (!sensor || index >= sensor->reporter_num) { |
|
return NULL; |
|
} |
|
|
|
return sensor->conns[index].source; |
|
} |
|
|
|
static inline const struct sensing_sensor_info *get_sensor_info(struct sensing_connection *conn) |
|
{ |
|
__ASSERT(conn, "get sensor info, connection not be NULL"); |
|
|
|
__ASSERT(conn->source, "get sensor info, sensing_sensor is NULL"); |
|
|
|
return conn->source->info; |
|
} |
|
|
|
/* check if client has requested data from reporter */ |
|
static inline bool is_client_request_data(struct sensing_connection *conn) |
|
{ |
|
return conn->interval != 0; |
|
} |
|
|
|
static inline uint64_t get_us(void) |
|
{ |
|
return k_ticks_to_us_floor64(k_uptime_ticks()); |
|
} |
|
|
|
static inline bool is_sensor_state_ready(struct sensing_sensor *sensor) |
|
{ |
|
return (sensor->state == SENSING_SENSOR_STATE_READY); |
|
} |
|
|
|
/* this function is used to decide whether filtering sensitivity checking |
|
* for example: filter sensitivity checking if sensitivity value is 0. |
|
*/ |
|
static inline bool is_filtering_sensitivity(int *sensitivity) |
|
{ |
|
bool filtering = false; |
|
|
|
__ASSERT(sensitivity, "sensitivity should not be NULL"); |
|
for (int i = 0; i < CONFIG_SENSING_MAX_SENSITIVITY_COUNT; i++) { |
|
if (sensitivity[i] != 0) { |
|
filtering = true; |
|
break; |
|
} |
|
} |
|
|
|
return filtering; |
|
} |
|
|
|
/** |
|
* @} |
|
*/ |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /* SENSOR_MGMT_H_ */
|
|
|