blob: e4bb4cee129baf4b2fecd47605b0268677f9280e [file] [log] [blame]
/*
* Copyright (c) 2020 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @defgroup driver_sensor_subsys_tests sensor_subsys
* @ingroup all_tests
* @{
* @}
*/
#include <ztest.h>
#include "dummy_sensor.h"
K_SEM_DEFINE(sem, 0, 1);
#define RETURN_SUCCESS (0)
struct channel_sequence {
enum sensor_channel chan;
struct sensor_value data;
};
struct trigger_sequence {
struct sensor_trigger trig;
struct sensor_value data;
enum sensor_attribute attr;
};
static struct channel_sequence chan_elements[] = {
{ SENSOR_CHAN_LIGHT, { 0, 0 } },
{ SENSOR_CHAN_RED, { 1, 1 } },
{ SENSOR_CHAN_GREEN, { 2, 4 } },
{ SENSOR_CHAN_BLUE, { 3, 9 } },
{ SENSOR_CHAN_PROX, { 4, 16 } }
};
static struct trigger_sequence trigger_elements[] = {
/* trigger for SENSOR_TRIG_THRESHOLD */
{ {SENSOR_TRIG_THRESHOLD, SENSOR_CHAN_PROX},
{ 127, 0 }, SENSOR_ATTR_UPPER_THRESH },
/* trigger for SENSOR_TRIG_TIMER */
{ {SENSOR_TRIG_TIMER, SENSOR_CHAN_PROX},
{ 130, 127 }, SENSOR_ATTR_UPPER_THRESH },
/* trigger for SENSOR_TRIG_DATA_READY */
{ {SENSOR_TRIG_DATA_READY, SENSOR_CHAN_PROX},
{ 150, 130 }, SENSOR_ATTR_UPPER_THRESH },
/* trigger for SENSOR_TRIG_DELTA */
{ {SENSOR_TRIG_DELTA, SENSOR_CHAN_PROX},
{ 180, 150 }, SENSOR_ATTR_UPPER_THRESH },
/* trigger for SENSOR_TRIG_NEAR_FAR */
{ {SENSOR_TRIG_NEAR_FAR, SENSOR_CHAN_PROX},
{ 155, 180 }, SENSOR_ATTR_UPPER_THRESH }
};
#define TOTAL_CHAN_ELEMENTS (sizeof(chan_elements) / \
sizeof(struct channel_sequence))
#define TOTAL_TRIG_ELEMENTS (sizeof(trigger_elements) / \
sizeof(struct trigger_sequence))
/**
* @brief Test get multiple channels values.
*
* @details
* - get multiple channels values consistently in two operations:
* fetch sample and get the values of each channel individually.
* - check the results with sensor_value type avoids use of
* floating point values
*
* @ingroup driver_sensor_subsys_tests
*
* @see sensor_sample_fetch(). sensor_channel_get()
*/
void test_sensor_get_channels(void)
{
const struct device *dev;
struct sensor_value data;
dev = device_get_binding(DUMMY_SENSOR_NAME);
zassert_not_null(dev, "failed: dev is null.");
zassert_equal(sensor_sample_fetch(dev), RETURN_SUCCESS,
"fail to fetch sample.");
/* Get and check channels value. */
for (int i = 0; i < TOTAL_CHAN_ELEMENTS; i++) {
zassert_equal(sensor_channel_get(dev, chan_elements[i].chan,
&data), RETURN_SUCCESS, "fail to get channel.");
zassert_equal(data.val1, chan_elements[i].data.val1,
"the data is not match.");
zassert_equal(data.val2, chan_elements[i].data.val2,
"the data is not match.");
}
}
static void trigger_handler(const struct device *dev,
struct sensor_trigger *trigger)
{
ARG_UNUSED(dev);
ARG_UNUSED(trigger);
k_sem_give(&sem);
}
/**
* @brief Test sensor multiple triggers
*
* @details
* - set multiple triggers for dummy sensor
* - Handle different types of triggers, based on time, data,threshold,
* based on a delta value, near/far events and single/double tap.
* - Configuration of runtime parameters in a sensor,
* for example threshold values for interrupts.
*
* @ingroup driver_sensor_subsys_tests
*
* @see sensor_attr_set(). sensor_trigger_set()
*/
void test_sensor_handle_triggers(void)
{
const struct device *dev;
struct sensor_value data;
dev = device_get_binding(DUMMY_SENSOR_NAME);
zassert_not_null(dev, "failed: dev is null.");
zassert_equal(sensor_sample_fetch(dev), RETURN_SUCCESS,
"fail to fetch sample.");
/* setup multiple triggers */
for (int i = 0; i < TOTAL_TRIG_ELEMENTS; i++) {
/* set attributes for trigger */
zassert_equal(sensor_attr_set(dev,
trigger_elements[i].trig.chan,
trigger_elements[i].attr,
&trigger_elements[i].data),
RETURN_SUCCESS, "fail to set attributes");
/* read-back attributes for trigger */
zassert_equal(sensor_attr_get(dev,
trigger_elements[i].trig.chan,
trigger_elements[i].attr,
&data),
RETURN_SUCCESS, "fail to get attributes");
zassert_equal(trigger_elements[i].data.val1,
data.val1, "read-back returned wrong val1");
zassert_equal(trigger_elements[i].data.val2,
data.val2, "read-back returned wrong val2");
/* setting a sensor’s trigger and handler */
zassert_equal(sensor_trigger_set(dev,
&trigger_elements[i].trig,
trigger_handler),
RETURN_SUCCESS, "fail to set trigger");
/* get channels value after trigger fired */
k_sem_take(&sem, K_FOREVER);
zassert_equal(sensor_channel_get(dev,
trigger_elements[i].trig.chan,
&data), RETURN_SUCCESS, "fail to get channel.");
/* check the result of the trigger channel */
zassert_equal(data.val1, trigger_elements[i].data.val1,
"retrived data is not match.");
zassert_equal(data.val2, trigger_elements[i].data.val2,
"retrived data is not match.");
}
}
/*test case main entry*/
void test_main(void)
{
ztest_test_suite(test_sensor_api,
ztest_1cpu_unit_test(test_sensor_get_channels),
ztest_1cpu_unit_test(test_sensor_handle_triggers));
ztest_run_test_suite(test_sensor_api);
}