AP_Mission: memoise result of contains_terrain_relative

527 items takes ~2200us on CubeOrange which is way too long
This commit is contained in:
Peter Barker 2022-08-04 11:24:43 +10:00 committed by Peter Barker
parent 4c674b64fb
commit 50fb56a74f
2 changed files with 17 additions and 4 deletions

View File

@ -2465,9 +2465,18 @@ bool AP_Mission::contains_item(MAV_CMD command) const
}
/*
return true if the mission has a terrain relative item
return true if the mission has a terrain relative item. ~2200us for 530 items on H7
*/
bool AP_Mission::contains_terrain_relative(void) const
bool AP_Mission::contains_terrain_relative(void)
{
if (_last_contains_relative_calculated_ms != _last_change_time_ms) {
_contains_terrain_relative = calculate_contains_terrain_relative();
_last_contains_relative_calculated_ms = _last_change_time_ms;
}
return _contains_terrain_relative;
}
bool AP_Mission::calculate_contains_terrain_relative(void) const
{
for (int i = 1; i < num_commands(); i++) {
Mission_Command tmp;

View File

@ -620,8 +620,8 @@ public:
bool contains_item(MAV_CMD command) const;
// returns true if the mission has a terrain relative mission item
bool contains_terrain_relative(void) const;
bool contains_terrain_relative(void);
// reset the mission history to prevent recalling previous mission histories when restarting missions.
void reset_wp_history(void);
@ -764,6 +764,10 @@ private:
// last time that mission changed
uint32_t _last_change_time_ms;
// memoisation of contains-relative:
bool _contains_terrain_relative; // true if the mission has terrain-relative items
uint32_t _last_contains_relative_calculated_ms; // will be equal to _last_change_time_ms if _contains_terrain_relative is up-to-date
bool calculate_contains_terrain_relative(void) const;
// multi-thread support. This is static so it can be used from
// const functions