Skip to content

Commit 3314473

Browse files
jilaypandyakartben
authored andcommitted
drivers: stepper: move_by(dev,0) shall return steps_completed
move_by(dev,0) shall stop the timing source and trigger STEPPER_EVENT_STEPS_COMPLETED event Signed-off-by: Jilay Pandya <[email protected]>
1 parent ad39866 commit 3314473

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

drivers/stepper/h_bridge_stepper.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,15 @@ static int h_bridge_stepper_move_by(const struct device *dev, int32_t micro_step
189189
LOG_ERR("Step interval not set or invalid step interval set");
190190
return -EINVAL;
191191
}
192+
193+
if (micro_steps == 0) {
194+
if (data->callback) {
195+
data->callback(data->dev, STEPPER_EVENT_STEPS_COMPLETED,
196+
data->event_cb_user_data);
197+
}
198+
(void)k_work_cancel_delayable(&data->stepper_dwork);
199+
return 0;
200+
}
192201
K_SPINLOCK(&data->lock) {
193202
data->run_mode = STEPPER_RUN_MODE_POSITION;
194203
data->step_count = micro_steps;

drivers/stepper/step_dir/step_dir_stepper_common.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,12 @@ int step_dir_stepper_common_move_by(const struct device *dev, const int32_t micr
243243
return -EINVAL;
244244
}
245245

246+
if (micro_steps == 0) {
247+
stepper_trigger_callback(data->dev, STEPPER_EVENT_STEPS_COMPLETED);
248+
config->timing_source->stop(dev);
249+
return 0;
250+
}
251+
246252
K_SPINLOCK(&data->lock) {
247253
data->run_mode = STEPPER_RUN_MODE_POSITION;
248254
data->step_count = micro_steps;

tests/drivers/stepper/stepper_api/src/main.c

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ static void *stepper_setup(void)
7272
&stepper_signal);
7373

7474
zassert_not_null(fixture.dev);
75+
zassert_equal(
76+
stepper_set_event_callback(fixture.dev, fixture.callback, (void *)fixture.dev), 0,
77+
"Failed to set event callback");
7578
(void)stepper_enable(fixture.dev);
7679
return &fixture;
7780
}
@@ -131,12 +134,9 @@ ZTEST_F(stepper, test_target_position_w_fixed_step_interval)
131134
int ret;
132135

133136
ret = stepper_set_microstep_interval(fixture->dev, 100 * USEC_PER_SEC);
134-
135137
if (ret == -ENOSYS) {
136138
ztest_test_skip();
137139
}
138-
/* Pass the function name as user data */
139-
(void)stepper_set_event_callback(fixture->dev, fixture->callback, (void *)fixture->dev);
140140

141141
(void)stepper_move_to(fixture->dev, pos);
142142

@@ -154,7 +154,6 @@ ZTEST_F(stepper, test_move_by_positive_step_count)
154154
int32_t steps = 20;
155155

156156
(void)stepper_set_microstep_interval(fixture->dev, 100 * USEC_PER_SEC);
157-
(void)stepper_set_event_callback(fixture->dev, fixture->callback, (void *)fixture->dev);
158157
(void)stepper_move_by(fixture->dev, steps);
159158

160159
POLL_AND_CHECK_SIGNAL(
@@ -169,7 +168,6 @@ ZTEST_F(stepper, test_move_by_negative_step_count)
169168
int32_t steps = -20;
170169

171170
(void)stepper_set_microstep_interval(fixture->dev, 100 * USEC_PER_SEC);
172-
(void)stepper_set_event_callback(fixture->dev, fixture->callback, (void *)fixture->dev);
173171
(void)stepper_move_by(fixture->dev, steps);
174172

175173
POLL_AND_CHECK_SIGNAL(
@@ -181,8 +179,6 @@ ZTEST_F(stepper, test_move_by_negative_step_count)
181179

182180
ZTEST_F(stepper, test_stop)
183181
{
184-
(void)stepper_set_event_callback(fixture->dev, fixture->callback, (void *)fixture->dev);
185-
186182
/* Run the stepper in positive direction */
187183
(void)stepper_run(fixture->dev, STEPPER_DIRECTION_POSITIVE);
188184

@@ -206,3 +202,22 @@ ZTEST_F(stepper, test_stop)
206202
zassert_unreachable("Stepper stop failed");
207203
}
208204
}
205+
206+
ZTEST_F(stepper, test_move_by_zero_steps)
207+
{
208+
bool is_moving;
209+
int err;
210+
211+
err = stepper_set_microstep_interval(fixture->dev, 100 * USEC_PER_SEC);
212+
if (err == -ENOSYS) {
213+
ztest_test_skip();
214+
}
215+
zassert_equal(err, 0, "Failed to set microstep interval");
216+
217+
zassert_equal(stepper_move_by(fixture->dev, 0), 0, "Failed to move by zero steps");
218+
POLL_AND_CHECK_SIGNAL(stepper_signal, stepper_event, STEPPER_EVENT_STEPS_COMPLETED,
219+
K_NO_WAIT);
220+
zassert_equal(stepper_is_moving(fixture->dev, &is_moving), 0,
221+
"Failed to check if stepper is moving");
222+
zassert_equal(is_moving, false, "Stepper is still moving");
223+
}

0 commit comments

Comments
 (0)