1
1
/*
2
- * SPDX-FileCopyrightText: Copyright (c) 2024 Jilay Sandeep Pandya
3
- *
2
+ * SPDX-FileCopyrightText: Copyright (c) 2025 Jilay Sandeep Pandya
4
3
* SPDX-License-Identifier: Apache-2.0
5
4
*/
6
5
@@ -19,6 +18,18 @@ struct k_poll_signal stepper_signal;
19
18
struct k_poll_event stepper_event ;
20
19
void * user_data_received ;
21
20
21
+ #define POLL_AND_CHECK_SIGNAL (signal , event , expected_event , timeout ) \
22
+ ({ \
23
+ do { \
24
+ (void)k_poll(&(event), 1, timeout); \
25
+ unsigned int signaled; \
26
+ int result; \
27
+ k_poll_signal_check(&(signal), &signaled, &result); \
28
+ zassert_equal(signaled, 1, "Signal not set"); \
29
+ zassert_equal(result, (expected_event), "Signal not set"); \
30
+ } while (0); \
31
+ })
32
+
22
33
static void stepper_print_event_callback (const struct device * dev , enum stepper_event event ,
23
34
void * user_data )
24
35
{
@@ -38,12 +49,15 @@ static void stepper_print_event_callback(const struct device *dev, enum stepper_
38
49
case STEPPER_EVENT_STALL_DETECTED :
39
50
k_poll_signal_raise (& stepper_signal , STEPPER_EVENT_STALL_DETECTED );
40
51
break ;
52
+ case STEPPER_EVENT_STOPPED :
53
+ k_poll_signal_raise (& stepper_signal , STEPPER_EVENT_STOPPED );
54
+ break ;
41
55
default :
42
56
break ;
43
57
}
44
58
45
59
LOG_DBG ("Event %d, %s called for %s, expected for %s\n" , event , __func__ ,
46
- dev_callback -> name , dev -> name );
60
+ dev_callback -> name , dev -> name );
47
61
}
48
62
49
63
static void * stepper_setup (void )
@@ -56,7 +70,7 @@ static void *stepper_setup(void)
56
70
k_poll_signal_init (& stepper_signal );
57
71
k_poll_event_init (& stepper_event , K_POLL_TYPE_SIGNAL , K_POLL_MODE_NOTIFY_ONLY ,
58
72
& stepper_signal );
59
- user_data_received = NULL ;
73
+
60
74
zassert_not_null (fixture .dev );
61
75
(void )stepper_enable (fixture .dev , true);
62
76
return & fixture ;
@@ -66,46 +80,89 @@ static void stepper_before(void *f)
66
80
{
67
81
struct stepper_fixture * fixture = f ;
68
82
(void )stepper_set_reference_position (fixture -> dev , 0 );
83
+
69
84
k_poll_signal_reset (& stepper_signal );
85
+
86
+ user_data_received = NULL ;
70
87
}
71
88
72
89
ZTEST_SUITE (stepper , NULL , stepper_setup , stepper_before , NULL , NULL );
73
90
74
- ZTEST_F (stepper , test_micro_step_res )
91
+ ZTEST_F (stepper , test_set_micro_step_res_incorrect )
92
+ {
93
+ int ret = stepper_set_micro_step_res (fixture -> dev , 127 );
94
+
95
+ zassert_equal (ret , - ENOTSUP , "Incorrect micro step resolution should return -ENOTSUP" );
96
+ }
97
+
98
+ ZTEST_F (stepper , test_get_micro_step_res )
75
99
{
76
100
enum stepper_micro_step_resolution res ;
77
101
(void )stepper_get_micro_step_res (fixture -> dev , & res );
78
102
zassert_equal (res , DT_PROP (DT_ALIAS (stepper ), micro_step_res ),
79
103
"Micro step resolution not set correctly" );
80
104
}
81
105
106
+ ZTEST_F (stepper , test_set_micro_step_interval_invalid_zero )
107
+ {
108
+ int err = stepper_set_microstep_interval (fixture -> dev , 0 );
109
+
110
+ zassert_equal (err , - EINVAL , "ustep interval cannot be zero" );
111
+ }
112
+
82
113
ZTEST_F (stepper , test_actual_position )
83
114
{
84
115
int32_t pos = 100u ;
116
+
85
117
(void )stepper_set_reference_position (fixture -> dev , pos );
86
118
(void )stepper_get_actual_position (fixture -> dev , & pos );
87
119
zassert_equal (pos , 100u , "Actual position not set correctly" );
88
120
}
89
121
90
- ZTEST_F (stepper , test_target_position )
122
+ ZTEST_F (stepper , test_target_position_w_fixed_step_interval )
91
123
{
92
- int32_t pos = 100u ;
124
+ int32_t pos = 10u ;
93
125
94
- (void )stepper_set_microstep_interval (fixture -> dev , 10000 );
126
+ (void )stepper_set_microstep_interval (fixture -> dev , 100 * USEC_PER_SEC );
95
127
96
128
/* Pass the function name as user data */
97
129
(void )stepper_set_event_callback (fixture -> dev , fixture -> callback , (void * )fixture -> dev );
98
130
99
131
(void )stepper_move_to (fixture -> dev , pos );
100
132
101
- ( void ) k_poll ( & stepper_event , 1 , K_SECONDS ( 5 ));
102
- unsigned int signaled ;
103
- int result ;
133
+ /* timeout is set with 20% tolerance */
134
+ POLL_AND_CHECK_SIGNAL ( stepper_signal , stepper_event , STEPPER_EVENT_STEPS_COMPLETED ,
135
+ K_MSEC ( pos * 120 )) ;
104
136
105
- k_poll_signal_check (& stepper_signal , & signaled , & result );
106
- zassert_equal (signaled , 1 , "Signal not set" );
107
- zassert_equal (result , STEPPER_EVENT_STEPS_COMPLETED , "Signal not set" );
108
137
(void )stepper_get_actual_position (fixture -> dev , & pos );
109
- zassert_equal (pos , 100u , "Target position should be %d but is %d" , 100u , pos );
138
+ zassert_equal (pos , 10u , "Target position should be %d but is %d" , 10u , pos );
110
139
zassert_equal (user_data_received , fixture -> dev , "User data not received" );
111
140
}
141
+
142
+ ZTEST_F (stepper , test_stop )
143
+ {
144
+ (void )stepper_set_event_callback (fixture -> dev , fixture -> callback , (void * )fixture -> dev );
145
+
146
+ /* Run the stepper in positive direction */
147
+ (void )stepper_run (fixture -> dev , STEPPER_DIRECTION_POSITIVE );
148
+
149
+ /* Stop the stepper */
150
+ int ret = stepper_stop (fixture -> dev );
151
+ bool is_moving ;
152
+
153
+ if (ret == 0 ) {
154
+ POLL_AND_CHECK_SIGNAL (stepper_signal , stepper_event , STEPPER_EVENT_STOPPED ,
155
+ K_NO_WAIT );
156
+ zassert_equal (user_data_received , fixture -> dev , "User data not received" );
157
+
158
+ /* Check if the stepper is stopped */
159
+ stepper_is_moving (fixture -> dev , & is_moving );
160
+ zassert_equal (is_moving , false, "Stepper is still moving" );
161
+ } else if (ret == - ENOSYS ) {
162
+ stepper_is_moving (fixture -> dev , & is_moving );
163
+ zassert_equal (is_moving , true,
164
+ "Stepper should be moving since stop is not implemented" );
165
+ } else {
166
+ zassert_unreachable ("Stepper stop failed" );
167
+ }
168
+ }
0 commit comments