1
0
Fork 0
mirror of https://github.com/betaflight/betaflight-configurator.git synced 2025-07-19 14:25:14 +03:00

Fix GPS Rescue parameters confusion (#3554)

* Fix GPS Rescue parameters

* Use uint16_t for initialClimbM

* change return altitude to 5 - 1000

* Attribute fixes

* Do not mix semver code

* Fix order

* Change tooltip

* Rearrange sequence of settings

* update gps rescue max pitch angle text

* Update return ground speed message

* Update helpicon

* update tooltips

---------

Co-authored-by: ctzsnooze <chris@th.id.au>
Co-authored-by: ctzsnooze <chris.thompson@sydney.edu.au>
This commit is contained in:
Mark Haslinghuis 2023-08-31 11:50:01 +02:00 committed by GitHub
parent 5bb8207080
commit 172cb0bee9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 170 additions and 111 deletions

View file

@ -830,14 +830,6 @@
"message": "Heading:",
"description": "Heading shown on Setup tab"
},
"initialSetupPitch": {
"message": "Pitch:",
"description": "Pitch shown on Setup tab"
},
"initialSetupRoll": {
"message": "Roll:",
"description": "Roll shown on Setup tab"
},
"initialSetupMixerHead": {
"message": "Mixer Type"
},
@ -2783,7 +2775,8 @@
"description": "Show GPS position - Latitude / Longitude"
},
"gpsHeading": {
"message": "Heading:"
"message": "Heading Mag / GPS:",
"description": "Show GPS heading - Magnetic / GPS course over ground"
},
"gpsSpeed": {
"message": "Speed:"
@ -4612,45 +4605,6 @@
"message": "GPS Rescue"
},
"failsafeGpsRescueItemAngle": {
"message": "Angle"
},
"failsafeGpsRescueItemInitialAltitude": {
"message": "Initial altitude (meters)"
},
"failsafeGpsRescueItemDescentDistance": {
"message": "Descent distance (meters)"
},
"failsafeGpsRescueItemMinDth": {
"message": "Minimum distance to home (meters)"
},
"failsafeGpsRescueItemMinDthHelp": {
"message": "The minimum distance to home needed for GPS rescue to activate"
},
"failsafeGpsRescueItemGroundSpeed": {
"message": "Ground speed (meters/second)"
},
"failsafeGpsRescueItemThrottleMin": {
"message": "Throttle minimum"
},
"failsafeGpsRescueItemThrottleMax": {
"message": "Throttle maximum"
},
"failsafeGpsRescueItemThrottleHover": {
"message": "Throttle hover"
},
"failsafeGpsRescueItemAscendRate": {
"message": "Ascend rate (meters/second)"
},
"failsafeGpsRescueItemDescendRate": {
"message": "Descend rate (meters/second)"
},
"failsafeGpsRescueItemMinSats": {
"message": "Minimum satellites"
},
"failsafeGpsRescueItemAllowArmingWithoutFix": {
"message": "Allow arming without fix - <span class=\"message-negative\">WARNING: the GPS Rescue will not be available</span>"
},
"failsafeGpsRescueItemAltitudeMode": {
"message": "Altitude mode"
},
@ -4663,6 +4617,70 @@
"failsafeGpsRescueItemAltitudeModeCurrentAlt": {
"message": "Current altitude"
},
"failsafeGpsRescueInitialClimb": {
"message": "Initial climb (meters)"
},
"failsafeGpsRescueInitialClimbHelp": {
"message": "The distance the quad will climb, above the current altitude, when a rescue is initiated and the altitude mode is set to CURRENT Altitude; also added when in MAX Altitude mode."
},
"failsafeGpsRescueItemReturnAltitude": {
"message": "Return altitude (meters) - <strong>only applies in Fixed Altitude mode</strong>"
},
"failsafeGpsRescueItemAscendRate": {
"message": "Ascend rate (meters/second)"
},
"failsafeGpsRescueItemGroundSpeed": {
"message": "Return ground speed (meters/second)"
},
"failsafeGpsRescueItemAngle": {
"message": "Maximum pitch angle"
},
"failsafeGpsRescueAngleHelp": {
"message": "Higher maximum angles lead to more aggressive returns and higher forward speeds. May be useful for heavier, high-drag or low authority craft, or for use in stronger winds. WARNING: Rescue throttle usually needs to be increased if the max angle is increased! Otherwise the quad may lose altitude and crash!"
},
"failsafeGpsRescueItemDescentDistance": {
"message": "Descent distance (meters)"
},
"failsafeGpsRescueItemDescendRate": {
"message": "Descend rate (meters/second)"
},
"failsafeGpsRescueDescendRateHelp": {
"message": "The initial descent rate is set to 3 times this value, decreasing to the set value at the landing altitude."
},
"failsafeGpsRescueItemMinStartDistHelp" : {
"message": "If the rescue starts too close to home (within this minimum distance), the craft will fly away, on its current heading, until at least this distance from home, and then start normal rescue behaviour",
"description": "Updated help text for the minimum start distance needed for GPS rescue to activate"
},
"failsafeGpsRescueItemThrottleMin": {
"message": "Throttle minimum"
},
"failsafeGpsRescueItemThrottleMax": {
"message": "Throttle maximum"
},
"failsafeGpsRescueThrottleMaxHelp": {
"message": "Should be increased for heavier, high-drag or low authority craft, if a return against strong winds is likely, or if the maximum pitch angle is increased."
},
"failsafeGpsRescueItemThrottleHover": {
"message": "Throttle hover - <span class=\"message-negative\">IMPORTANT: set this value accurately</span>"
},
"failsafeGpsRescueThrottleHoverHelp": {
"message": "To find the right value, set the Failsafe switch action to Stage 2, set the Stage 2 Failsafe Procedure to Land, and adjust the Throttle value used while landing until the quad hovers or descends slowly. Then set GPS Rescue Throttle Hover, and the Stage 1 Channel Fallback value for Throttle to this value."
},
"failsafeGpsRescueItemMinDth": {
"message": "Minimum distance to home (meters)"
},
"failsafeGpsRescueItemMinDthHelp": {
"message": "The minimum distance to home needed for GPS rescue to activate"
},
"failsafeGpsRescueItemMinSats": {
"message": "Minimum satellites"
},
"failsafeGpsRescueItemAllowArmingWithoutFix": {
"message": "Allow arming without fix - <span class=\"message-negative\">WARNING: No fix = disarm on failsafe!</span>"
},
"failsafeGpsRescueArmWithoutFixHelp": {
"message": "Not recommended. Permits arming without a Home point being set, but the quad will disarm and crash with a true Rx loss failsafe. If tested with a switch, there is a short Do Nothing period before the disarm."
},
"failsafeGpsRescueItemSanityChecks": {
"message": "Sanity checks"
},
@ -5107,7 +5125,7 @@
"message": "Custom image:"
},
"osdSetupCustomLogoInfoImageSize": {
"message": "Size must be $t(logoWidthPx)×$t(logoHeightPx) pixels"
"message": "Size must be $t(logoWidthPx)x$t(logoHeightPx) pixels"
},
"osdSetupCustomLogoInfoColorMap": {
"message": "Must contain green, black and white pixels"
@ -5116,7 +5134,7 @@
"message": "Click <b>$t(osdSetupUploadFont.message)</b> to persist custom logo"
},
"osdSetupCustomLogoImageSizeError": {
"message": "Invalid image size: {{width}}×{{height}} (expected $t(logoWidthPx)×$t(logoHeightPx))"
"message": "Invalid image size: {{width}}x{{height}} (expected $t(logoWidthPx)×$t(logoHeightPx))"
},
"osdSetupCustomLogoColorMapError": {
"message": "The image contains an invalid pixel: rgb({{valueR}}, {{valueG}}, {{valueB}}) at coordinates {{posX}}×{{posY}}"

View file

@ -578,9 +578,9 @@ const FC = {
this.GPS_RESCUE = {
angle: 0,
initialAltitudeM: 0,
returnAltitudeM: 0,
descentDistanceM: 0,
rescueGroundspeed: 0,
groundSpeed: 0,
throttleMin: 0,
throttleMax: 0,
throttleHover: 0,
@ -590,7 +590,8 @@ const FC = {
descendRate: 0,
allowArmingWithoutFix: 0,
altitudeMode: 0,
minRescueDth: 0,
minStartDistM: 0,
initialClimbM: 0,
};
this.RXFAIL_CONFIG = [];

View file

@ -514,9 +514,9 @@ MspHelper.prototype.process_data = function(dataHandler) {
break;
case MSPCodes.MSP_GPS_RESCUE:
FC.GPS_RESCUE.angle = data.readU16();
FC.GPS_RESCUE.initialAltitudeM = data.readU16();
FC.GPS_RESCUE.returnAltitudeM = data.readU16();
FC.GPS_RESCUE.descentDistanceM = data.readU16();
FC.GPS_RESCUE.rescueGroundspeed = data.readU16();
FC.GPS_RESCUE.groundSpeed = data.readU16();
FC.GPS_RESCUE.throttleMin = data.readU16();
FC.GPS_RESCUE.throttleMax = data.readU16();
FC.GPS_RESCUE.throttleHover = data.readU16();
@ -529,7 +529,10 @@ MspHelper.prototype.process_data = function(dataHandler) {
FC.GPS_RESCUE.altitudeMode = data.readU8();
}
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_44)) {
FC.GPS_RESCUE.minRescueDth = data.readU16();
FC.GPS_RESCUE.minStartDistM = data.readU16();
}
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) {
FC.GPS_RESCUE.initialClimbM = data.readU16();
}
break;
case MSPCodes.MSP_RSSI_CONFIG:
@ -1797,9 +1800,9 @@ MspHelper.prototype.crunch = function(code, modifierCode = undefined) {
break;
case MSPCodes.MSP_SET_GPS_RESCUE:
buffer.push16(FC.GPS_RESCUE.angle)
.push16(FC.GPS_RESCUE.initialAltitudeM)
.push16(FC.GPS_RESCUE.returnAltitudeM)
.push16(FC.GPS_RESCUE.descentDistanceM)
.push16(FC.GPS_RESCUE.rescueGroundspeed)
.push16(FC.GPS_RESCUE.groundSpeed)
.push16(FC.GPS_RESCUE.throttleMin)
.push16(FC.GPS_RESCUE.throttleMax)
.push16(FC.GPS_RESCUE.throttleHover)
@ -1813,7 +1816,10 @@ MspHelper.prototype.crunch = function(code, modifierCode = undefined) {
.push8(FC.GPS_RESCUE.altitudeMode);
}
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_44)) {
buffer.push16(FC.GPS_RESCUE.minRescueDth);
buffer.push16(FC.GPS_RESCUE.minStartDistM);
}
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) {
buffer.push16(FC.GPS_RESCUE.initialClimbM);
}
break;
case MSPCodes.MSP_SET_RSSI_CONFIG:

View file

@ -269,9 +269,9 @@ failsafe.initialize = function (callback) {
// Load GPS Rescue parameters
$('input[name="gps_rescue_angle"]').val(FC.GPS_RESCUE.angle);
$('input[name="gps_rescue_initial_altitude"]').val(FC.GPS_RESCUE.initialAltitudeM);
$('input[name="gps_rescue_return_altitude"]').val(FC.GPS_RESCUE.returnAltitudeM);
$('input[name="gps_rescue_descent_distance"]').val(FC.GPS_RESCUE.descentDistanceM);
$('input[name="gps_rescue_ground_speed"]').val((FC.GPS_RESCUE.rescueGroundspeed / 100).toFixed(2));
$('input[name="gps_rescue_ground_speed"]').val((FC.GPS_RESCUE.groundSpeed / 100).toFixed(1));
$('input[name="gps_rescue_throttle_min"]').val(FC.GPS_RESCUE.throttleMin);
$('input[name="gps_rescue_throttle_max"]').val(FC.GPS_RESCUE.throttleMax);
$('input[name="gps_rescue_throttle_hover"]').val(FC.GPS_RESCUE.throttleHover);
@ -284,8 +284,8 @@ failsafe.initialize = function (callback) {
$('#failsafeGpsRescueItemAltitudeSelect').sortSelect();
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
$('input[name="gps_rescue_ascend_rate"]').val((FC.GPS_RESCUE.ascendRate / 100).toFixed(2));
$('input[name="gps_rescue_descend_rate"]').val((FC.GPS_RESCUE.descendRate / 100).toFixed(2));
$('input[name="gps_rescue_ascend_rate"]').val((FC.GPS_RESCUE.ascendRate / 100).toFixed(1));
$('input[name="gps_rescue_descend_rate"]').val((FC.GPS_RESCUE.descendRate / 100).toFixed(1));
$('input[name="gps_rescue_allow_arming_without_fix"]').prop('checked', FC.GPS_RESCUE.allowArmingWithoutFix > 0);
$('select[name="gps_rescue_altitude_mode"]').val(FC.GPS_RESCUE.altitudeMode);
} else {
@ -296,18 +296,36 @@ failsafe.initialize = function (callback) {
}
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_44)) {
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) {
$('input[name="gps_rescue_min_dth"]').attr("min", 10);
} else if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_45)) {
$('input[name="gps_rescue_min_dth"]').attr("min", 20);
}
$('input[name="gps_rescue_min_dth"]').val(FC.GPS_RESCUE.minRescueDth);
$('input[name="gps_rescue_min_start_dist"]').val(FC.GPS_RESCUE.minStartDistM);
} else {
$('input[name="gps_rescue_min_dth"]').closest('.number').hide();
$('input[name="gps_rescue_min_start_dist"]').closest('.number').hide();
}
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_45)) {
$('input[name="gps_rescue_angle"]').attr("max", 80);
$('input[name="gps_rescue_return_altitude"]').attr({"min": 2, "max": 255});
$('input[name="gps_rescue_descent_distance"]').attr("min", 5);
$('input[name="gps_rescue_min_start_dist"]').attr("min", 20);
$('input[name="gps_rescue_ground_speed"]').attr("min", 0.0);
$('input[name="gps_rescue_ascend_rate"]').attr("min", 0.5);
$('input[name="gps_rescue_descend_rate"]').attr("min", 0.3);
}
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) {
$('input[name="gps_rescue_initial_climb"]').val(FC.GPS_RESCUE.initialClimbM);
} else {
$('input[name="gps_rescue_initial_climb"]').closest('.number').hide();
}
// Update attributes for API version 4.5
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) {
$('input[name="gps_rescue_angle"]').attr({"min": 30, "max": 60});
$('input[name="gps_rescue_return_altitude"]').attr({"min": 5, "max": 1000});
$('input[name="gps_rescue_descent_distance"]').attr("min", 10);
$('input[name="gps_rescue_min_start_dist"]').attr({"min": 10, "max": 30})
.closest('.number').children('.helpicon').attr("i18n_title", i18n.getMessage("failsafeGpsRescueItemMinStartDistHelp"));
$('input[name="gps_rescue_descend_rate"]').attr({"min": 0.2, "max": 50.0});
}
$('a.save').click(function () {
// gather data that doesn't have automatic change event bound
@ -334,9 +352,9 @@ failsafe.initialize = function (callback) {
// Load GPS Rescue parameters
FC.GPS_RESCUE.angle = $('input[name="gps_rescue_angle"]').val();
FC.GPS_RESCUE.initialAltitudeM = $('input[name="gps_rescue_initial_altitude"]').val();
FC.GPS_RESCUE.returnAltitudeM = $('input[name="gps_rescue_return_altitude"]').val();
FC.GPS_RESCUE.descentDistanceM = $('input[name="gps_rescue_descent_distance"]').val();
FC.GPS_RESCUE.rescueGroundspeed = $('input[name="gps_rescue_ground_speed"]').val() * 100;
FC.GPS_RESCUE.groundSpeed = $('input[name="gps_rescue_ground_speed"]').val() * 100;
FC.GPS_RESCUE.throttleMin = $('input[name="gps_rescue_throttle_min"]').val();
FC.GPS_RESCUE.throttleMax = $('input[name="gps_rescue_throttle_max"]').val();
FC.GPS_RESCUE.throttleHover = $('input[name="gps_rescue_throttle_hover"]').val();
@ -351,7 +369,11 @@ failsafe.initialize = function (callback) {
}
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_44)) {
FC.GPS_RESCUE.minRescueDth = $('input[name="gps_rescue_min_dth"]').val();
FC.GPS_RESCUE.minStartDistM = $('input[name="gps_rescue_min_start_dist"]').val();
}
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) {
FC.GPS_RESCUE.initialClimbM = $('input[name="gps_rescue_initial_climb"]').val();
}
function save_failssafe_config() {

View file

@ -185,8 +185,9 @@ gps.initialize = async function (callback) {
const lat = FC.GPS_DATA.lat / 10000000;
const lon = FC.GPS_DATA.lon / 10000000;
const url = `https://maps.google.com/?q=${lat},${lon}`;
const heading = hasMag ? Math.atan2(FC.SENSOR_DATA.magnetometer[1], FC.SENSOR_DATA.magnetometer[0]) : undefined;
const headingDeg = heading === undefined ? 0 : heading * 180 / Math.PI;
const magHeading = hasMag ? Math.atan2(FC.SENSOR_DATA.magnetometer[1], FC.SENSOR_DATA.magnetometer[0]) : undefined;
const magHeadingDeg = magHeading === undefined ? 0 : magHeading * 180 / Math.PI;
const gpsHeading = FC.GPS_DATA.ground_course / 100;
const gnssArray = ['GPS', 'SBAS', 'Galileo', 'BeiDou', 'IMES', 'QZSS', 'Glonass'];
const qualityArray = ['gnssQualityNoSignal', 'gnssQualitySearching', 'gnssQualityAcquired', 'gnssQualityUnusable', 'gnssQualityLocked',
'gnssQualityFullyLocked', 'gnssQualityFullyLocked', 'gnssQualityFullyLocked'];
@ -199,8 +200,8 @@ gps.initialize = async function (callback) {
const gspUnitText = i18n.getMessage('gpsPositionUnit');
$('.GPS_info td.alt').text(`${alt} m`);
$('.GPS_info td.latLon a').prop('href', url).text(`${lat.toFixed(4)} deg / ${lon.toFixed(4)} deg`);
$('.GPS_info td.heading').text(`${headingDeg.toFixed(4)} ${gspUnitText}`);
$('.GPS_info td.latLon a').prop('href', url).text(`${lat.toFixed(4)} / ${lon.toFixed(4)} ${gspUnitText}`);
$('.GPS_info td.heading').text(`${magHeadingDeg.toFixed(4)} / ${gpsHeading.toFixed(4)} ${gspUnitText}`);
$('.GPS_info td.speed').text(`${FC.GPS_DATA.speed} cm/s`);
$('.GPS_info td.sats').text(FC.GPS_DATA.numSat);
$('.GPS_info td.distToHome').text(`${FC.GPS_DATA.distanceToHome} m`);
@ -296,7 +297,7 @@ gps.initialize = async function (callback) {
action: 'center',
lat: lat,
lon: lon,
heading: heading,
heading: magHeading,
};
frame = document.getElementById('map');

View file

@ -118,33 +118,55 @@
<label for="gps_rescue" i18n="failsafeProcedureItemSelect4"></label>
</div>
<div class="proceduresettings">
<div class="number">
<label>
<select id="failsafeGpsRescueItemAltitudeSelect" class="switchMode" name="gps_rescue_altitude_mode">
<option value="0" i18n="failsafeGpsRescueItemAltitudeModeMaxAlt"></option>
<option value="1" i18n="failsafeGpsRescueItemAltitudeModeFixedAlt"></option>
<option value="2" i18n="failsafeGpsRescueItemAltitudeModeCurrentAlt"></option>
</select>
<span i18n="failsafeGpsRescueItemAltitudeMode"></span>
</label>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_initial_climb" min="0" max="100" /> <span
i18n="failsafeGpsRescueInitialClimb"></span>
</label>
<div class="helpicon cf_tip" i18n_title="failsafeGpsRescueInitialClimbHelp"></div>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_return_altitude" min="20" max="100" /> <span
i18n="failsafeGpsRescueItemReturnAltitude"></span>
</label>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_ascend_rate" min="1.00" max="25.00" step="0.1" /> <span
i18n="failsafeGpsRescueItemAscendRate"></span>
</label>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_ground_speed" min="3.00" max="30.00" step="0.1"/> <span
i18n="failsafeGpsRescueItemGroundSpeed"></span>
</label>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_angle" min="0" max="200" /> <span
i18n="failsafeGpsRescueItemAngle"></span>
<div class="helpicon cf_tip" i18n_title="failsafeGpsRescueAngleHelp"></div>
</label>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_initial_altitude" min="20" max="100" /> <span
i18n="failsafeGpsRescueItemInitialAltitude"></span>
</label>
</div>
<div class="number">
<div class="number">
<label> <input type="number" name="gps_rescue_descent_distance" min="30" max="500" /> <span
i18n="failsafeGpsRescueItemDescentDistance"></span>
</label>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_min_dth" min="50" max="1000" /> <span
i18n="failsafeGpsRescueItemMinDth"></span>
</label>
<div class="helpicon cf_tip" i18n_title="failsafeGpsRescueItemMinDthHelp"></div>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_ground_speed" min="3.00" max="30.00" step="0.01"/> <span
i18n="failsafeGpsRescueItemGroundSpeed"></span>
<label> <input type="number" name="gps_rescue_descend_rate" min="1.00" max="5.00" step="0.1" /> <span
i18n="failsafeGpsRescueItemDescendRate"></span>
<div class="helpicon cf_tip" i18n_title="failsafeGpsRescueDescendRateHelp"></div>
</label>
</div>
<div class="number">
<div class="number">
<label> <input type="number" name="gps_rescue_throttle_min" min="1000" max="2000" /> <span
i18n="failsafeGpsRescueItemThrottleMin"></span>
</label>
@ -152,22 +174,20 @@
<div class="number">
<label> <input type="number" name="gps_rescue_throttle_max" min="1000" max="2000" /> <span
i18n="failsafeGpsRescueItemThrottleMax"></span>
<div class="helpicon cf_tip" i18n_title="failsafeGpsRescueThrottleMaxHelp"></div>
</label>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_throttle_hover" min="1000" max="2000" /> <span
i18n="failsafeGpsRescueItemThrottleHover"></span>
</label>
<div class="helpicon cf_tip" i18n_title="failsafeGpsRescueThrottleHoverHelp"></div>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_ascend_rate" min="1.00" max="25.00" step="0.01" /> <span
i18n="failsafeGpsRescueItemAscendRate"></span>
</label>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_descend_rate" min="1.00" max="5.00" step="0.01" /> <span
i18n="failsafeGpsRescueItemDescendRate"></span>
<label> <input type="number" name="gps_rescue_min_start_dist" min="50" max="1000" /> <span
i18n="failsafeGpsRescueItemMinDth"></span>
</label>
<div class="helpicon cf_tip" i18n_title="failsafeGpsRescueItemMinDthHelp"></div>
</div>
<div class="number">
<label> <input type="number" name="gps_rescue_min_sats" min="5" max="50" /> <span
@ -178,16 +198,7 @@
<label> <input type="checkbox" name="gps_rescue_allow_arming_without_fix" class="toggle" /> <span
i18n="failsafeGpsRescueItemAllowArmingWithoutFix"></span>
</label>
</div>
<div class="number">
<label>
<select id="failsafeGpsRescueItemAltitudeSelect" class="switchMode" name="gps_rescue_altitude_mode">
<option value="0" i18n="failsafeGpsRescueItemAltitudeModeMaxAlt"></option>
<option value="1" i18n="failsafeGpsRescueItemAltitudeModeFixedAlt"></option>
<option value="2" i18n="failsafeGpsRescueItemAltitudeModeCurrentAlt"></option>
</select>
<span i18n="failsafeGpsRescueItemAltitudeMode"></span>
</label>
<div class="helpicon cf_tip" i18n_title="failsafeGpsRescueArmWithoutFixHelp"></div>
</div>
<div class="number">
<label>