AP_Filesystem: allow for partial mission upload

This commit is contained in:
Andrew Tridgell 2021-04-07 14:09:59 +10:00
parent d96002942c
commit d8575f0607
2 changed files with 19 additions and 4 deletions

View File

@ -367,7 +367,9 @@ bool AP_Filesystem_Mission::finish_upload(const rfile &r)
return false;
}
WITH_SEMAPHORE(mission->get_semaphore());
mission->clear();
if ((hdr.options & unsigned(Options::NO_CLEAR)) == 0) {
mission->clear();
}
for (uint32_t i=0; i<nitems; i++) {
mavlink_mission_item_int_t m;
AP_Mission::Mission_Command cmd;
@ -380,8 +382,15 @@ bool AP_Filesystem_Mission::finish_upload(const rfile &r)
(cmd.content.jump.target >= nitems || cmd.content.jump.target == 0)) {
return false;
}
if (!mission->add_cmd(cmd)) {
return false;
uint16_t idx = i + hdr.start;
if (idx == mission->num_commands()) {
if (!mission->add_cmd(cmd)) {
return false;
}
} else {
if (!mission->replace_cmd(idx, cmd)) {
return false;
}
}
}
return true;

View File

@ -36,11 +36,17 @@ private:
static constexpr uint16_t mission_magic = 0x763d;
enum class Options {
NO_CLEAR = (1U<<0), // don't clear the old mission
};
// header at front of the file
struct header {
uint16_t magic = mission_magic;
uint16_t data_type; // MAV_MISSION_TYPE_*
uint32_t num_items;
uint16_t options; // optional features
uint16_t start; // first WP num, 0 for full upload
uint16_t num_items;
};
struct rfile {