@@ -95,6 +95,7 @@ struct status_input {
95
95
bool input_source_ethernet ;
96
96
bool input_source_radio_control ;
97
97
bool topic_timeout ;
98
+ bool cmd_vel_timeout ;
98
99
bool topic_status_loss ;
99
100
100
101
// derived booleans
@@ -126,6 +127,8 @@ struct context {
126
127
struct k_thread thread_data ;
127
128
int64_t now_ticks ;
128
129
int64_t input_last_ticks ;
130
+ int64_t cmd_vel_last_ticks ;
131
+ const int64_t cmd_vel_loss_ticks ;
129
132
const int64_t input_loss_ticks ;
130
133
int64_t topic_last_ticks ;
131
134
const int64_t topic_loss_ticks ;
@@ -167,6 +170,8 @@ static struct context g_ctx = {
167
170
.now_ticks = 0 ,
168
171
.input_last_ticks = 0 ,
169
172
.topic_last_ticks = 0 ,
173
+ .cmd_vel_last_ticks = 0 ,
174
+ .cmd_vel_loss_ticks = 1.0 * CONFIG_SYS_CLOCK_TICKS_PER_SEC ,
170
175
.input_loss_ticks = 1.0 * CONFIG_SYS_CLOCK_TICKS_PER_SEC ,
171
176
.topic_loss_ticks = 1.0 * CONFIG_SYS_CLOCK_TICKS_PER_SEC ,
172
177
};
@@ -244,6 +249,8 @@ static void fsm_compute_input(struct status_input *input, struct context *ctx)
244
249
input -> topic_source_input =
245
250
ctx -> status .topic_source == synapse_pb_Status_TopicSource_TOPIC_SOURCE_INPUT ;
246
251
input -> input_timeout = (ctx -> now_ticks - ctx -> input_last_ticks ) > ctx -> input_loss_ticks ;
252
+ input -> cmd_vel_timeout =
253
+ (ctx -> now_ticks - ctx -> cmd_vel_last_ticks ) > ctx -> cmd_vel_loss_ticks ;
247
254
input -> input_status_loss =
248
255
ctx -> status .input_status == synapse_pb_Status_LinkStatus_STATUS_LOSS ;
249
256
input -> input_source_ethernet =
@@ -330,6 +337,15 @@ static void fsm_update(synapse_pb_Status *status, const struct status_input *inp
330
337
synapse_pb_Status_Mode_MODE_VELOCITY , // post
331
338
status -> status_message , sizeof (status -> status_message ), // status
332
339
& status -> request_seq , & status -> request_rejected , // request
340
+ 1 , input -> cmd_vel_timeout , "cmd_vel not received" ); // guards
341
+
342
+ transition (& status -> mode , // state
343
+ input -> cmd_vel_timeout , // request
344
+ "actuator fallback, cmd_vel not received" , // label
345
+ synapse_pb_Status_Mode_MODE_VELOCITY , // pre
346
+ synapse_pb_Status_Mode_MODE_ACTUATORS , // post
347
+ status -> status_message , sizeof (status -> status_message ), // status
348
+ & status -> request_seq , & status -> request_rejected , // request
333
349
0 ); // guards
334
350
335
351
transition (& status -> mode , // state
@@ -480,6 +496,7 @@ static void b3rb_fsm_run(void *p0, void *p1, void *p2)
480
496
481
497
if (in -> update_cmd_vel_ethernet ) {
482
498
zros_sub_update (& ctx -> sub_cmd_vel_ethernet );
499
+ ctx -> cmd_vel_last_ticks = ctx -> now_ticks ;
483
500
}
484
501
485
502
// update input from correct source
0 commit comments