From 271aeaf5f986bbd656d77a44fe28e25ee7cf0520 Mon Sep 17 00:00:00 2001 From: Jilay Pandya Date: Sat, 19 Oct 2024 14:53:00 +0200 Subject: [PATCH] tests: drivers: stepper: stepper_api: test cb user_data This commit does the following: 1. tests set_callback and user_data 2. fixes the api as well as the drivers by passing user_data back to the set callback Signed-off-by: Jilay Pandya --- drivers/stepper/adi_tmc/CMakeLists.txt | 2 ++ .../adi_tmc/adi_tmc5041_stepper_controller.c | 2 +- drivers/stepper/gpio_stepper_controller.c | 6 +++--- drivers/stepper/stepper_shell.c | 17 ++++++++++------- include/zephyr/drivers/stepper.h | 3 ++- tests/drivers/stepper/stepper_api/src/main.c | 14 +++++++++++--- 6 files changed, 29 insertions(+), 15 deletions(-) diff --git a/drivers/stepper/adi_tmc/CMakeLists.txt b/drivers/stepper/adi_tmc/CMakeLists.txt index a972c9b54dc..a261deef908 100644 --- a/drivers/stepper/adi_tmc/CMakeLists.txt +++ b/drivers/stepper/adi_tmc/CMakeLists.txt @@ -2,5 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 zephyr_library() +zephyr_library_property(ALLOW_EMPTY TRUE) + zephyr_library_sources_ifdef(CONFIG_STEPPER_ADI_TMC_SPI adi_tmc_spi.c) zephyr_library_sources_ifdef(CONFIG_STEPPER_ADI_TMC5041 adi_tmc5041_stepper_controller.c) diff --git a/drivers/stepper/adi_tmc/adi_tmc5041_stepper_controller.c b/drivers/stepper/adi_tmc/adi_tmc5041_stepper_controller.c index 2967fe4dfc9..bd9857b95cf 100644 --- a/drivers/stepper/adi_tmc/adi_tmc5041_stepper_controller.c +++ b/drivers/stepper/adi_tmc/adi_tmc5041_stepper_controller.c @@ -185,7 +185,7 @@ static void execute_callback(const struct device *dev, const enum stepper_event LOG_WRN_ONCE("No callback registered"); return; } - data->callback(dev, event); + data->callback(dev, event, data->event_cb_user_data); } static void rampstat_work_handler(struct k_work *work) diff --git a/drivers/stepper/gpio_stepper_controller.c b/drivers/stepper/gpio_stepper_controller.c index a26f9c0a8a7..fc68d551295 100644 --- a/drivers/stepper/gpio_stepper_controller.c +++ b/drivers/stepper/gpio_stepper_controller.c @@ -9,9 +9,9 @@ #include #include #include -#include #include +#include LOG_MODULE_REGISTER(gpio_stepper_motor_controller, CONFIG_STEPPER_LOG_LEVEL); #define MAX_MICRO_STEP_RES STEPPER_MICRO_STEP_2 @@ -34,10 +34,10 @@ struct gpio_stepper_data { uint8_t step_gap; uint8_t coil_charge; struct k_work_delayable stepper_dwork; - stepper_event_callback_t callback; int32_t actual_position; uint32_t delay_in_us; int32_t step_count; + stepper_event_callback_t callback; void *event_cb_user_data; }; @@ -84,7 +84,7 @@ static void update_remaining_steps(struct gpio_stepper_data *data) LOG_WRN_ONCE("No callback set"); return; } - data->callback(data->dev, STEPPER_EVENT_STEPS_COMPLETED); + data->callback(data->dev, STEPPER_EVENT_STEPS_COMPLETED, data->event_cb_user_data); } } diff --git a/drivers/stepper/stepper_shell.c b/drivers/stepper/stepper_shell.c index 05c5bd83c33..3f9d0523294 100644 --- a/drivers/stepper/stepper_shell.c +++ b/drivers/stepper/stepper_shell.c @@ -40,23 +40,26 @@ struct stepper_direction_map { .microstep = _microstep, \ } -static void print_callback(const struct device *dev, const enum stepper_event event) +static void print_callback(const struct device *dev, const enum stepper_event event, + void *user_data) { + const struct shell *sh = user_data; + switch (event) { case STEPPER_EVENT_STEPS_COMPLETED: - LOG_INF("%s: Steps completed.", dev->name); + shell_info(sh, "%s: Steps completed.", dev->name); break; case STEPPER_EVENT_STALL_DETECTED: - LOG_INF("%s: Stall detected.", dev->name); + shell_info(sh, "%s: Stall detected.", dev->name); break; case STEPPER_EVENT_LEFT_END_STOP_DETECTED: - LOG_INF("%s: Left limit switch pressed.", dev->name); + shell_info(sh, "%s: Left limit switch pressed.", dev->name); break; case STEPPER_EVENT_RIGHT_END_STOP_DETECTED: - LOG_INF("%s: Right limit switch pressed.", dev->name); + shell_info(sh, "%s: Right limit switch pressed.", dev->name); break; default: - LOG_INF("%s: Unknown signal received.", dev->name); + shell_info(sh, "%s: Unknown signal received.", dev->name); break; } } @@ -200,7 +203,7 @@ static int cmd_stepper_move(const struct shell *sh, size_t argc, char **argv) return err; } - err = stepper_set_callback(dev, print_callback, NULL); + err = stepper_set_callback(dev, print_callback, (void *)sh); if (err != 0) { shell_error(sh, "Failed to set callback: %d", err); } diff --git a/include/zephyr/drivers/stepper.h b/include/zephyr/drivers/stepper.h index cf584a0114f..39171513aa8 100644 --- a/include/zephyr/drivers/stepper.h +++ b/include/zephyr/drivers/stepper.h @@ -174,7 +174,8 @@ typedef int (*stepper_enable_constant_velocity_mode_t)(const struct device *dev, /** * @brief Callback function for stepper events */ -typedef void (*stepper_event_callback_t)(const struct device *dev, const enum stepper_event event); +typedef void (*stepper_event_callback_t)(const struct device *dev, const enum stepper_event event, + void *user_data); /** * @brief Set the callback function to be called when a stepper event occurs diff --git a/tests/drivers/stepper/stepper_api/src/main.c b/tests/drivers/stepper/stepper_api/src/main.c index b9daa13cff6..8aaf468c0e1 100644 --- a/tests/drivers/stepper/stepper_api/src/main.c +++ b/tests/drivers/stepper/stepper_api/src/main.c @@ -14,9 +14,12 @@ struct stepper_fixture { struct k_poll_signal stepper_signal; struct k_poll_event stepper_event; +void *user_data_received; -static void stepper_print_event_callback(const struct device *dev, enum stepper_event event) +static void stepper_print_event_callback(const struct device *dev, enum stepper_event event, + void *user_data) { + user_data_received = user_data; switch (event) { case STEPPER_EVENT_STEPS_COMPLETED: k_poll_signal_raise(&stepper_signal, STEPPER_EVENT_STEPS_COMPLETED); @@ -45,7 +48,7 @@ static void *stepper_setup(void) k_poll_signal_init(&stepper_signal); k_poll_event_init(&stepper_event, K_POLL_TYPE_SIGNAL, K_POLL_MODE_NOTIFY_ONLY, &stepper_signal); - + user_data_received = NULL; zassert_not_null(fixture.dev); return &fixture; } @@ -80,8 +83,12 @@ ZTEST_F(stepper, test_target_position) int32_t pos = 100u; (void)stepper_set_max_velocity(fixture->dev, 100u); - (void)stepper_set_callback(fixture->dev, fixture->callback, NULL); + + /* Pass the function name as user data */ + (void)stepper_set_callback(fixture->dev, fixture->callback, &fixture); + (void)stepper_set_target_position(fixture->dev, pos); + (void)k_poll(&stepper_event, 1, K_SECONDS(5)); unsigned int signaled; int result; @@ -91,4 +98,5 @@ ZTEST_F(stepper, test_target_position) zassert_equal(result, STEPPER_EVENT_STEPS_COMPLETED, "Signal not set"); (void)stepper_get_actual_position(fixture->dev, &pos); zassert_equal(pos, 100u, "Target position should be %d but is %d", 100u, pos); + zassert_equal(user_data_received, &fixture, "User data not received"); }