Verify sensor reading - should be within room temperature limits. Signed-off-by: Piotr Kosycarz <piotr.kosycarz@nordicsemi.no>
154 lines
3.8 KiB
C
154 lines
3.8 KiB
C
/*
|
|
* Copyright (c) 2024, Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/ztest.h>
|
|
#include <zephyr/device.h>
|
|
#include <zephyr/drivers/sensor.h>
|
|
|
|
static const struct device *temp_dev = DEVICE_DT_GET(DT_NODELABEL(temp_sensor));
|
|
static enum sensor_channel chan_to_use; /* this is filled by before() */
|
|
|
|
static volatile bool trigger_handler_called;
|
|
|
|
ZTEST(temp_sensor, test_polling)
|
|
{
|
|
int rc;
|
|
int cnt;
|
|
struct sensor_value val;
|
|
|
|
cnt = 0;
|
|
while (1) {
|
|
int32_t temp_val;
|
|
|
|
rc = sensor_sample_fetch_chan(temp_dev, chan_to_use);
|
|
zassert_ok(rc, "Cannot fetch chan sample: %d.", rc);
|
|
|
|
rc = sensor_channel_get(temp_dev, chan_to_use, &val);
|
|
zassert_ok(rc, "Cannot read from channel %d: %d.",
|
|
chan_to_use, rc);
|
|
|
|
temp_val = (val.val1 * 100) + (val.val2 / 10000);
|
|
TC_PRINT("Temperature: %d.%02u\n",
|
|
temp_val/100, abs(temp_val) % 100);
|
|
|
|
zassert_true(val.val1 > 10, "Too cold");
|
|
zassert_true(val.val1 < 35, "Too hot");
|
|
|
|
++cnt;
|
|
if (cnt >= 5) {
|
|
break;
|
|
}
|
|
|
|
k_sleep(K_MSEC(500));
|
|
}
|
|
}
|
|
|
|
static void trigger_handler(const struct device *temp_dev,
|
|
const struct sensor_trigger *trig)
|
|
{
|
|
ARG_UNUSED(temp_dev);
|
|
ARG_UNUSED(trig);
|
|
|
|
trigger_handler_called = true;
|
|
}
|
|
|
|
ZTEST(temp_sensor, test_trigger)
|
|
{
|
|
int rc;
|
|
struct sensor_value val;
|
|
struct sensor_trigger trig = { .type = SENSOR_TRIG_THRESHOLD,
|
|
.chan = chan_to_use };
|
|
|
|
/* Check if the sensor allows setting a threshold trigger.
|
|
* If not, skip the test.
|
|
*/
|
|
rc = sensor_trigger_set(temp_dev, &trig, NULL);
|
|
if (rc == -ENOSYS || rc == -ENOTSUP) {
|
|
TC_PRINT("This sensor does not support threshold trigger.\n");
|
|
ztest_test_skip();
|
|
}
|
|
|
|
rc = sensor_channel_get(temp_dev, chan_to_use, &val);
|
|
zassert_ok(rc, "Cannot read from channel %d: %d.",
|
|
chan_to_use, rc);
|
|
|
|
/* Set the upper threshold somewhat below the temperature read above. */
|
|
val.val1 -= 5;
|
|
rc = sensor_attr_set(temp_dev, chan_to_use,
|
|
SENSOR_ATTR_UPPER_THRESH, &val);
|
|
zassert_ok(rc, "Cannot set upper threshold: %d.", rc);
|
|
|
|
/* And the lower threshold below the upper one. */
|
|
val.val1 -= 1;
|
|
rc = sensor_attr_set(temp_dev, chan_to_use,
|
|
SENSOR_ATTR_LOWER_THRESH, &val);
|
|
zassert_ok(rc, "Cannot set lower threshold: %d.", rc);
|
|
|
|
/* Set sampling frequency to 10 Hz, to expect a trigger after 100 ms. */
|
|
val.val1 = 10;
|
|
val.val2 = 0;
|
|
rc = sensor_attr_set(temp_dev, chan_to_use,
|
|
SENSOR_ATTR_SAMPLING_FREQUENCY, &val);
|
|
zassert_ok(rc, "Cannot set sampling frequency: %d.", rc);
|
|
|
|
trigger_handler_called = false;
|
|
|
|
rc = sensor_trigger_set(temp_dev, &trig, trigger_handler);
|
|
zassert_ok(rc, "Cannot enable the trigger: %d.", rc);
|
|
|
|
k_sleep(K_MSEC(300));
|
|
zassert_true(trigger_handler_called);
|
|
|
|
rc = sensor_trigger_set(temp_dev, &trig, NULL);
|
|
zassert_ok(rc, "Cannot disable the trigger: %d.", rc);
|
|
|
|
trigger_handler_called = false;
|
|
|
|
k_sleep(K_MSEC(300));
|
|
zassert_false(trigger_handler_called);
|
|
}
|
|
|
|
static void before(void *fixture)
|
|
{
|
|
ARG_UNUSED(fixture);
|
|
|
|
int rc;
|
|
int cnt;
|
|
struct sensor_value val;
|
|
|
|
zassert_true(device_is_ready(temp_dev),
|
|
"Device %s is not ready.", temp_dev->name);
|
|
|
|
cnt = 0;
|
|
/* Try to fetch a sample to check if the sensor is ready to work.
|
|
* Try several times if it appears to be needing a while for some
|
|
* initialization of communication etc.
|
|
*/
|
|
while (1) {
|
|
rc = sensor_sample_fetch(temp_dev);
|
|
if (rc != -EAGAIN && rc != -ENOTCONN) {
|
|
break;
|
|
}
|
|
|
|
++cnt;
|
|
zassert_false(cnt >= 3, "Cannot fetch a sample: %d.", rc);
|
|
|
|
k_sleep(K_MSEC(1000));
|
|
}
|
|
zassert_ok(rc, "Cannot fetch a sample: %d.", rc);
|
|
|
|
/* Check if the sensor provides the die temperature.
|
|
* If not, switch to the ambient one.
|
|
*/
|
|
chan_to_use = SENSOR_CHAN_DIE_TEMP;
|
|
rc = sensor_channel_get(temp_dev, chan_to_use, &val);
|
|
if (rc == -ENOTSUP) {
|
|
chan_to_use = SENSOR_CHAN_AMBIENT_TEMP;
|
|
}
|
|
}
|
|
|
|
ZTEST_SUITE(temp_sensor, NULL, NULL, before, NULL, NULL);
|