int mission_run() { // current element struct _mission_element *el = NULL; if ((el = mission_get()) == NULL) { // TODO do something special like a waiting circle before ending the mission ? return false; // end of mission } bool el_running = false; switch (el->type) { case MissionWP: el_running = mission_nav_wp(&(el->element.mission_wp)); break; case MissionCircle: el_running = mission_nav_circle(&(el->element.mission_circle)); break; case MissionSegment: el_running = mission_nav_segment(&(el->element.mission_segment)); break; case MissionPath: el_running = mission_nav_path(&(el->element.mission_path)); break; case MissionCustom: el_running = mission_nav_custom(&(el->element.mission_custom), mission.element_time < dt_navigation); break; default: // invalid type or pattern not yet handled break; } // increment element_time mission.element_time += dt_navigation; // test if element is finished or element time is elapsed if (!el_running || (el->duration > 0. && mission.element_time >= el->duration)) { // reset timer mission.element_time = 0.; // go to next element mission.current_idx = (mission.current_idx + 1) % MISSION_ELEMENT_NB; } return true; }
int mission_run() { // current element struct _mission_element *el = NULL; if ((el = mission_get()) == NULL) { mission.element_time = 0; mission.current_idx = 0; return FALSE; // end of mission } bool_t el_running = FALSE; switch (el->type) { case MissionWP: el_running = mission_nav_wp(el); break; case MissionCircle: el_running = mission_nav_circle(el); break; case MissionSegment: el_running = mission_nav_segment(el); break; case MissionPath: el_running = mission_nav_path(el); break; default: // invalid type or pattern not yet handled break; } // increment element_time mission.element_time += dt_navigation; if (!el_running) { // reset timer mission.element_time = 0.; // go to next element mission.current_idx = (mission.current_idx + 1) % MISSION_ELEMENT_NB; } return TRUE; }