Skip to content

Commit 308377d

Browse files
committed
pbio/drivebase: Make trajectory synchronization easier to follow.
Also avoid direct access to integrator state.
1 parent 66e4e18 commit 308377d

File tree

3 files changed

+11
-2
lines changed

3 files changed

+11
-2
lines changed

lib/pbio/include/pbio/integrator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ typedef struct _pbio_position_integrator_t {
4747

4848
uint32_t pbio_position_integrator_get_ref_time(pbio_position_integrator_t *itg, uint32_t time_now);
4949
void pbio_position_integrator_pause(pbio_position_integrator_t *itg, uint32_t time_now);
50+
bool pbio_position_integrator_is_paused(pbio_position_integrator_t *itg);
5051
void pbio_position_integrator_resume(pbio_position_integrator_t *itg, uint32_t time_now);
5152
void pbio_position_integrator_reset(pbio_position_integrator_t *itg, pbio_control_settings_t *settings, uint32_t time_now);
5253
int32_t pbio_position_integrator_update(pbio_position_integrator_t *itg, int32_t position_error, int32_t target_error);

lib/pbio/src/drivebase.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,10 +402,14 @@ static pbio_error_t pbio_drivebase_update(pbio_drivebase_t *db) {
402402

403403
// Both controllers are able to stop the other when it stalls. This ensures
404404
// they complete at exactly the same time.
405-
if (pbio_control_type_is_position(&db->control_distance) && !db->control_distance.position_integrator.trajectory_running) {
405+
if (pbio_control_type_is_position(&db->control_distance) &&
406+
pbio_position_integrator_is_paused(&db->control_distance.position_integrator)) {
407+
// If distance controller is paused, pause heading control too.
406408
pbio_position_integrator_pause(&db->control_heading.position_integrator, time_now);
407409
}
408-
if (pbio_control_type_is_position(&db->control_heading) && !db->control_heading.position_integrator.trajectory_running) {
410+
if (pbio_control_type_is_position(&db->control_heading) &&
411+
pbio_position_integrator_is_paused(&db->control_heading.position_integrator)) {
412+
// If heading controller is paused, pause distance control too.
409413
pbio_position_integrator_pause(&db->control_distance.position_integrator, time_now);
410414
}
411415

lib/pbio/src/integrator.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ void pbio_position_integrator_pause(pbio_position_integrator_t *itg, uint32_t ti
123123
itg->time_pause_begin = time_now;
124124
}
125125

126+
bool pbio_position_integrator_is_paused(pbio_position_integrator_t *itg) {
127+
return !itg->trajectory_running;
128+
}
129+
126130
void pbio_position_integrator_resume(pbio_position_integrator_t *itg, uint32_t time_now) {
127131

128132
// Return if already trajectory_running

0 commit comments

Comments
 (0)