tests: drivers: sensor: add hc-sr04 tests
Add automated build and functional tests for the HC-SR04. Signed-off-by: Adrien Leravat <adrien.leravat@gmail.com>
This commit is contained in:
parent
9df661ea1a
commit
1d6a89d26e
6 changed files with 188 additions and 0 deletions
|
@ -17,3 +17,9 @@ test_gpio_dht22: dht22 {
|
|||
dio-gpios = <&test_gpio 0 0>;
|
||||
/* dht22; */
|
||||
};
|
||||
|
||||
test_gpio_hcsr04: hcsr04 {
|
||||
compatible = "hc-sr04";
|
||||
trigger-gpios = <&test_gpio 0 0>;
|
||||
echo-gpios = <&test_gpio 1 0>;
|
||||
};
|
||||
|
|
8
tests/drivers/sensor/hc-sr04/CMakeLists.txt
Normal file
8
tests/drivers/sensor/hc-sr04/CMakeLists.txt
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2024 Adrien Leravat
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
cmake_minimum_required(VERSION 3.20.0)
|
||||
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
||||
project(device)
|
||||
|
||||
target_sources(app PRIVATE src/main.c)
|
11
tests/drivers/sensor/hc-sr04/boards/native_sim.overlay
Normal file
11
tests/drivers/sensor/hc-sr04/boards/native_sim.overlay
Normal file
|
@ -0,0 +1,11 @@
|
|||
/* Copyright (c) 2024 Adrien Leravat
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
/ {
|
||||
hc_sr04: hc_sr04 {
|
||||
compatible = "hc-sr04";
|
||||
trigger-gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>;
|
||||
echo-gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
13
tests/drivers/sensor/hc-sr04/prj.conf
Normal file
13
tests/drivers/sensor/hc-sr04/prj.conf
Normal file
|
@ -0,0 +1,13 @@
|
|||
# Copyright (c) 2024 Adrien Leravat
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
CONFIG_ZTEST=y
|
||||
|
||||
# Set log levels
|
||||
CONFIG_SENSOR_LOG_LEVEL_WRN=y
|
||||
|
||||
# Enable sensors
|
||||
CONFIG_SENSOR=y
|
||||
|
||||
# Enable GPIO
|
||||
CONFIG_GPIO=y
|
139
tests/drivers/sensor/hc-sr04/src/main.c
Normal file
139
tests/drivers/sensor/hc-sr04/src/main.c
Normal file
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* Copyright (c) 2024 Adrien Leravat
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <zephyr/devicetree.h>
|
||||
#include <zephyr/drivers/gpio.h>
|
||||
#include <zephyr/drivers/gpio/gpio_emul.h>
|
||||
#include <zephyr/drivers/sensor.h>
|
||||
#include <zephyr/ztest.h>
|
||||
|
||||
#if DT_NODE_HAS_STATUS(DT_INST(0, hc_sr04), okay)
|
||||
#define HC_SR04 DT_NODELABEL(hc_sr04)
|
||||
#define HC_SR04_GPIO_OUT DT_GPIO_CTLR(DT_INST(0, hc_sr04), trigger_gpios)
|
||||
#define HC_SR04_PIN_OUT DT_GPIO_PIN(DT_INST(0, hc_sr04), trigger_gpios)
|
||||
#define HC_SR04_GPIO_IN DT_GPIO_CTLR(DT_INST(0, hc_sr04), echo_gpios)
|
||||
#define HC_SR04_PIN_IN DT_GPIO_PIN(DT_INST(0, hc_sr04), echo_gpios)
|
||||
#else
|
||||
#error "HC-SR04 not enabled"
|
||||
#endif
|
||||
|
||||
#define TEST_MEASURED_VALUE(fixture, value, duration_us, value1, value2) \
|
||||
fixture->emul.echo_duration_us = duration_us; \
|
||||
zassert_false(sensor_sample_fetch(fixture->dev), "sensor_sample_fetch failed"); \
|
||||
zassert_false(sensor_channel_get(fixture->dev, SENSOR_CHAN_DISTANCE, &value), \
|
||||
"sensor_channel_get failed"); \
|
||||
zassert_equal(value.val1, value1, "incorrect measurement for value.val1"); \
|
||||
zassert_within(value.val2, value2, 10000, "incorrect measurement for value.val2"); \
|
||||
|
||||
struct hcsr04_emul {
|
||||
bool fail_echo;
|
||||
uint32_t echo_duration_us;
|
||||
struct gpio_callback cb;
|
||||
};
|
||||
|
||||
struct hcsr04_fixture {
|
||||
const struct device *dev;
|
||||
struct hcsr04_emul emul;
|
||||
};
|
||||
|
||||
static void gpio_emul_callback_handler(const struct device *port,
|
||||
struct gpio_callback *cb,
|
||||
gpio_port_pins_t pins);
|
||||
|
||||
static void *hcsr04_setup(void)
|
||||
{
|
||||
static struct hcsr04_fixture fixture = {
|
||||
.dev = DEVICE_DT_GET(HC_SR04),
|
||||
.emul = {
|
||||
.fail_echo = false,
|
||||
.echo_duration_us = 0
|
||||
}
|
||||
};
|
||||
const struct device *gpio_dev = DEVICE_DT_GET(HC_SR04_GPIO_IN);
|
||||
|
||||
zassert_not_null(fixture.dev);
|
||||
zassert_not_null(gpio_dev);
|
||||
zassert_true(device_is_ready(fixture.dev));
|
||||
zassert_equal(DEVICE_DT_GET(HC_SR04_GPIO_IN), DEVICE_DT_GET(HC_SR04_GPIO_OUT),
|
||||
"Input and output GPIO devices must the same");
|
||||
|
||||
zassert_true(device_is_ready(gpio_dev), "GPIO dev is not ready");
|
||||
|
||||
gpio_init_callback(&fixture.emul.cb, &gpio_emul_callback_handler, BIT(HC_SR04_PIN_OUT));
|
||||
zassert_false(gpio_add_callback(gpio_dev, &fixture.emul.cb),
|
||||
"Failed to add emulation callback");
|
||||
|
||||
return &fixture;
|
||||
}
|
||||
|
||||
static void hcsr04_before(void *f)
|
||||
{
|
||||
struct hcsr04_fixture *fixture = f;
|
||||
|
||||
fixture->emul.fail_echo = false;
|
||||
}
|
||||
|
||||
static void gpio_emul_callback_handler(const struct device *port,
|
||||
struct gpio_callback *cb,
|
||||
gpio_port_pins_t pins)
|
||||
{
|
||||
const struct hcsr04_emul *emul = CONTAINER_OF(cb, struct hcsr04_emul, cb);
|
||||
|
||||
if (emul->fail_echo) {
|
||||
return;
|
||||
}
|
||||
if (gpio_emul_output_get(port, HC_SR04_PIN_OUT) == 1) {
|
||||
/* Ignore rising edge */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Output high-level on echo pin */
|
||||
gpio_emul_input_set(port, HC_SR04_PIN_IN, 1);
|
||||
k_busy_wait(emul->echo_duration_us);
|
||||
gpio_emul_input_set(port, HC_SR04_PIN_IN, 0);
|
||||
}
|
||||
|
||||
ZTEST_SUITE(hcsr04, NULL, hcsr04_setup, hcsr04_before, NULL, NULL);
|
||||
|
||||
ZTEST_USER_F(hcsr04, test_sample_fetch_fail_no_echo)
|
||||
{
|
||||
int ret;
|
||||
|
||||
fixture->emul.fail_echo = true;
|
||||
|
||||
ret = sensor_sample_fetch(fixture->dev);
|
||||
zassert_equal(-EIO, ret, "sensor_sample_fetch unexpected return code %d", ret);
|
||||
}
|
||||
|
||||
ZTEST_USER_F(hcsr04, test_sample_fetch)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = sensor_sample_fetch(fixture->dev);
|
||||
zassert_equal(0, ret, "sensor_sample_fetch unexpected return code %d", ret);
|
||||
}
|
||||
|
||||
ZTEST_USER_F(hcsr04, test_channel_get_fails_with_wrong_channel)
|
||||
{
|
||||
int ret;
|
||||
struct sensor_value value;
|
||||
|
||||
ret = sensor_channel_get(fixture->dev, SENSOR_CHAN_ACCEL_X, &value);
|
||||
zassert_equal(-ENOTSUP, ret, "sensor_channel_get returned unexpected code with %d", ret);
|
||||
}
|
||||
|
||||
ZTEST_USER_F(hcsr04, test_channel_get_at_10cm)
|
||||
{
|
||||
struct sensor_value value;
|
||||
|
||||
TEST_MEASURED_VALUE(fixture, value, 583, 0, 100000);
|
||||
}
|
||||
|
||||
ZTEST_USER_F(hcsr04, test_channel_get_at_150cm)
|
||||
{
|
||||
struct sensor_value value;
|
||||
|
||||
TEST_MEASURED_VALUE(fixture, value, 8745, 1, 500000);
|
||||
}
|
11
tests/drivers/sensor/hc-sr04/testcase.yaml
Normal file
11
tests/drivers/sensor/hc-sr04/testcase.yaml
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Copyright (c) 2024 Adrien Leravat
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
tests:
|
||||
drivers.sensor.hc-sr04:
|
||||
tags:
|
||||
- drivers
|
||||
- sensor
|
||||
- subsys
|
||||
platform_allow:
|
||||
- native_sim
|
Loading…
Add table
Add a link
Reference in a new issue