1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-25 01:05:12 +03:00

Merge branch 'master' into change-profiles-with-programmin

This commit is contained in:
Darren Lines 2021-10-28 18:48:54 +01:00
commit 03e569dd7c
11 changed files with 204 additions and 213 deletions

View file

@ -68,6 +68,8 @@ in the `./dist/` directory.
directory. Running this task on macOS or Linux requires Wine, since it's needed to set the icon directory. Running this task on macOS or Linux requires Wine, since it's needed to set the icon
for the Windows app. If you don't have Wine installed you can create a release by running the **release-only-linux** task. for the Windows app. If you don't have Wine installed you can create a release by running the **release-only-linux** task.
To build a specific release, use the command `release --platform="win64"` for example.
## Different map providers ## Different map providers
INAV Configurator 2.1 allows to choose between OpenStreetMap, Bing Maps, and MapProxy map providers. INAV Configurator 2.1 allows to choose between OpenStreetMap, Bing Maps, and MapProxy map providers.

View file

@ -2230,9 +2230,6 @@
"accLpfCutoffFrequency": { "accLpfCutoffFrequency": {
"message": "Accelerometer LPF cutoff frequency" "message": "Accelerometer LPF cutoff frequency"
}, },
"accLpfCutoffFrequencyHelp": {
"message": "Software-based filter to remove mechanical vibrations from the accelerometer measurements. Value is cutoff frequency (Hz). For larger frames with bigger props set to lower value."
},
"dtermLpfCutoffFrequency": { "dtermLpfCutoffFrequency": {
"message": "D-term LPF cutoff frequency" "message": "D-term LPF cutoff frequency"
}, },
@ -3514,6 +3511,12 @@
"confirm_delete_point_with_options": { "confirm_delete_point_with_options": {
"message": "Do you really want to delete this Waypoint with non-Geo JUMP/SET_HEAD/RTH options? \nIf yes, Non-Geo options attached will be removed also!" "message": "Do you really want to delete this Waypoint with non-Geo JUMP/SET_HEAD/RTH options? \nIf yes, Non-Geo options attached will be removed also!"
}, },
"no_waypoints_to_load": {
"message": "No waypoints to load !"
},
"no_waypoints_to_save": {
"message": "No waypoints to save !"
},
"servoMixer": { "servoMixer": {
"message": "Servo mixer" "message": "Servo mixer"
}, },
@ -3838,12 +3841,6 @@
"rpm_gyro_min_hz": { "rpm_gyro_min_hz": {
"message": "Gyro RPM filter min. frequency" "message": "Gyro RPM filter min. frequency"
}, },
"acc_lpf_type": {
"message": "Accelerometer LPF type"
},
"acc_lpf_type_help": {
"message": "BIQUAD offers better noise attenuation for a price of higher delay. PT1 has lower attenuation but offers lower delay."
},
"dTermMechanics": { "dTermMechanics": {
"message": "D-term mechanics" "message": "D-term mechanics"
}, },
@ -3880,18 +3877,6 @@
"iTermMechanics": { "iTermMechanics": {
"message": "I-term mechanics" "message": "I-term mechanics"
}, },
"airmode_type": {
"message": "Airmode handling type"
},
"airmode_type_help": {
"message": "Defines the Airmode state handling type. <br />Default STICK_CENTER is the classical approach in which Airmode is always active if enabled, but when the throttle is low and ROLL/PITCH/YAW sticks are centered, Iterms is not allowed to grow (ANTI_WINDUP). <br />STICK_CENTER_ONCE works like STICK_CENTER, but only until the first time THROTTLE is not low and ROLL/PITCH/YAW sticks are moved. After that, ANTI_WINDUP is deactivated until next arm. Useful for airplanes. <br />THROTTLE_THRESHOLD is the Airmode behavior known from Betaflight. In this mode, Airmode is active as soon THROTTLE position is above <i>airmode_throttle_threshold</i> and stays active until disarm. ANTI_WINDUP is never triggered. For small Multirotors (up to 7-inch propellers) it is suggested to switch to THROTTLE_THRESHOLD since it keeps full stabilization no matter what pilot does with the sticks. Airplanes default to STICK_CENTER_ONCE mode."
},
"airmode_throttle_threshold": {
"message": "Airmode Throttle threshold"
},
"airmode_throttle_threshold_help": {
"message": "Defines airmode THROTTLE activation threshold when airmode_type THROTTLE_THRESHOLD is used"
},
"gps_map_center": { "gps_map_center": {
"message": "Center" "message": "Center"
}, },

View file

@ -77,6 +77,10 @@ helper.defaultsDialog = (function () {
key: "setpoint_kalman_q", key: "setpoint_kalman_q",
value: 200 value: 200
}, },
{
key: "smith_predictor_delay", // Enable Smith Predictor
value: 1.5
},
/* /*
Mechanics Mechanics
*/ */

View file

@ -137,7 +137,7 @@ let Waypoint = function (number, action, lat, lon, alt=0, p1=0, p2=0, p3=0, endM
}; };
self.getElevation = async function (globalSettings) { self.getElevation = async function (globalSettings) {
let elevation; let elevation = "N/A";
if (globalSettings.mapProviderType == 'bing') { if (globalSettings.mapProviderType == 'bing') {
let elevationEarthModel = $('#elevationEarthModel').prop("checked") ? "sealevel" : "ellipsoid"; let elevationEarthModel = $('#elevationEarthModel').prop("checked") ? "sealevel" : "ellipsoid";
@ -146,7 +146,11 @@ let Waypoint = function (number, action, lat, lon, alt=0, p1=0, p2=0, p3=0, endM
elevation = myJson.resourceSets[0].resources[0].elevations[0]; elevation = myJson.resourceSets[0].resources[0].elevations[0];
} }
else { else {
elevation = "N/A"; const response = await fetch('https://api.opentopodata.org/v1/aster30m?locations='+self.getLatMap()+','+self.getLonMap());
const myJson = await response.json();
if (myJson.status == "OK" && myJson.results[0].elevation != null) {
elevation = myJson.results[0].elevation;
}
} }
return elevation; return elevation;
} }

View file

@ -72,7 +72,7 @@ let WaypointCollection = function () {
}; };
self.isEmpty = function () { self.isEmpty = function () {
return data == []; return data.length == 0;
}; };
self.flush = function () { self.flush = function () {
@ -414,15 +414,28 @@ let WaypointCollection = function () {
let lengthMission = self.getDistance(true); let lengthMission = self.getDistance(true);
let totalMissionDistance = lengthMission[lengthMission.length -1].toFixed(1); let totalMissionDistance = lengthMission[lengthMission.length -1].toFixed(1);
let samples; let samples;
let sampleMaxNum;
let sampleDistance;
if (globalSettings.mapProviderType == 'bing') {
sampleMaxNum = 1024;
sampleDistance = 30;
} else { // use opentopodata.org instead
sampleMaxNum = 99;
sampleDistance = 60;
}
if (point2measure.length <= 2){ if (point2measure.length <= 2){
samples = 1; samples = 1;
} }
else if (Math.trunc(totalMissionDistance/30) <= 1024 && point2measure.length > 2){ else if (Math.trunc(totalMissionDistance / sampleDistance) <= sampleMaxNum && point2measure.length > 2){
samples = Math.trunc(totalMissionDistance/30); samples = Math.trunc(totalMissionDistance / sampleDistance);
} }
else { else {
samples = 1024; samples = sampleMaxNum;
} }
let elevation = "N/A";
if (globalSettings.mapProviderType == 'bing') { if (globalSettings.mapProviderType == 'bing') {
let elevationEarthModel = $('#elevationEarthModel').prop("checked") ? "sealevel" : "ellipsoid"; let elevationEarthModel = $('#elevationEarthModel').prop("checked") ? "sealevel" : "ellipsoid";
@ -438,7 +451,23 @@ let WaypointCollection = function () {
} }
} }
else { else {
elevation = "N/A"; let coordList = "";
point2measure.forEach(function (item) {
coordList += item + '|';
});
const response = await fetch('https://api.opentopodata.org/v1/aster30m?locations='+coordList+'&samples='+String(samples+1));
const myJson = await response.json();
if (myJson.status == "OK") {
elevation = [];
for (var i = 0; i < myJson.results.length; i++){
if (myJson.results[i].elevation == null) {
elevation[i] = 0;
} else {
elevation[i] = myJson.results[i].elevation;
}
}
}
} }
//console.log("elevation ", elevation); //console.log("elevation ", elevation);
return [lengthMission, totalMissionDistance, samples, elevation, altPoint2measure, namePoint2measure, refPoint2measure]; return [lengthMission, totalMissionDistance, samples, elevation, altPoint2measure, namePoint2measure, refPoint2measure];

View file

@ -48,6 +48,21 @@
border-spacing: 0; border-spacing: 0;
} }
.tab-auxiliary .modeSection > td {
background-color: #f9f9f9;
vertical-align: top;
padding-bottom: 5px;
}
.tab-auxiliary .modeSectionArea {
background-color: #37a8db;
color: white;
font-weight: bold;
font-size: 1.1em;
text-shadow: 0 1px rgba(0, 0, 0, 0.5);
padding: 5px;
}
.tab-auxiliary .mode { .tab-auxiliary .mode {
background-color: #f9f9f9; background-color: #f9f9f9;
vertical-align: top; vertical-align: top;

View file

@ -61,4 +61,9 @@
<a class="deleteRange" href="#">&nbsp;</a> <a class="deleteRange" href="#">&nbsp;</a>
</div> </div>
</div> </div>
<table>
<tr class="modeSection">
<td colspan="2"><div class="modeSectionArea"><p class="modeSectionName"></p></div></td>
</tr>
</table>
</div> </div>

View file

@ -36,20 +36,30 @@ TABS.auxiliary.initialize = function (callback) {
MSP.send_message(MSPCodes.MSP_BOXNAMES, false, false, get_mode_ranges); MSP.send_message(MSPCodes.MSP_BOXNAMES, false, false, get_mode_ranges);
const modeSections = {};
modeSections["ARM"] = "Arming";
modeSections["ANGLE"] = "Flight Modes";
modeSections["NAV COURSE HOLD"] = "Navigation Modes";
modeSections["NAV ALTHOLD"] = "Flight Mode Modifiers";
modeSections["AUTO TUNE"] = "Fixed Wing";
modeSections["FPV ANGLE MIX"] = "Multi-rotor";
modeSections["OSD OFF"] = "OSD Modes";
modeSections["CAMSTAB"] = "FPV Camera Modes";
modeSections["BEEPER"] = "Misc Modes";
function sort_modes_for_display() { function sort_modes_for_display() {
// This array defines the order that the modes are displayed in the configurator modes page // This array defines the order that the modes are displayed in the configurator modes page
configuratorBoxOrder = [ const configuratorBoxOrder = [
"ARM", "PREARM", // Arming "ARM", "PREARM", // Arming
"ANGLE", "HORIZON", "MANUAL", // Flight modes "ANGLE", "HORIZON", "MANUAL", // Flight modes
"NAV RTH", "NAV POSHOLD", "NAV CRUISE", "NAV COURSE HOLD", // Navigation mode "NAV COURSE HOLD", "NAV CRUISE", "NAV POSHOLD", "NAV RTH", "NAV WP", "GCS NAV", // Navigation modes
"NAV ALTHOLD", "HEADING HOLD", "AIR MODE", // Flight mode modifiers "NAV ALTHOLD", "HEADING HOLD", "AIR MODE", // Flight mode modifiers
"NAV WP", "GCS NAV", "HOME RESET", // Navigation "AUTO TUNE", "SERVO AUTOTRIM", "AUTO LEVEL", "NAV LAUNCH", "LOITER CHANGE", "FLAPERON", "TURN ASSIST", // Fixed wing specific
"SERVO AUTOTRIM", "AUTO LEVEL", "AUTO TUNE", "NAV LAUNCH", "LOITER CHANGE", "FLAPERON", // Fixed wing specific "FPV ANGLE MIX", "TURTLE", "MC BRAKING", "SURFACE", "HEADFREE", "HEADADJ", // Multi-rotor specific
"TURTLE", "FPV ANGLE MIX", "TURN ASSIST", "MC BRAKING", "SURFACE", "HEADFREE", "HEADADJ", // Multi-rotor specific "OSD OFF", "OSD ALT 1", "OSD ALT 2", "OSD ALT 3", // OSD
"BEEPER", "LEDS OFF", "LIGHTS", // Feedback "CAMSTAB", "CAMERA CONTROL 1", "CAMERA CONTROL 2", "CAMERA CONTROL 3", // FPV Camera
"OSD OFF", "OSD ALT 1", "OSD ALT 2", "OSD ALT 3", // OSD "BEEPER", "LEDS OFF", "LIGHTS", "HOME RESET", "BLACKBOX", "FAILSAFE", "KILLSWITCH", "TELEMETRY", // Misc
"CAMSTAB", "CAMERA CONTROL 1", "CAMERA CONTROL 2", "CAMERA CONTROL 3", // FPV Camera "MSP RC OVERRIDE", "USER1", "USER2"
"BLACKBOX", "FAILSAFE", "KILLSWITCH", "TELEMETRY", "MSP RC OVERRIDE", "USER1", "USER2" // Misc
]; ];
// Sort the modes // Sort the modes
@ -98,6 +108,15 @@ TABS.auxiliary.initialize = function (callback) {
} }
} }
function createModeSection(sectionName) {
var modeSectionTemplate = $('#tab-auxiliary-templates .modeSection');
var newModeSection = modeSectionTemplate.clone();
$(newModeSection).attr('id', 'section-' + sectionName);
$(newModeSection).find('.modeSectionName').text(sectionName);
return newModeSection;
}
function createMode(modeIndex, modeId) { function createMode(modeIndex, modeId) {
var modeTemplate = $('#tab-auxiliary-templates .mode'); var modeTemplate = $('#tab-auxiliary-templates .mode');
var newMode = modeTemplate.clone(); var newMode = modeTemplate.clone();
@ -198,6 +217,11 @@ TABS.auxiliary.initialize = function (callback) {
var modeTableBodyElement = $('.tab-auxiliary .modes tbody') var modeTableBodyElement = $('.tab-auxiliary .modes tbody')
for (var modeIndex = 0; modeIndex < AUX_CONFIG.length; modeIndex++) { for (var modeIndex = 0; modeIndex < AUX_CONFIG.length; modeIndex++) {
if (AUX_CONFIG[modeIndex] in modeSections) {
var newSection = createModeSection(modeSections[AUX_CONFIG[modeIndex]]);
modeTableBodyElement.append(newSection);
}
var modeId = AUX_CONFIG_IDS[modeIndex]; var modeId = AUX_CONFIG_IDS[modeIndex];
var newMode = createMode(modeIndex, modeId); var newMode = createMode(modeIndex, modeId);
modeTableBodyElement.append(newMode); modeTableBodyElement.append(newMode);
@ -415,7 +439,11 @@ TABS.auxiliary.initialize = function (callback) {
if (modeElement.find(' .range').length == 0) { if (modeElement.find(' .range').length == 0) {
modeElement.toggle(!hideUnused); modeElement.toggle(!hideUnused);
} }
} }
$(".modeSection").each(function() {
$(this).toggle(!hideUnused);
});
} }
let hideUnusedModes = false; let hideUnusedModes = false;

View file

@ -975,8 +975,8 @@ TABS.mission_control.initialize = function (callback) {
map.addLayer(addWaypointMarker(element)); map.addLayer(addWaypointMarker(element));
} }
}); });
repaintLine4Waypoints(mission);
} }
repaintLine4Waypoints(mission);
} }
function redrawLayer() { function redrawLayer() {
@ -1503,22 +1503,17 @@ TABS.mission_control.initialize = function (callback) {
var altitudeMeters = app.ConvertCentimetersToMeters(selectedMarker.getAlt()); var altitudeMeters = app.ConvertCentimetersToMeters(selectedMarker.getAlt());
if (globalSettings.mapProviderType == 'bing') { if (tempSelectedMarkerIndex == null || tempSelectedMarkerIndex != selectedMarker.getLayerNumber()) {
$('#elevationAtWP').fadeIn(); (async () => {
$('#groundClearanceAtWP').fadeIn(); const elevationAtWP = await selectedMarker.getElevation(globalSettings);
if (tempSelectedMarkerIndex == null || tempSelectedMarkerIndex != selectedMarker.getLayerNumber()) { $('#elevationValueAtWP').text(elevationAtWP);
(async () => { const returnAltitude = checkAltElevSanity(false, selectedMarker.getAlt(), elevationAtWP, selectedMarker.getP3());
const elevationAtWP = await selectedMarker.getElevation(globalSettings); selectedMarker.setAlt(returnAltitude);
$('#elevationValueAtWP').text(elevationAtWP); plotElevation();
const returnAltitude = checkAltElevSanity(false, selectedMarker.getAlt(), elevationAtWP, selectedMarker.getP3()); })()
selectedMarker.setAlt(returnAltitude);
plotElevation();
})()
}
} else {
$('#elevationAtWP').fadeOut();
$('#groundClearanceAtWP').fadeOut();
} }
$('#elevationAtWP').fadeIn();
$('#groundClearanceAtWP').fadeIn();
$('#altitudeInMeters').text(` ${altitudeMeters}m`); $('#altitudeInMeters').text(` ${altitudeMeters}m`);
$('#pointLon').val(Math.round(coord[0] * 10000000) / 10000000); $('#pointLon').val(Math.round(coord[0] * 10000000) / 10000000);
@ -1789,33 +1784,31 @@ TABS.mission_control.initialize = function (callback) {
if (selectedMarker) { if (selectedMarker) {
const P3Value = selectedMarker.getP3(); const P3Value = selectedMarker.getP3();
selectedMarker.setP3( $('#pointP3').prop("checked") ? 1.0 : 0.0); selectedMarker.setP3( $('#pointP3').prop("checked") ? 1.0 : 0.0);
if (globalSettings.mapProviderType == 'bing') { (async () => {
(async () => { const elevationAtWP = await selectedMarker.getElevation(globalSettings);
const elevationAtWP = await selectedMarker.getElevation(globalSettings); $('#elevationValueAtWP').text(elevationAtWP);
$('#elevationValueAtWP').text(elevationAtWP); var altitude = Number($('#pointAlt').val());
var altitude = Number($('#pointAlt').val()); if (P3Value != selectedMarker.getP3()) {
if (P3Value != selectedMarker.getP3()) { if ($('#pointP3').prop("checked")) {
if ($('#pointP3').prop("checked")) { if (altitude < 0) {
if (altitude < 0) { altitude = settings.alt;
altitude = settings.alt;
}
selectedMarker.setAlt(altitude + elevationAtWP * 100);
} else {
selectedMarker.setAlt(altitude - Number(elevationAtWP) * 100);
} }
selectedMarker.setAlt(altitude + elevationAtWP * 100);
} else {
selectedMarker.setAlt(altitude - Number(elevationAtWP) * 100);
} }
const returnAltitude = checkAltElevSanity(false, selectedMarker.getAlt(), elevationAtWP, selectedMarker.getP3()); }
selectedMarker.setAlt(returnAltitude); const returnAltitude = checkAltElevSanity(false, selectedMarker.getAlt(), elevationAtWP, selectedMarker.getP3());
$('#pointAlt').val(selectedMarker.getAlt()); selectedMarker.setAlt(returnAltitude);
altitudeMeters = app.ConvertCentimetersToMeters(selectedMarker.getAlt()); $('#pointAlt').val(selectedMarker.getAlt());
$('#altitudeInMeters').text(` ${altitudeMeters}m`); altitudeMeters = app.ConvertCentimetersToMeters(selectedMarker.getAlt());
$('#altitudeInMeters').text(` ${altitudeMeters}m`);
mission.updateWaypoint(selectedMarker); mission.updateWaypoint(selectedMarker);
mission.update(); mission.update();
redrawLayer(); redrawLayer();
plotElevation(); plotElevation();
})() })()
}
} }
}); });
@ -1996,30 +1989,35 @@ TABS.mission_control.initialize = function (callback) {
removeAllWaypoints(); removeAllWaypoints();
$(this).addClass('disabled'); $(this).addClass('disabled');
GUI.log('Start get point'); GUI.log('Start get point');
getWaypointsFromFC(); getWaypointsFromFC(false);
GUI.log('End get point');
$('#loadMissionButton').removeClass('disabled');
}); });
$('#saveMissionButton').on('click', function () { $('#saveMissionButton').on('click', function () {
if (!mission.get().length) {
alert(chrome.i18n.getMessage('no_waypoints_to_save'));
return;
}
$(this).addClass('disabled'); $(this).addClass('disabled');
GUI.log('Start send point'); GUI.log('Start send point');
sendWaypointsToFC(); sendWaypointsToFC(false);
GUI.log('End send point');
$('#saveMissionButton').removeClass('disabled');
}); });
$('#loadEepromMissionButton').on('click', function () { $('#loadEepromMissionButton').on('click', function () {
if (markers.length && !confirm(chrome.i18n.getMessage('confirm_delete_all_points'))) return; if (markers.length && !confirm(chrome.i18n.getMessage('confirm_delete_all_points'))) return;
removeAllWaypoints(); removeAllWaypoints();
MSP.send_message(MSPCodes.MSP_WP_MISSION_LOAD, [0], getWaypointsFromFC); $(this).addClass('disabled');
GUI.log('Start get point');
getWaypointsFromFC(true);
}); });
$('#saveEepromMissionButton').on('click', function () { $('#saveEepromMissionButton').on('click', function () {
if (!mission.get().length) {
alert(chrome.i18n.getMessage('no_waypoints_to_save'));
return;
}
$(this).addClass('disabled'); $(this).addClass('disabled');
GUI.log('Start send point'); GUI.log('Start send point');
sendWaypointsToFC(); sendWaypointsToFC(true);
}); });
///////////////////////////////////////////// /////////////////////////////////////////////
@ -2225,30 +2223,51 @@ TABS.mission_control.initialize = function (callback) {
// Load/Save FC mission Toolbox // Load/Save FC mission Toolbox
// //
///////////////////////////////////////////// /////////////////////////////////////////////
function getWaypointsFromFC() { function getWaypointsFromFC(loadEeprom) {
mspHelper.loadWaypoints(function() { if (loadEeprom) {
GUI.log(chrome.i18n.getMessage('eeprom_load_ok')); MSP.send_message(MSPCodes.MSP_WP_MISSION_LOAD, [0], getWaypointData);
mission.reinit(); } else {
mission.copy(MISSION_PLANER); getWaypointData();
mission.update(true); }
var coord = ol.proj.fromLonLat([mission.getWaypoint(0).getLonMap(), mission.getWaypoint(0).getLatMap()]);
map.getView().setCenter(coord); function getWaypointData() {
map.getView().setZoom(16); mspHelper.loadWaypoints(function() {
redrawLayers(); GUI.log('End get point');
updateTotalInfo(); if (loadEeprom) {
}); GUI.log(chrome.i18n.getMessage('eeprom_load_ok'));
$('#loadEepromMissionButton').removeClass('disabled');
} else {
$('#loadMissionButton').removeClass('disabled');
}
if (!MISSION_PLANER.getCountBusyPoints()) {
alert(chrome.i18n.getMessage('no_waypoints_to_load'));
return;
}
mission.reinit();
mission.copy(MISSION_PLANER);
mission.update(true);
var coord = ol.proj.fromLonLat([mission.getWaypoint(0).getLonMap(), mission.getWaypoint(0).getLatMap()]);
map.getView().setCenter(coord);
map.getView().setZoom(16);
redrawLayers();
updateTotalInfo();
});
};
} }
function sendWaypointsToFC() { function sendWaypointsToFC(saveEeprom) {
MISSION_PLANER.reinit(); MISSION_PLANER.reinit();
MISSION_PLANER.copy(mission); MISSION_PLANER.copy(mission);
MISSION_PLANER.update(true, true); MISSION_PLANER.update(true, true);
mspHelper.saveWaypoints(function() { mspHelper.saveWaypoints(function() {
GUI.log('End send point'); GUI.log('End send point');
$('#saveEepromMissionButton').removeClass('disabled'); if (saveEeprom) {
GUI.log(chrome.i18n.getMessage('eeprom_saved_ok')); $('#saveEepromMissionButton').removeClass('disabled');
MSP.send_message(MSPCodes.MSP_WP_MISSION_SAVE, [0], false); GUI.log(chrome.i18n.getMessage('eeprom_saved_ok'));
MSP.send_message(MSPCodes.MSP_WP_MISSION_SAVE, [0], false);
} else {
$('#saveMissionButton').removeClass('disabled');
}
mission.setMaxWaypoints(MISSION_PLANER.getMaxWaypoints()); mission.setMaxWaypoints(MISSION_PLANER.getMaxWaypoints());
mission.setValidMission(MISSION_PLANER.getValidMission()); mission.setValidMission(MISSION_PLANER.getValidMission());
mission.setCountBusyPoints(MISSION_PLANER.getCountBusyPoints()); mission.setCountBusyPoints(MISSION_PLANER.getCountBusyPoints());
@ -2286,10 +2305,6 @@ TABS.mission_control.initialize = function (callback) {
/* resetAltitude = true : For selected WPs only. Changes WP Altitude value back to previous value if setting below ground level. /* resetAltitude = true : For selected WPs only. Changes WP Altitude value back to previous value if setting below ground level.
^ resetAltitude = false : changes WP Altitude to value required to give ground clearance = default Altitude setting */ ^ resetAltitude = false : changes WP Altitude to value required to give ground clearance = default Altitude setting */
function checkAltElevSanity(resetAltitude, checkAltitude, elevation, P3Datum) { function checkAltElevSanity(resetAltitude, checkAltitude, elevation, P3Datum) {
if (globalSettings.mapProviderType != 'bing') {
return checkAltitude;
}
let groundClearance = "NO HOME"; let groundClearance = "NO HOME";
let altitude = checkAltitude; let altitude = checkAltitude;
if (P3Datum) { if (P3Datum) {

View file

@ -270,68 +270,39 @@
<div class="helpicon cf_tip" data-i18n_title="gyro_main_lpf_hz_help"></div> <div class="helpicon cf_tip" data-i18n_title="gyro_main_lpf_hz_help"></div>
</td> </td>
</tr> </tr>
<tr class="hides-v2_5"> <tr>
<th>Gyro Dynamic Notch Filter</th>
<td>
<div style="padding-left: 1em; line-height: 28px;">
<input type="checkbox" data-bit="5" class="feature toggle" name="DYNAMIC_FILTERS" title="DYNAMIC_FILTERS" id="feature-5">
</div>
</td>
</tr>
<tr class="hides-v2_5">
<th>Gyro Dynamic Notch Width</th>
<td>
<input data-setting="dyn_notch_width_percent" type="number" class="rate-tpa_input" />
<div class="helpicon cf_tip" title="Sets the distance in percent between dynamic gyro notches. Set to 0 to use single dynamic gyro notch."></div>
</td>
</tr>
<tr class="hides-v2_5">
<th>Gyro Dynamic Notch Min Frequency</th>
<td>
<input data-setting="dyn_notch_min_hz" type="number" class="rate-tpa_input" />
<div class="helpicon cf_tip" title="Minimum frequency for dynamic gyro notch filters. Value should depends on propeller size. 150Hz work fine with 5&quot; and smaller. For 7&quot; and above lower even below 100Hz."></div>
</td>
</tr>
<tr class="requires-v2_5">
<th>Matrix Gyro Filter</th> <th>Matrix Gyro Filter</th>
<td> <td>
<select data-setting="dynamic_gyro_notch_enabled" /> <select data-setting="dynamic_gyro_notch_enabled" />
<div class="helpicon cf_tip" data-i18n_title="dynamic_gyro_notch_enabled_help"></div> <div class="helpicon cf_tip" data-i18n_title="dynamic_gyro_notch_enabled_help"></div>
</td> </td>
</tr> </tr>
<tr class="requires-v2_5"> <tr>
<th>Matrix Filter Min Frequency</th> <th>Matrix Filter Min Frequency</th>
<td> <td>
<input data-setting="dynamic_gyro_notch_min_hz" type="number" class="rate-tpa_input" /> <input data-setting="dynamic_gyro_notch_min_hz" type="number" class="rate-tpa_input" />
<div class="helpicon cf_tip" title="Minimum frequency for the Matrix Filter. Value should depends on propeller size. 150Hz work fine with 5&quot; and smaller. For 7&quot; and above lower even below 100Hz."></div> <div class="helpicon cf_tip" title="Minimum frequency for the Matrix Filter. Value should depends on propeller size. 150Hz work fine with 5&quot; and smaller. For 7&quot; and above lower even below 100Hz."></div>
</td> </td>
</tr> </tr>
<tr class="requires-v2_5"> <tr>
<th>Matrix Filter Q Factor</th> <th>Matrix Filter Q Factor</th>
<td> <td>
<input data-setting="dynamic_gyro_notch_q" type="number" class="rate-tpa_input" /> <input data-setting="dynamic_gyro_notch_q" type="number" class="rate-tpa_input" />
<div class="helpicon cf_tip" title="The higher value, the higher selectivity of the Matrix Filter. Values between 150 and 300 are recommended"></div> <div class="helpicon cf_tip" title="The higher value, the higher selectivity of the Matrix Filter. Values between 150 and 300 are recommended"></div>
</td> </td>
</tr> </tr>
<tr class="requires-v2_5"> <tr>
<th>Unicorn Filter</th> <th>Unicorn Filter</th>
<td> <td>
<select data-setting="setpoint_kalman_enabled" /> <select data-setting="setpoint_kalman_enabled" />
</td> </td>
</tr> </tr>
<tr class="requires-v2_6"> <tr>
<th>Unicorn Filter Q Factor</th> <th>Unicorn Filter Q Factor</th>
<td> <td>
<input data-setting="setpoint_kalman_q" type="number" class="rate-tpa_input" /> <input data-setting="setpoint_kalman_q" type="number" class="rate-tpa_input" />
</td> </td>
</tr> </tr>
<tr class="requires-v2_6">
<th>Unicorn Filter Window Size</th>
<td>
<input data-setting="setpoint_kalman_w" type="number" class="rate-tpa_input" />
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>
@ -379,39 +350,6 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="clear-both"></div>
<div class="tab_subtitle" data-i18n="tabFilteringAdvanced" style="margin-top: 1em;"></div>
<div class="cf_column">
<table class="settings-table settings-table--filtering">
<tbody>
<tr>
<th data-i18n="accLpfCutoffFrequency"></th>
<td>
<input type="number" id="accSoftLpfHz" class="rate-tpa_input" step="1" min="0"
max="200" /> Hz
<div class="helpicon cf_tip" data-i18n_title="accLpfCutoffFrequencyHelp"></div>
</td>
</tr>
<tr>
<th data-i18n="acc_lpf_type"></th>
<td>
<select data-setting="acc_lpf_type" />
<div class="helpicon cf_tip" data-i18n_title="acc_lpf_type_help"></div>
</td>
</tr>
<tr>
<th data-i18n="yawLpfCutoffFrequency"></th>
<td>
<input type="number" id="yawLpfHz" class="rate-tpa_input" step="1" min="0" max="200" />
Hz
<div class="helpicon cf_tip" data-i18n_title="yawLpfCutoffFrequencyHelp"></div>
</td>
</tr>
</tbody>
</table>
</div>
</div> </div>
<div id="subtab-mechanics" class="subtab__content"> <div id="subtab-mechanics" class="subtab__content">
@ -420,20 +358,6 @@
<div class="cf_column"> <div class="cf_column">
<table class="settings-table settings-table--filtering"> <table class="settings-table settings-table--filtering">
<tbody> <tbody>
<tr>
<th data-i18n="airmode_type"></th>
<td>
<select data-setting="airmode_type" />
<div class="helpicon cf_tip" data-i18n_title="airmode_type_help"></div>
</td>
</tr>
<tr>
<th data-i18n="airmode_throttle_threshold"></th>
<td>
<select data-setting="airmode_throttle_threshold" />
<div class="helpicon cf_tip" data-i18n_title="airmode_throttle_threshold_help"></div>
</td>
</tr>
<tr> <tr>
<th data-i18n="itermRelax"></th> <th data-i18n="itermRelax"></th>
<td> <td>

View file

@ -123,14 +123,6 @@ TABS.pid_tuning.initialize = function (callback) {
$('.requires-v2_4').hide(); $('.requires-v2_4').hide();
} }
if (semver.gte(CONFIG.flightControllerVersion, "2.5.0")) {
$('.requires-v2_5').show();
$('.hides-v2_5').hide();
} else {
$('.requires-v2_5').hide();
$('.hides-v2_5').show();
}
if (semver.gte(CONFIG.flightControllerVersion, "2.6.0")) { if (semver.gte(CONFIG.flightControllerVersion, "2.6.0")) {
$('.requires-v2_6').show(); $('.requires-v2_6').show();
$('.hides-v2_6').hide(); $('.hides-v2_6').hide();
@ -161,26 +153,14 @@ TABS.pid_tuning.initialize = function (callback) {
pid_and_rc_to_form(); pid_and_rc_to_form();
var $magHoldYawRate = $("#magHoldYawRate"), let $magHoldYawRate = $("#magHoldYawRate");
$accSoftLpfHz = $('#accSoftLpfHz'),
$yawLpfHz = $('#yawLpfHz');
$magHoldYawRate.val(INAV_PID_CONFIG.magHoldRateLimit); $magHoldYawRate.val(INAV_PID_CONFIG.magHoldRateLimit);
$accSoftLpfHz.val(INAV_PID_CONFIG.accSoftLpfHz);
$yawLpfHz.val(FILTER_CONFIG.yawLpfHz);
$magHoldYawRate.change(function () { $magHoldYawRate.change(function () {
INAV_PID_CONFIG.magHoldRateLimit = parseInt($magHoldYawRate.val(), 10); INAV_PID_CONFIG.magHoldRateLimit = parseInt($magHoldYawRate.val(), 10);
}); });
$accSoftLpfHz.change(function () {
INAV_PID_CONFIG.accSoftLpfHz = parseInt($accSoftLpfHz.val(), 10);
});
$yawLpfHz.change(function () {
FILTER_CONFIG.yawLpfHz = parseInt($yawLpfHz.val(), 10);
});
if (!FC.isRpyFfComponentUsed()) { if (!FC.isRpyFfComponentUsed()) {
$('.rpy_ff').prop('disabled', 'disabled'); $('.rpy_ff').prop('disabled', 'disabled');
} }