@@ -424,7 +424,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
424
424
.persistentId = NAV_PERSISTENT_ID_POSHOLD_3D_INITIALIZE ,
425
425
.onEntry = navOnEnteringState_NAV_STATE_POSHOLD_3D_INITIALIZE ,
426
426
.timeoutMs = 0 ,
427
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_REQUIRE_ANGLE | NAV_REQUIRE_THRTILT ,
427
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_HOLD | NAV_REQUIRE_ANGLE | NAV_REQUIRE_THRTILT ,
428
428
.mapToFlightModes = NAV_ALTHOLD_MODE | NAV_POSHOLD_MODE ,
429
429
.mwState = MW_NAV_STATE_HOLD_INFINIT ,
430
430
.mwError = MW_NAV_ERROR_NONE ,
@@ -439,7 +439,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
439
439
.persistentId = NAV_PERSISTENT_ID_POSHOLD_3D_IN_PROGRESS ,
440
440
.onEntry = navOnEnteringState_NAV_STATE_POSHOLD_3D_IN_PROGRESS ,
441
441
.timeoutMs = 10 ,
442
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_REQUIRE_ANGLE | NAV_REQUIRE_THRTILT | NAV_RC_ALT | NAV_RC_POS | NAV_RC_YAW ,
442
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_REQUIRE_ANGLE | NAV_REQUIRE_THRTILT | NAV_RC_ALT | NAV_RC_POS | NAV_RC_YAW ,
443
443
.mapToFlightModes = NAV_ALTHOLD_MODE | NAV_POSHOLD_MODE ,
444
444
.mwState = MW_NAV_STATE_HOLD_INFINIT ,
445
445
.mwError = MW_NAV_ERROR_NONE ,
@@ -595,7 +595,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
595
595
.persistentId = NAV_PERSISTENT_ID_RTH_CLIMB_TO_SAFE_ALT ,
596
596
.onEntry = navOnEnteringState_NAV_STATE_RTH_CLIMB_TO_SAFE_ALT ,
597
597
.timeoutMs = 10 ,
598
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_RTH | NAV_RC_POS | NAV_RC_YAW , // allow pos adjustment while climbind to safe alt
598
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_RTH | NAV_RC_POS | NAV_RC_YAW , // allow pos adjustment while climbing to safe alt
599
599
.mapToFlightModes = NAV_RTH_MODE | NAV_ALTHOLD_MODE ,
600
600
.mwState = MW_NAV_STATE_RTH_CLIMB ,
601
601
.mwError = MW_NAV_ERROR_WAIT_FOR_RTH_ALT ,
@@ -656,7 +656,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
656
656
.persistentId = NAV_PERSISTENT_ID_RTH_LOITER_PRIOR_TO_LANDING ,
657
657
.onEntry = navOnEnteringState_NAV_STATE_RTH_LOITER_PRIOR_TO_LANDING ,
658
658
.timeoutMs = 500 ,
659
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_RTH | NAV_RC_POS | NAV_RC_YAW ,
659
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_RTH | NAV_RC_POS | NAV_RC_YAW ,
660
660
.mapToFlightModes = NAV_RTH_MODE | NAV_ALTHOLD_MODE ,
661
661
.mwState = MW_NAV_STATE_LAND_SETTLE ,
662
662
.mwError = MW_NAV_ERROR_NONE ,
@@ -677,7 +677,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
677
677
.persistentId = NAV_PERSISTENT_ID_RTH_LOITER_ABOVE_HOME ,
678
678
.onEntry = navOnEnteringState_NAV_STATE_RTH_LOITER_ABOVE_HOME ,
679
679
.timeoutMs = 10 ,
680
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_RTH | NAV_RC_POS | NAV_RC_YAW | NAV_RC_ALT ,
680
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_RTH | NAV_RC_POS | NAV_RC_YAW | NAV_RC_ALT ,
681
681
.mapToFlightModes = NAV_RTH_MODE | NAV_ALTHOLD_MODE ,
682
682
.mwState = MW_NAV_STATE_HOVER_ABOVE_HOME ,
683
683
.mwError = MW_NAV_ERROR_NONE ,
@@ -696,7 +696,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
696
696
.persistentId = NAV_PERSISTENT_ID_RTH_LANDING ,
697
697
.onEntry = navOnEnteringState_NAV_STATE_RTH_LANDING ,
698
698
.timeoutMs = 10 ,
699
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_LAND | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_RTH | NAV_RC_POS | NAV_RC_YAW ,
699
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_CTL_LAND | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_RTH | NAV_RC_POS | NAV_RC_YAW ,
700
700
.mapToFlightModes = NAV_RTH_MODE | NAV_ALTHOLD_MODE ,
701
701
.mwState = MW_NAV_STATE_LAND_IN_PROGRESS ,
702
702
.mwError = MW_NAV_ERROR_LANDING ,
@@ -717,7 +717,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
717
717
.persistentId = NAV_PERSISTENT_ID_RTH_FINISHING ,
718
718
.onEntry = navOnEnteringState_NAV_STATE_RTH_FINISHING ,
719
719
.timeoutMs = 0 ,
720
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_LAND | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_RTH ,
720
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_CTL_LAND | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_RTH ,
721
721
.mapToFlightModes = NAV_RTH_MODE | NAV_ALTHOLD_MODE ,
722
722
.mwState = MW_NAV_STATE_LAND_IN_PROGRESS ,
723
723
.mwError = MW_NAV_ERROR_LANDING ,
@@ -828,7 +828,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
828
828
.persistentId = NAV_PERSISTENT_ID_WAYPOINT_HOLD_TIME , // There is no state for timed hold?
829
829
.onEntry = navOnEnteringState_NAV_STATE_WAYPOINT_HOLD_TIME ,
830
830
.timeoutMs = 10 ,
831
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_WP ,
831
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_WP ,
832
832
.mapToFlightModes = NAV_WP_MODE | NAV_ALTHOLD_MODE ,
833
833
.mwState = MW_NAV_STATE_HOLD_TIMED ,
834
834
.mwError = MW_NAV_ERROR_NONE ,
@@ -849,7 +849,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
849
849
.persistentId = NAV_PERSISTENT_ID_WAYPOINT_RTH_LAND ,
850
850
.onEntry = navOnEnteringState_NAV_STATE_WAYPOINT_RTH_LAND ,
851
851
.timeoutMs = 10 ,
852
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_LAND | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_WP ,
852
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_CTL_LAND | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_WP ,
853
853
.mapToFlightModes = NAV_WP_MODE | NAV_ALTHOLD_MODE ,
854
854
.mwState = MW_NAV_STATE_LAND_IN_PROGRESS ,
855
855
.mwError = MW_NAV_ERROR_LANDING ,
@@ -887,7 +887,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
887
887
.persistentId = NAV_PERSISTENT_ID_WAYPOINT_FINISHED ,
888
888
.onEntry = navOnEnteringState_NAV_STATE_WAYPOINT_FINISHED ,
889
889
.timeoutMs = 10 ,
890
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_WP | NAV_AUTO_WP_DONE ,
890
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_REQUIRE_ANGLE | NAV_REQUIRE_MAGHOLD | NAV_REQUIRE_THRTILT | NAV_AUTO_WP | NAV_AUTO_WP_DONE ,
891
891
.mapToFlightModes = NAV_WP_MODE | NAV_ALTHOLD_MODE ,
892
892
.mwState = MW_NAV_STATE_WP_ENROUTE ,
893
893
.mwError = MW_NAV_ERROR_FINISH ,
@@ -926,7 +926,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
926
926
.persistentId = NAV_PERSISTENT_ID_EMERGENCY_LANDING_IN_PROGRESS ,
927
927
.onEntry = navOnEnteringState_NAV_STATE_EMERGENCY_LANDING_IN_PROGRESS ,
928
928
.timeoutMs = 10 ,
929
- .stateFlags = NAV_CTL_EMERG | NAV_REQUIRE_ANGLE ,
929
+ .stateFlags = NAV_CTL_HOLD | NAV_CTL_EMERG | NAV_REQUIRE_ANGLE ,
930
930
.mapToFlightModes = 0 ,
931
931
.mwState = MW_NAV_STATE_EMERGENCY_LANDING ,
932
932
.mwError = MW_NAV_ERROR_LANDING ,
@@ -944,7 +944,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
944
944
.persistentId = NAV_PERSISTENT_ID_EMERGENCY_LANDING_FINISHED ,
945
945
.onEntry = navOnEnteringState_NAV_STATE_EMERGENCY_LANDING_FINISHED ,
946
946
.timeoutMs = 10 ,
947
- .stateFlags = NAV_CTL_EMERG | NAV_REQUIRE_ANGLE ,
947
+ .stateFlags = NAV_CTL_HOLD | NAV_CTL_EMERG | NAV_REQUIRE_ANGLE ,
948
948
.mapToFlightModes = 0 ,
949
949
.mwState = MW_NAV_STATE_LANDED ,
950
950
.mwError = MW_NAV_ERROR_LANDING ,
@@ -1053,7 +1053,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
1053
1053
.persistentId = NAV_PERSISTENT_ID_FW_LANDING_CLIMB_TO_LOITER ,
1054
1054
.onEntry = navOnEnteringState_NAV_STATE_FW_LANDING_CLIMB_TO_LOITER ,
1055
1055
.timeoutMs = 10 ,
1056
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_REQUIRE_ANGLE | NAV_AUTO_RTH ,
1056
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_REQUIRE_ANGLE | NAV_AUTO_RTH ,
1057
1057
.mapToFlightModes = NAV_FW_AUTOLAND ,
1058
1058
.mwState = MW_NAV_STATE_LAND_IN_PROGRESS ,
1059
1059
.mwError = MW_NAV_ERROR_NONE ,
@@ -1074,7 +1074,7 @@ static const navigationFSMStateDescriptor_t navFSM[NAV_STATE_COUNT] = {
1074
1074
.persistentId = NAV_PERSISTENT_ID_FW_LANDING_LOITER ,
1075
1075
.onEntry = navOnEnteringState_NAV_STATE_FW_LANDING_LOITER ,
1076
1076
.timeoutMs = 10 ,
1077
- .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_REQUIRE_ANGLE | NAV_AUTO_RTH ,
1077
+ .stateFlags = NAV_CTL_ALT | NAV_CTL_POS | NAV_CTL_YAW | NAV_CTL_HOLD | NAV_REQUIRE_ANGLE | NAV_AUTO_RTH ,
1078
1078
.mapToFlightModes = NAV_FW_AUTOLAND ,
1079
1079
.mwState = MW_NAV_STATE_LAND_IN_PROGRESS ,
1080
1080
.mwError = MW_NAV_ERROR_NONE ,
@@ -4081,16 +4081,20 @@ bool isLastMissionWaypoint(void)
4081
4081
/* Checks if Nav hold position is active */
4082
4082
bool isNavHoldPositionActive (void )
4083
4083
{
4084
- // WP mode last WP hold and Timed hold positions
4084
+ /* If the current Nav state isn't flagged as a hold point (NAV_CTL_HOLD) then
4085
+ * waypoints are assumed to be hold points by default unless excluded as defined here */
4086
+
4087
+ if (navGetCurrentStateFlags () & NAV_CTL_HOLD ) {
4088
+ return true;
4089
+ }
4090
+
4091
+ // No hold required for basic WP type unless it's the last mission waypoint
4085
4092
if (FLIGHT_MODE (NAV_WP_MODE )) {
4086
- return isLastMissionWaypoint () || posControl .waypointList [posControl .activeWaypointIndex ].action == NAV_WP_ACTION_HOLD_TIME ;
4087
- }
4088
- // RTH mode (spiral climb and Home positions but excluding RTH Trackback point positions) and POSHOLD mode
4089
- // Also hold position during emergency landing if position valid
4090
- return (FLIGHT_MODE (NAV_RTH_MODE ) && !posControl .flags .rthTrackbackActive ) ||
4091
- FLIGHT_MODE (NAV_POSHOLD_MODE ) ||
4092
- (posControl .navState == NAV_STATE_FW_LANDING_CLIMB_TO_LOITER || posControl .navState == NAV_STATE_FW_LANDING_LOITER ) ||
4093
- navigationIsExecutingAnEmergencyLanding ();
4093
+ return posControl .waypointList [posControl .activeWaypointIndex ].action != NAV_WP_ACTION_WAYPOINT || isLastMissionWaypoint ();
4094
+ }
4095
+
4096
+ // No hold required for Trackback WPs or for fixed wing autoland WPs not flagged as hold points (returned above if they are)
4097
+ return !FLIGHT_MODE (NAV_FW_AUTOLAND ) && !posControl .flags .rthTrackbackActive ;
4094
4098
}
4095
4099
4096
4100
float getActiveSpeed (void )
0 commit comments