1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-23 16:25:19 +03:00
inav-configurator/tabs/profiles.js
Alberto García Hierro 0e01133fc9 Make tab loading async safe and add a small animation
Tab loading was relying on replacing the contents of '#content'
with the loading indicator, then replacing it with the loading tab
content and blocking rendering until the tab was ready by not
yielding. This is problematic for tabs that load some data
asynchronously, like PID and OSD.

Instead, put the loading indicator in front of everything else
and load new content inside '#content' next to the loading indicator
(but without showing it). Once the content and data are fully loaded
we fade out the loading indicator with a 0.4s long animation and
then we remove. This works for both synchronous and asynchonous
loading of tabs.
2020-01-21 18:19:06 +00:00

779 lines
35 KiB
JavaScript

'use strict';
var presets = presets || {};
presets.elementHelper = function (group, field, value) {
return {
group: group,
field: field,
value: value
}
};
presets.defaultValues = {
PIDs: {
mr: [
[40, 30, 23, 0], //PID_ROLL
[40, 30, 23, 0], //PID_PITCH
[85, 45, 0, 0], //PID_YAW
[50, 0, 0, 0], //PID_POS_Z
[65, 120, 10, 0], //PID_POS_XY
[40, 15, 100, 40], //PID_VEL_XY
[0, 0, 0, 0], //PID_SURFACE
[20, 15, 75, 0], //PID_LEVEL
[60, 0, 0, 0], //PID_HEADING
[100, 50, 10, 0] //PID_VEL_Z
],
fw: [
[5, 7, 0, 50], //PID_ROLL
[5, 7, 0, 50], //PID_PITCH
[6, 10, 0, 60], //PID_YAW
[40, 5, 10, 0], //PID_POS_Z
[75, 5, 8, 0], //PID_POS_XY
[0, 0, 0, 0], //PID_VEL_XY
[0, 0, 0, 0], //PID_SURFACE
[20, 5, 75, 0], //PID_LEVEL
[60, 0, 0, 0], //PID_HEADING
[0, 0, 0, 0] //PID_VEL_Z
]},
INAV_PID_CONFIG: {"asynchronousMode": "0", "accelerometerTaskFrequency": 500, "attitudeTaskFrequency": 250, "magHoldRateLimit": 90, "magHoldErrorLpfFrequency": 2, "yawJumpPreventionLimit": 200, "gyroscopeLpf": "3", "accSoftLpfHz": 15},
ADVANCED_CONFIG: {"gyroSyncDenominator": 2, "pidProcessDenom": 1, "useUnsyncedPwm": 1, "motorPwmProtocol": 0, "motorPwmRate": 400, "servoPwmRate": 50, "gyroSync": 1},
RC_tuning: {"RC_RATE": 1, "RC_EXPO": 0.7, "roll_pitch_rate": 0, "roll_rate": 200, "pitch_rate": 200, "yaw_rate": 200, "dynamic_THR_PID": 0, "throttle_MID": 0.5, "throttle_EXPO": 0, "dynamic_THR_breakpoint": 1500, "RC_YAW_EXPO": 0.2},
PID_ADVANCED: {"rollPitchItermIgnoreRate": 200, "yawItermIgnoreRate": 50, "yawPLimit": 300, "axisAccelerationLimitRollPitch": 0, "axisAccelerationLimitYaw": 1000},
FILTER_CONFIG: {"gyroSoftLpfHz": 60, "dtermLpfHz": 40, "yawLpfHz": 30, "gyroNotchHz1": 0, "gyroNotchCutoff1": 0, "dtermNotchHz": 0, "dtermNotchCutoff": 0, "gyroNotchHz2": 0, "gyroNotchCutoff2": 0, "accNotchHz": 0, "accNotchCutoff": 0, "gyroStage2LowpassHz": 0},
FC_CONFIG: {"loopTime": 1000},
MIXER_CONFIG: {
"yawMotorDirection": 1,
"yawJumpPreventionLimit": 200,
"platformType": 0,
"hasFlaps": false
}
};
presets.settings = {
COMMON: {
},
FW: {
"small_angle": 180,
},
MR: {
},
get: function(mixerType) {
var settings = {};
$.extend(settings, presets.settings.COMMON);
if (mixerType == 'multirotor') {
$.extend(settings, presets.settings.MR);
} else {
$.extend(settings, presets.settings.FW);
}
return settings;
},
}
/*
* When defining a preset, following fields are required:
*
* BF_CONFIG::mixerConfiguration
* MIXER_CONFIG::platformType
*
*/
/**
* When defining a preset, following fields are required:
*
* BF_CONFIG::mixerConfiguration
*
* @type {{name: string, description: string, features: string[], applyDefaults: string[], settings: *[], type: string}[]}
*/
presets.presets = [
{
name: 'Default Preset',
description: "INAV Quad X configuration",
features: ["Default INAV Settings"],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
presets.elementHelper("MIXER_CONFIG", "platformType", 0)
],
type: 'multirotor'
},
{
name: '5" Racer',
description: "210-250 class racer with F3/F4/F7 CPU on 4S battery<br>" +
"<span>400g-650g weight, 2000KV - 2600KV motors, 5 inch propellers, MPU6000 or MPU6050 gyro, acro flight optimized</span>",
features: [
"Asynchronous processing",
"OneShot125 at 2kHz",
"750dps rates",
"Dterm and gyro notch filter",
"Increased LPF cutoff frequencies",
"Improved PID defaults"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
presets.elementHelper("MIXER_CONFIG", "platformType", 0),
presets.elementHelper("FC_CONFIG", "loopTime", 500),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmProtocol", 1),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmRate", 2000),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 90),
presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 90),
presets.elementHelper("RC_tuning", "roll_rate", 750),
presets.elementHelper("RC_tuning", "pitch_rate", 750),
presets.elementHelper("RC_tuning", "yaw_rate", 750),
presets.elementHelper("RC_tuning", "RC_YAW_EXPO", 0.7),
presets.elementHelper("FILTER_CONFIG", "dtermNotchHz", 260),
presets.elementHelper("FILTER_CONFIG", "dtermNotchCutoff", 160),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz1", 400),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff1", 300),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz2", 200),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff2", 100),
presets.elementHelper("FILTER_CONFIG", "yawLpfHz", 0),
presets.elementHelper("PIDs", 0, [36, 40, 20, 0]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [48, 50, 22, 0]), //PITCH PIDs
presets.elementHelper("PIDs", 2, [70, 45, 0, 0]) //YAW PIDs
],
type: 'multirotor'
},
{
name: '5" Performance',
description: "210-220 class racer with F4/F7 CPU on 4S battery<br>" +
"<span>450g-600g weight, 2300KV - 2600KV motors, 5 inch triblade propellers, MPU6000 or MPU6050 gyro.</span>" +
"<strong>This preset uses agressive filter tuning. Check motor temperature! Do not use bent propellers or motors</strong>",
features: [
"8kHz / 4kHz / 4kHz",
"Multishot",
"750dps rates",
"RC FIR2 stage 2 gyro filter",
"Increased LPF cutoff frequencies",
"Improved PID defaults"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
presets.elementHelper("MIXER_CONFIG", "platformType", 0),
presets.elementHelper("FC_CONFIG", "loopTime", 250),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmProtocol", 3),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmRate", 4000),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 100),
presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 95),
presets.elementHelper("RC_tuning", "roll_rate", 750),
presets.elementHelper("RC_tuning", "pitch_rate", 750),
presets.elementHelper("RC_tuning", "yaw_rate", 750),
presets.elementHelper("RC_tuning", "RC_YAW_EXPO", 0.7),
presets.elementHelper("FILTER_CONFIG", "yawLpfHz", 0),
presets.elementHelper("FILTER_CONFIG", "gyroStage2LowpassHz", 220),
presets.elementHelper("PIDs", 0, [32, 45, 23, 0]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [38, 54, 25, 0]), //PITCH PIDs
presets.elementHelper("PIDs", 2, [75, 45, 0, 0]) //YAW PIDs
],
type: 'multirotor'
},
{
name: '5" GPS',
description: "210-250 class quadcopter with F4/F7 CPU on 3S or 4S battery<br>" +
"<span>500g-700g weight, 2000KV - 2600KV motors, 5 inch propellers, MPU6000 or MPU6050 gyro, GPS optimized</span>",
features: [
"OneShot125 at 1kHz",
"500dps rates",
"Dterm and gyro notch filter",
"Increased LPF cutoff frequencies",
"Improved PID defaults"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
presets.elementHelper("MIXER_CONFIG", "platformType", 0),
presets.elementHelper("FC_CONFIG", "loopTime", 500),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmProtocol", 1),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmRate", 1000),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 90),
presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 80),
presets.elementHelper("RC_tuning", "roll_rate", 500),
presets.elementHelper("RC_tuning", "pitch_rate", 500),
presets.elementHelper("RC_tuning", "yaw_rate", 450),
presets.elementHelper("FILTER_CONFIG", "yawLpfHz", 0),
presets.elementHelper("FILTER_CONFIG", "dtermNotchHz", 200),
presets.elementHelper("FILTER_CONFIG", "dtermNotchCutoff", 100),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz1", 200),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff1", 100),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz2", 0),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff2", 1),
presets.elementHelper("PIDs", 0, [43, 40, 20, 0]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [58, 50, 22, 0]), //PITCH PIDs
presets.elementHelper("PIDs", 2, [70, 45, 0, 0]) //YAW PIDs
],
type: 'multirotor'
},
{
name: '7" Endurance',
description: "Quadcopter using 7\" propellers with F4/F7 CPU on 4S battery<br>" +
"<span>long range scout with full GPS capabilities, 1200-1500KV motors</span>",
features: [
"Multishot at 4kHz",
"600dps rates",
"Improved filtering",
"Improved PID defaults"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
presets.elementHelper("MIXER_CONFIG", "platformType", 0),
presets.elementHelper("FC_CONFIG", "loopTime", 250),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmProtocol", 3),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmRate", 4000),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 90),
presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 75),
presets.elementHelper("FILTER_CONFIG", "gyroStage2LowpassHz", 175),
presets.elementHelper("RC_tuning", "roll_rate", 600),
presets.elementHelper("RC_tuning", "pitch_rate", 600),
presets.elementHelper("RC_tuning", "yaw_rate", 500),
presets.elementHelper("RC_tuning", "RC_YAW_EXPO", 0.7),
presets.elementHelper("FILTER_CONFIG", "yawLpfHz", 0),
presets.elementHelper("PIDs", 0, [40, 35, 24, 0]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [45, 35, 24, 0]), //PITCH PIDs
presets.elementHelper("PIDs", 2, [85, 45, 0, 0]) //YAW PIDs
],
type: 'multirotor'
},
{
name: '7" Freestyle',
description: "Quadcopter using 7\" propellers with F4/F7 CPU on 4S battery<br>" +
"<span>1500-1800KV motors optimized for acro and freestyle</span>",
features: [
"Multishot at 4kHz",
"700dps/600dps rates",
"Improved filtering",
"Improved PID defaults"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
presets.elementHelper("MIXER_CONFIG", "platformType", 0),
presets.elementHelper("FC_CONFIG", "loopTime", 250),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmProtocol", 3),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmRate", 4000),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 90),
presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 80),
presets.elementHelper("FILTER_CONFIG", "gyroStage2LowpassHz", 175),
presets.elementHelper("RC_tuning", "roll_rate", 700),
presets.elementHelper("RC_tuning", "pitch_rate", 700),
presets.elementHelper("RC_tuning", "yaw_rate", 500),
presets.elementHelper("RC_tuning", "RC_YAW_EXPO", 0.7),
presets.elementHelper("FILTER_CONFIG", "yawLpfHz", 0),
presets.elementHelper("PIDs", 0, [30, 50, 25, 0]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [30, 50, 25, 0]), //PITCH PIDs
presets.elementHelper("PIDs", 2, [60, 50, 0, 0]) //YAW PIDs
],
type: 'multirotor'
},
{
name: '10" General Purpose',
description: "450-600 class general purpose multirotor <br><span>1.0kg - 1.4kg weight, 10 inch propellers, <br>F3/F4/F7 CPU, MPU6000 or MPU6050 gyro, GPS optional.</span>",
features: [
"Asynchronous gyro processing",
"400dps rates",
"Dterm and gyro notch filter",
"Increased LPF cutoff frequencies",
"Improved PID defaults"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
presets.elementHelper("MIXER_CONFIG", "platformType", 0),
presets.elementHelper("FC_CONFIG", "loopTime", 1000),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 1),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 70),
presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 40),
presets.elementHelper("RC_tuning", "roll_rate", 400),
presets.elementHelper("RC_tuning", "pitch_rate", 400),
presets.elementHelper("RC_tuning", "yaw_rate", 200),
presets.elementHelper("FILTER_CONFIG", "dtermNotchHz", 125),
presets.elementHelper("FILTER_CONFIG", "dtermNotchCutoff", 90),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz1", 170),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff1", 125),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz2", 85),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff2", 43),
presets.elementHelper("INAV_PID_CONFIG", "magHoldRateLimit", 30),
presets.elementHelper("PID_ADVANCED", "axisAccelerationLimitRollPitch", 360),
presets.elementHelper("PID_ADVANCED", "axisAccelerationLimitYaw", 72),
presets.elementHelper("PIDs", 0, [80, 30, 18, 0]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [80, 30, 18, 0]), //PITCH PIDs
presets.elementHelper("PIDs", 2, [95, 45, 0, 0]) //YAW PIDs
],
type: 'multirotor'
},
{
name: '12" General Purpose',
description: "550 and above general purpose multirotor<br>" +
"<span>12 inch propellers, 1.4kg-2kg weight, F3/F4/F7 CPU, MPU6000 or MPU6050 gyro, GPS optional</span>",
features: [
"Asynchronous gyro processing",
"180dps rates",
"Limited rate acceleration",
"Dterm and gyro notch filter",
"Increased LPF cutoff frequencies",
"Improved PID defaults"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
presets.elementHelper("MIXER_CONFIG", "platformType", 0),
presets.elementHelper("FC_CONFIG", "loopTime", 1000),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 1),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 55),
presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 30),
presets.elementHelper("RC_tuning", "roll_rate", 180),
presets.elementHelper("RC_tuning", "pitch_rate", 180),
presets.elementHelper("RC_tuning", "yaw_rate", 90),
presets.elementHelper("FILTER_CONFIG", "dtermNotchHz", 108),
presets.elementHelper("FILTER_CONFIG", "dtermNotchCutoff", 72),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz1", 144),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff1", 90),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz2", 72),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff2", 50),
presets.elementHelper("INAV_PID_CONFIG", "magHoldRateLimit", 30),
presets.elementHelper("PID_ADVANCED", "axisAccelerationLimitRollPitch", 240),
presets.elementHelper("PID_ADVANCED", "axisAccelerationLimitYaw", 36),
presets.elementHelper("PIDs", 0, [100, 30, 25, 0]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [100, 30, 25, 0]), //PITCH PIDs
presets.elementHelper("PIDs", 2, [120, 45, 0, 0]), //YAW PIDs
presets.elementHelper("PIDs", 7, [15, 10, 75, 0]) //Level PIDs
],
type: 'multirotor'
},
{
name: '280mm Tricopter',
description: "280mm class tricopter with F4/F7 CPU",
features: [
"Asynchronous processing",
"Dterm and gyro notch filter",
"Increased LPF cutoff frequencies",
"Improved PID defaults"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 1),
presets.elementHelper("MIXER_CONFIG", "platformType", 3),
presets.elementHelper("FC_CONFIG", "loopTime", 500),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmProtocol", 0),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmRate", 490),
presets.elementHelper("ADVANCED_CONFIG", "servoPwmRate", 50),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 90),
presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 80),
presets.elementHelper("RC_tuning", "roll_rate", 700),
presets.elementHelper("RC_tuning", "pitch_rate", 550),
presets.elementHelper("RC_tuning", "yaw_rate", 250),
presets.elementHelper("RC_tuning", "dynamic_THR_PID", 20),
presets.elementHelper("RC_tuning", "dynamic_THR_breakpoint", 1650),
presets.elementHelper("FILTER_CONFIG", "dtermNotchHz", 260),
presets.elementHelper("FILTER_CONFIG", "dtermNotchCutoff", 160),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz1", 400),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff1", 300),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz2", 200),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff2", 100),
presets.elementHelper("PIDs", 0, [55, 40, 15, 0]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [55, 40, 15, 0]), //PITCH PIDs
presets.elementHelper("PIDs", 2, [90, 20, 0, 0]) //YAW PIDs
],
type: 'multirotor'
},
{
name: '600mm Tricopter',
description: "600mm class tricopter with F3/F4/F7 CPU<br>",
features: [
"Dterm and gyro notch filter",
"GPS ready",
"Improved PID defaults"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 1),
presets.elementHelper("MIXER_CONFIG", "platformType", 3),
presets.elementHelper("FC_CONFIG", "loopTime", 1000),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmProtocol", 1),
presets.elementHelper("ADVANCED_CONFIG", "motorPwmRate", 2000),
presets.elementHelper("ADVANCED_CONFIG", "servoPwmRate", 50),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 70),
presets.elementHelper("RC_tuning", "roll_rate", 550),
presets.elementHelper("RC_tuning", "pitch_rate", 480),
presets.elementHelper("RC_tuning", "dynamic_THR_PID", 20),
presets.elementHelper("RC_tuning", "dynamic_THR_breakpoint", 1650),
presets.elementHelper("FILTER_CONFIG", "dtermNotchHz", 125),
presets.elementHelper("FILTER_CONFIG", "dtermNotchCutoff", 90),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz1", 170),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff1", 125),
presets.elementHelper("FILTER_CONFIG", "gyroNotchHz2", 85),
presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff2", 43),
presets.elementHelper("PIDs", 0, [110, 20, 52, 0]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [110, 20, 52, 0]), //PITCH PIDs
presets.elementHelper("PIDs", 2, [75, 20, 0, 0]) //YAW PIDs
],
type: 'multirotor'
},
{
name: "Airplane General",
description: "General setup for airplanes",
features: [
"Adjusted gyro filtering",
"Adjusted PIDs",
"Adjusted rates"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 14),
presets.elementHelper("MIXER_CONFIG", "platformType", 1),
presets.elementHelper("PIDs", 0, [20, 30, 0, 15]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [20, 30, 0, 15]), //PITCH PIDs
presets.elementHelper("PIDs", 2, [45, 5, 0, 15]), //YAW PIDs
presets.elementHelper("RC_tuning", "roll_rate", 200),
presets.elementHelper("RC_tuning", "pitch_rate", 150),
presets.elementHelper("RC_tuning", "yaw_rate", 90),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 1)
],
type: 'airplane'
},
{
name: "600mm Flying Wing",
description: "Small flying wing on multirotor racer parts<br>" +
"<span>300g-500g weight, 3S-4S battery</span>",
features: [
"Adjusted gyro filtering",
"Adjusted PIDs",
"Adjusted rates"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 8),
presets.elementHelper("MIXER_CONFIG", "platformType", 1),
presets.elementHelper("PIDs", 0, [15, 30, 15]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [15, 40, 15]), //PITCH PIDs
presets.elementHelper("RC_tuning", "roll_rate", 400),
presets.elementHelper("RC_tuning", "pitch_rate", 150),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 1)
],
type: 'flyingwing'
},
{
name: "Flying wing Z84",
description: "Small flying wing on multirotor racer parts<br>" +
"<span>300g-500g weight, 3S-4S battery</span>",
features: [
"Adjusted gyro filtering",
"Adjusted PIDs",
"Adjusted rates"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 8),
presets.elementHelper("MIXER_CONFIG", "platformType", 1),
presets.elementHelper("PIDs", 0, [2, 15, 0, 30]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [2, 15, 0, 70]), //PITCH PIDs
presets.elementHelper("PIDs", 7, [10, 15, 75, 0]), //LEVEL PIDs
presets.elementHelper("RC_tuning", "roll_rate", 350),
presets.elementHelper("RC_tuning", "pitch_rate", 90),
presets.elementHelper("RC_tuning", "dynamic_THR_PID", 33),
presets.elementHelper("RC_tuning", "dynamic_THR_breakpoint", 1300),
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 4)
],
type: 'flyingwing'
},
{
name: "Flying Wing S800 Sky Shadow",
description: "Flying wing on multirotor racer parts with 3S/4S battery and FPV equipment",
features: [
"Adjusted gyro filtering",
"Adjusted PIDs",
"Adjusted rates"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 8),
presets.elementHelper("MIXER_CONFIG", "platformType", 1),
presets.elementHelper("PIDs", 0, [6, 6, 0, 49]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [6, 9, 0, 52]), //PITCH PIDs
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 40),
presets.elementHelper("RC_tuning", "roll_rate", 280),
presets.elementHelper("RC_tuning", "pitch_rate", 140),
presets.elementHelper("RC_tuning", "dynamic_THR_PID", 20),
presets.elementHelper("RC_tuning", "dynamic_THR_breakpoint", 1600)
],
type: 'flyingwing'
},
{
name: "Ritewing Mini Drak",
description: "Amazig looking and flying airplane with 8x6 propeller, 2216 1400KV motor, powered with 4S LiPo. AUW above 1200g",
features: [
"Adjusted gyro filtering",
"Adjusted PIDs",
"Adjusted rates"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 8),
presets.elementHelper("MIXER_CONFIG", "platformType", 1),
presets.elementHelper("PIDs", 0, [7, 7, 0, 25]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [5, 9, 0, 56]), //PITCH PIDs
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 35),
presets.elementHelper("RC_tuning", "roll_rate", 260),
presets.elementHelper("RC_tuning", "pitch_rate", 140),
presets.elementHelper("RC_tuning", "dynamic_THR_PID", 30),
presets.elementHelper("RC_tuning", "dynamic_THR_breakpoint", 1550)
],
type: 'flyingwing'
},
{
name: "ZOHD Dart 250G",
description: "Small and light flying wing that can be build below 250g and as such be fully legal in many countries",
features: [
"Adjusted gyro filtering",
"Adjusted PIDs",
"Adjusted rates"
],
applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG", "MIXER_CONFIG"],
settings: [
presets.elementHelper("BF_CONFIG", "mixerConfiguration", 8),
presets.elementHelper("MIXER_CONFIG", "platformType", 1),
presets.elementHelper("PIDs", 0, [9, 12, 0, 15]), //ROLL PIDs
presets.elementHelper("PIDs", 1, [9, 15, 0, 14]), //PITCH PIDs
presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 35),
presets.elementHelper("RC_tuning", "roll_rate", 360),
presets.elementHelper("RC_tuning", "pitch_rate", 130),
presets.elementHelper("RC_tuning", "dynamic_THR_PID", 30),
presets.elementHelper("RC_tuning", "dynamic_THR_breakpoint", 1500)
],
type: 'flyingwing'
}
];
presets.model = (function () {
var self = {};
/**
* @param {Array} toApply
* @param {Object} defaults
* @param {String} mixerType
*/
self.applyDefaults = function (toApply, defaults, mixerType) {
for (var settingToApply in toApply) {
if (toApply.hasOwnProperty(settingToApply)) {
var settingName = toApply[settingToApply],
values;
if (settingName == 'PIDs') {
if (mixerType == 'multirotor') {
values = defaults[settingName]['mr'];
} else {
values = defaults[settingName]['fw'];
}
} else {
values = defaults[settingName];
}
for (var key in values) {
if (values.hasOwnProperty(key)) {
window[settingName][key] = values[key];
}
}
}
}
if (mixerType == 'airplane' || mixerType == 'flyingwing') {
// Always set MOTOR_STOP and feature AIRMODE for fixed wing
window.BF_CONFIG.features |= 1 << 4; // MOTOR_STOP
window.BF_CONFIG.features |= 1 << 22; // AIRMODE
}
};
self.extractPresetNames = function (presets) {
var retVal = {};
for (var i in presets) {
if (presets.hasOwnProperty(i)) {
retVal[i] = presets[i].name;
}
}
return retVal;
};
return self;
})();
TABS.profiles = {};
TABS.profiles.initialize = function (callback, scrollPosition) {
var currentPreset,
currentPresetId,
loadChainer = new MSPChainerClass(),
saveChainer = new MSPChainerClass();
if (GUI.active_tab != 'profiles') {
GUI.active_tab = 'profiles';
googleAnalytics.sendAppView('Presets');
}
loadChainer.setChain([
mspHelper.loadBfConfig,
mspHelper.loadLoopTime,
mspHelper.loadINAVPidConfig,
mspHelper.loadAdvancedConfig,
mspHelper.loadFilterConfig,
mspHelper.loadPidAdvanced,
mspHelper.loadRcTuningData,
mspHelper.loadPidData,
mspHelper.loadMixerConfig
]);
loadChainer.setExitPoint(loadHtml);
loadChainer.execute();
saveChainer.setChain([
mspHelper.saveBfConfig,
mspHelper.saveMixerConfig,
mspHelper.saveINAVPidConfig,
mspHelper.saveLooptimeConfig,
mspHelper.saveAdvancedConfig,
mspHelper.saveFilterConfig,
mspHelper.savePidData,
mspHelper.saveRcTuningData,
mspHelper.savePidAdvanced,
mspHelper.saveToEeprom
]);
saveChainer.setExitPoint(reboot);
function loadHtml() {
GUI.load("./tabs/profiles.html", processHtml);
}
function reboot() {
//noinspection JSUnresolvedVariable
GUI.log(chrome.i18n.getMessage('configurationEepromSaved'));
GUI.tab_switch_cleanup(function () {
MSP.send_message(MSPCodes.MSP_SET_REBOOT, false, false, reinitialize);
});
}
function reinitialize() {
//noinspection JSUnresolvedVariable
GUI.log(chrome.i18n.getMessage('deviceRebooting'));
GUI.handleReconnect($('.tab_setup a'));
}
function applyAndSave() {
presets.model.applyDefaults(currentPreset.applyDefaults, presets.defaultValues, currentPreset.type);
var setting;
//Iterate over settings saved in preset
for (var i in currentPreset.settings) {
if (currentPreset.settings.hasOwnProperty(i)) {
setting = currentPreset.settings[i];
//Apply setting
window[setting.group][setting.field] = setting.value;
}
}
var promises = {};
var settings = presets.settings.get(currentPreset.type);
Object.keys(settings).forEach(function(key, ii) {
var value = settings[key];
promises[key] = mspHelper.setSetting(name, value);
});
Promise.props(promises).then(function () {
saveChainer.execute();
});
}
function fillPresetDescription(preset) {
var $features = $('#preset-features');
$('#preset-image').html('<div class="' + preset.type + '"></div>');
$('#preset-name').html(preset.name);
$('#preset-description').html(preset.description);
document.getElementById('preset-info').style.display = "none";
document.getElementById('details-head').style.display = "block";
$features.find('*').remove();
for (var i in preset.features) {
if (preset.features.hasOwnProperty(i)) {
$features.append('<li class="preset__feature"><span class="preset__feature-text">' + preset.features[i] + "</span></li>");
}
}
}
function processHtml() {
var modal;
var $presetList = $('#presets-list');
var presetsList = presets.model.extractPresetNames(presets.presets);
for (var preset in presetsList) {
if (presetsList.hasOwnProperty(preset)) {
$presetList.append('<li class="preset__element-wrapper"><a href="#" class="preset__element-link" data-val="' + preset + '">' + presetsList[preset] + '</a></li>');
}
}
$('.preset__element-link').click(function () {
currentPresetId = $(this).data('val');
currentPreset = presets.presets[currentPresetId];
fillPresetDescription(currentPreset);
$presetList.find('li').removeClass('active');
$(this).parent().addClass('active');
$('#save-button').removeClass('disabled');
googleAnalytics.sendEvent('Presets', 'Displayed', currentPreset.name);
});
$('#execute-button').click(function () {
applyAndSave();
modal.close();
googleAnalytics.sendEvent('Presets', 'Applied', currentPreset.name);
});
localize();
//noinspection JSValidateTypes
$('#content').scrollTop((scrollPosition) ? scrollPosition : 0);
modal = new jBox('Modal', {
width: 600,
height: 240,
closeButton: 'title',
animation: false,
attach: $('#save-button'),
title: chrome.i18n.getMessage("presetApplyTitle"),
content: $('#presetApplyContent')
});
GUI.content_ready(callback);
}
};
TABS.profiles.cleanup = function (callback) {
if (callback) callback();
};