1
0
Fork 0
mirror of https://github.com/betaflight/betaflight-configurator.git synced 2025-07-26 09:45:28 +03:00
betaflight-configurator/src/js/fc.js

1014 lines
29 KiB
JavaScript

import { bit_check } from "./bit";
import { API_VERSION_1_45, API_VERSION_1_46 } from "./data_storage";
import semver from "semver";
const INITIAL_CONFIG = {
apiVersion: "0.0.0",
flightControllerIdentifier: "",
flightControllerVersion: "",
version: 0,
buildInfo: "",
buildKey: "",
buildOptions: [],
gitRevision: "",
multiType: 0,
msp_version: 0, // not specified using semantic versioning
capability: 0,
cycleTime: 0,
i2cError: 0,
cpuload: 0,
cpuTemp: 0,
activeSensors: 0,
mode: 0,
profile: 0,
uid: [0, 0, 0],
accelerometerTrims: [0, 0],
name: "", // present for backwards compatibility before MSP v1.45
craftName: "",
displayName: "", // present for backwards compatibility before MSP v1.45
pilotName: "",
pidProfileNames: ["", "", "", ""],
rateProfileNames: ["", "", "", ""],
numProfiles: 3,
rateProfile: 0,
boardType: 0,
armingDisableCount: 0,
armingDisableFlags: 0,
armingDisabled: false,
runawayTakeoffPreventionDisabled: false,
boardIdentifier: "",
boardVersion: 0,
targetCapabilities: 0,
targetName: "",
boardName: "",
manufacturerId: "",
signature: [],
mcuTypeId: 255,
configurationState: 0,
configStateFlag: 0,
sampleRateHz: 0,
configurationProblems: 0,
hardwareName: "",
};
const INITIAL_ANALOG = {
voltage: 0,
mAhdrawn: 0,
rssi: 0,
amperage: 0,
last_received_timestamp: 0,
};
const INITIAL_BATTERY_CONFIG = {
vbatmincellvoltage: 0,
vbatmaxcellvoltage: 0,
vbatwarningcellvoltage: 0,
capacity: 0,
voltageMeterSource: 0,
currentMeterSource: 0,
};
const FIRMWARE_BUILD_OPTIONS = {
// Radio Protocols
USE_SERIALRX_CRSF: 4097,
USE_SERIALRX_FPORT: 4098,
USE_SERIALRX_GHST: 4099,
USE_SERIALRX_IBUS: 4100,
USE_SERIALRX_JETIEXBUS: 4101,
USE_RX_PPM: 4102,
USE_SERIALRX_SBUS: 4103,
USE_SERIALRX_SPEKTRUM: 4104,
USE_SERIALRX_SRXL2: 4105,
USE_SERIALRX_SUMD: 4106,
USE_SERIALRX_SUMH: 4107,
USE_SERIALRX_XBUS: 4108,
// Motor Protocols
USE_BRUSHED: 8230,
USE_DSHOT: 8231,
USE_MULTISHOT: 8232,
USE_ONESHOT: 8233,
USE_PROSHOT: 8234,
USE_PWM_OUTPUT: 8235,
// Telemetry Protocols
USE_TELEMETRY_FRSKY_HUB: 12301,
USE_TELEMETRY_HOTT: 12302,
USE_TELEMETRY_IBUS_EXTENDED: 12303,
USE_TELEMETRY_LTM: 12304,
USE_TELEMETRY_MAVLINK: 12305,
USE_TELEMETRY_SMARTPORT: 12306,
USE_TELEMETRY_SRXL: 12307,
// General Options
USE_ACRO_TRAINER: 16404,
USE_AKK_SMARTAUDIO: 16405,
USE_BATTERY_CONTINUE: 16406,
USE_CAMERA_CONTROL: 16407,
USE_DASHBOARD: 16408,
USE_EMFAT_TOOLS: 16409,
USE_ESCSERIAL_SIMONK: 16410,
USE_FRSKYOSD: 16411,
USE_GPS: 16412,
USE_LED_STRIP: 16413,
USE_LED_STRIP_64: 16414,
USE_MAG: 16415,
USE_OSD_SD: 16416,
USE_OSD_HD: 16417,
USE_PINIO: 16418,
USE_RACE_PRO: 16419,
USE_SERVOS: 16420,
USE_VTX: 16421,
USE_ALTITUDE_HOLD: 16422,
USE_SOFTSERIAL: 16423,
USE_WING: 16424,
USE_POSITION_HOLD: 16425,
};
const FC = {
// define all the global variables that are uses to hold FC state
// the default state must be defined inside the resetState() method
ADJUSTMENT_RANGES: null,
ADVANCED_TUNING: null,
ADVANCED_TUNING_ACTIVE: null,
ANALOG: { ...INITIAL_ANALOG },
ARMING_CONFIG: null,
AUX_CONFIG: null,
AUX_CONFIG_IDS: null,
BATTERY_CONFIG: { ...INITIAL_BATTERY_CONFIG },
BATTERY_STATE: null,
BEEPER_CONFIG: null,
BF_CONFIG: null, // Remove when we officialy retire BF 3.1
BLACKBOX: null,
BOARD_ALIGNMENT_CONFIG: null,
// Shallow copy of original config and added getter
// getter allows this to be used with simple dot notation
// and bridges the vue and rest of the code
CONFIG: {
...INITIAL_CONFIG,
},
COPY_PROFILE: null,
CURRENT_METERS: null,
CURRENT_METER_CONFIGS: null,
DATAFLASH: null,
DEFAULT: null,
DEFAULT_PIDS: null,
FAILSAFE_CONFIG: null,
FC_CONFIG: null,
FEATURE_CONFIG: null,
FILTER_CONFIG: null,
GPS_CONFIG: null,
COMPASS_CONFIG: null,
GPS_DATA: null,
GPS_RESCUE: null,
LED_COLORS: null,
LED_MODE_COLORS: null,
LED_STRIP: null,
LED_CONFIG_VALUES: [],
MISC: null, // DEPRECATED
MIXER_CONFIG: null,
MODE_RANGES: null,
MODE_RANGES_EXTRA: null,
MOTOR_3D_CONFIG: null,
MOTOR_CONFIG: null,
MOTOR_DATA: null,
MOTOR_OUTPUT_ORDER: null,
MOTOR_TELEMETRY_DATA: null,
MULTIPLE_MSP: null,
PID: null,
PIDS_ACTIVE: null,
PID_ADVANCED_CONFIG: null,
PID_NAMES: null,
PIDS: null,
RC: null,
RC_DEADBAND_CONFIG: null,
RC_MAP: null,
RC_TUNING: null,
RSSI_CONFIG: null,
RXFAIL_CONFIG: null,
RX_CONFIG: null,
SDCARD: null,
SENSOR_ALIGNMENT: null,
SENSOR_CONFIG: null,
SENSOR_CONFIG_ACTIVE: null,
SENSOR_DATA: null,
SERIAL_CONFIG: null,
SERVO_CONFIG: null,
SERVO_DATA: null,
SERVO_RULES: null,
TRANSPONDER: null,
TUNING_SLIDERS: null,
VOLTAGE_METERS: null,
VOLTAGE_METER_CONFIGS: null,
VTXTABLE_BAND: null,
VTXTABLE_POWERLEVEL: null,
VTX_CONFIG: null,
VTX_DEVICE_STATUS: null,
resetState() {
// Using `Object.assign` instead of reassigning to
// trigger the updates on the Vue side
this.CONFIG = JSON.parse(JSON.stringify(INITIAL_CONFIG));
this.ANALOG = JSON.parse(JSON.stringify(INITIAL_ANALOG));
this.BATTERY_CONFIG = JSON.parse(JSON.stringify(INITIAL_BATTERY_CONFIG));
this.BF_CONFIG = {
currentscale: 0,
currentoffset: 0,
currentmetertype: 0,
batterycapacity: 0,
};
this.COPY_PROFILE = {
type: 0,
dstProfile: 0,
srcProfile: 0,
};
this.FEATURE_CONFIG = {
features: 0,
};
this.BEEPER_CONFIG = {
beepers: 0,
dshotBeaconTone: 0,
dshotBeaconConditions: 0,
};
this.MIXER_CONFIG = {
mixer: 0,
reverseMotorDir: 0,
};
this.BOARD_ALIGNMENT_CONFIG = {
roll: 0,
pitch: 0,
yaw: 0,
};
this.LED_STRIP = [];
this.LED_COLORS = [];
this.LED_MODE_COLORS = [];
this.PID = {
controller: 0,
};
this.PID_NAMES = [];
this.PIDS_ACTIVE = Array.from({ length: 10 });
this.PIDS = Array.from({ length: 10 });
for (let i = 0; i < 10; i++) {
this.PIDS_ACTIVE[i] = Array.from({ length: 3 });
this.PIDS[i] = Array.from({ length: 3 });
}
this.RC_MAP = [];
// defaults
// roll, pitch, yaw, throttle, aux 1, ... aux n
this.RC = {
active_channels: 0,
channels: Array.from({ length: 32 }),
};
this.RC_TUNING = {
RC_RATE: 0,
RC_EXPO: 0,
roll_pitch_rate: 0, // pre 1.7 api only
roll_rate: 0,
pitch_rate: 0,
yaw_rate: 0,
dynamic_THR_PID: 0, // moved in 1.45 to ADVANCED_TUNING
throttle_MID: 0,
throttle_EXPO: 0,
dynamic_THR_breakpoint: 0, // moved in 1.45 to ADVANCED_TUNING
RC_YAW_EXPO: 0,
rcYawRate: 0,
rcPitchRate: 0,
RC_PITCH_EXPO: 0,
throttleLimitType: 0,
throttleLimitPercent: 100,
roll_rate_limit: 1998,
pitch_rate_limit: 1998,
yaw_rate_limit: 1998,
rates_type: 0,
};
this.AUX_CONFIG = [];
this.AUX_CONFIG_IDS = [];
this.MODE_RANGES = [];
this.MODE_RANGES_EXTRA = [];
this.ADJUSTMENT_RANGES = [];
this.SERVO_CONFIG = [];
this.SERVO_RULES = [];
this.SERIAL_CONFIG = {
ports: [],
// pre 1.6 settings
mspBaudRate: 0,
gpsBaudRate: 0,
gpsPassthroughBaudRate: 0,
cliBaudRate: 0,
};
this.SENSOR_DATA = {
gyroscope: [0, 0, 0],
accelerometer: [0, 0, 0],
magnetometer: [0, 0, 0],
altitude: 0,
sonar: 0,
kinematics: [0.0, 0.0, 0.0],
debug: [0, 0, 0, 0, 0, 0, 0, 0],
};
this.MOTOR_DATA = Array.from({ length: 8 });
this.SERVO_DATA = Array.from({ length: 8 });
this.MOTOR_TELEMETRY_DATA = {
rpm: [0, 0, 0, 0, 0, 0, 0, 0],
invalidPercent: [0, 0, 0, 0, 0, 0, 0, 0],
temperature: [0, 0, 0, 0, 0, 0, 0, 0],
voltage: [0, 0, 0, 0, 0, 0, 0, 0],
current: [0, 0, 0, 0, 0, 0, 0, 0],
consumption: [0, 0, 0, 0, 0, 0, 0, 0],
};
this.GPS_DATA = {
fix: 0,
numSat: 0,
lat: 0,
lon: 0,
alt: 0,
speed: 0,
ground_course: 0,
positionalDop: 0,
distanceToHome: 0,
directionToHome: 0,
update: 0,
chn: [],
svid: [],
quality: [],
cno: [],
};
this.VOLTAGE_METERS = [];
this.VOLTAGE_METER_CONFIGS = [];
this.CURRENT_METERS = [];
this.CURRENT_METER_CONFIGS = [];
this.BATTERY_STATE = {};
this.BATTERY_CONFIG = {
vbatmincellvoltage: 0,
vbatmaxcellvoltage: 0,
vbatwarningcellvoltage: 0,
capacity: 0,
voltageMeterSource: 0,
currentMeterSource: 0,
};
this.ARMING_CONFIG = {
auto_disarm_delay: 0,
disarm_kill_switch: 0,
small_angle: 0,
gyro_cal_on_first_arm: 0,
};
this.FC_CONFIG = {
loopTime: 0,
};
this.MISC = {
// DEPRECATED = only used to store values that are written back to the fc as-is, do NOT use for any other purpose
failsafe_throttle: 0,
gps_baudrate: 0,
multiwiicurrentoutput: 0,
placeholder2: 0,
vbatscale: 0,
vbatmincellvoltage: 0,
vbatmaxcellvoltage: 0,
vbatwarningcellvoltage: 0,
batterymetertype: 1, // 1=ADC, 2=ESC
};
this.MOTOR_CONFIG = {
minthrottle: 0,
maxthrottle: 0,
mincommand: 0,
motor_count: 0,
motor_poles: 0,
use_dshot_telemetry: false,
use_esc_sensor: false,
};
this.GPS_CONFIG = {
provider: 0,
ublox_sbas: 0,
auto_config: 0,
auto_baud: 0,
home_point_once: 0,
ublox_use_galileo: 0,
};
this.COMPASS_CONFIG = {
mag_declination: 0,
};
this.RSSI_CONFIG = {
channel: 0,
};
this.MOTOR_3D_CONFIG = {
deadband3d_low: 0,
deadband3d_high: 0,
neutral: 0,
};
this.DATAFLASH = {
ready: false,
supported: false,
sectors: 0,
totalSize: 0,
usedSize: 0,
};
this.SDCARD = {
supported: false,
state: 0,
filesystemLastError: 0,
freeSizeKB: 0,
totalSizeKB: 0,
};
this.BLACKBOX = {
supported: false,
blackboxDevice: 0,
blackboxRateNum: 1,
blackboxRateDenom: 1,
blackboxPDenom: 0,
blackboxSampleRate: 0,
blackboxDisabledMask: 0,
};
this.TRANSPONDER = {
supported: false,
data: [],
provider: 0,
providers: [],
};
this.RC_DEADBAND_CONFIG = {
deadband: 0,
yaw_deadband: 0,
alt_hold_deadband: 0,
deadband3d_throttle: 0,
};
this.SENSOR_ALIGNMENT = {
align_gyro: 0,
align_acc: 0,
align_mag: 0,
gyro_detection_flags: 0,
gyro_to_use: 0,
gyro_1_align: 0,
gyro_2_align: 0,
gyro_align_roll: 0,
gyro_align_pitch: 0,
gyro_align_yaw: 0,
mag_align_roll: 0,
mag_align_pitch: 0,
mag_align_yaw: 0,
};
this.PID_ADVANCED_CONFIG = {
gyro_sync_denom: 0,
pid_process_denom: 0,
use_unsyncedPwm: 0,
fast_pwm_protocol: 0,
motor_pwm_rate: 0,
motorIdle: 0,
gyroUse32kHz: 0,
motorPwmInversion: 0,
gyroHighFsr: 0,
gyroMovementCalibThreshold: 0,
gyroCalibDuration: 0,
gyroOffsetYaw: 0,
gyroCheckOverflow: 0,
debugMode: 0,
debugModeCount: 0,
};
this.FILTER_CONFIG = {
gyro_hardware_lpf: 0,
gyro_32khz_hardware_lpf: 0,
gyro_lowpass_hz: 0,
gyro_lowpass_dyn_min_hz: 0,
gyro_lowpass_dyn_max_hz: 0,
gyro_lowpass_type: 0,
gyro_lowpass2_hz: 0,
gyro_lowpass2_type: 0,
gyro_notch_hz: 0,
gyro_notch_cutoff: 0,
gyro_notch2_hz: 0,
gyro_notch2_cutoff: 0,
dterm_lowpass_hz: 0,
dterm_lowpass_dyn_min_hz: 0,
dterm_lowpass_dyn_max_hz: 0,
dterm_lowpass_type: 0,
dterm_lowpass2_hz: 0,
dterm_lowpass2_type: 0,
dyn_lpf_curve_expo: 0,
dterm_notch_hz: 0,
dterm_notch_cutoff: 0,
yaw_lowpass_hz: 0,
dyn_notch_range: 0,
dyn_notch_width_percent: 0,
dyn_notch_q: 0,
dyn_notch_min_hz: 0,
dyn_notch_max_hz: 0,
dyn_notch_count: 0,
gyro_rpm_notch_harmonics: 0,
gyro_rpm_notch_min_hz: 0,
};
this.ADVANCED_TUNING = {
rollPitchItermIgnoreRate: 0,
yawItermIgnoreRate: 0,
yaw_p_limit: 0,
deltaMethod: 0,
vbatPidCompensation: 0,
dtermSetpointTransition: 0,
dtermSetpointWeight: 0,
toleranceBand: 0,
toleranceBandReduction: 0,
itermThrottleGain: 0,
pidMaxVelocity: 0,
pidMaxVelocityYaw: 0,
levelAngleLimit: 0,
levelSensitivity: 0,
itermThrottleThreshold: 0,
itermAcceleratorGain: 0, // depecrated in API 1.45
antiGravityGain: 0, // was itermAccelatorGain till API 1.45
itermRotation: 0,
smartFeedforward: 0,
itermRelax: 0,
itermRelaxType: 0,
itermRelaxCutoff: 0,
absoluteControlGain: 0,
throttleBoost: 0,
acroTrainerAngleLimit: 0,
feedforwardRoll: 0,
feedforwardPitch: 0,
feedforwardYaw: 0,
feedforwardTransition: 0,
antiGravityMode: 0,
dMaxRoll: 0,
dMaxPitch: 0,
dMaxYaw: 0,
dMaxGain: 0,
dMaxAdvance: 0,
useIntegratedYaw: 0,
integratedYawRelax: 0,
motorOutputLimit: 0,
autoProfileCellCount: 0,
idleMinRpm: 0,
feedforward_averaging: 0,
feedforward_smooth_factor: 0,
feedforward_boost: 0,
feedforward_max_rate_limit: 0,
feedforward_jitter_factor: 0,
vbat_sag_compensation: 0,
thrustLinearization: 0,
tpaRate: 0,
tpaBreakpoint: 0,
};
this.ADVANCED_TUNING_ACTIVE = { ...this.ADVANCED_TUNING };
this.SENSOR_CONFIG = {
acc_hardware: 0,
baro_hardware: 0,
mag_hardware: 0,
sonar_hardware: 0,
};
this.SENSOR_CONFIG_ACTIVE = { gyro_hardware: 0, ...this.SENSOR_CONFIG };
this.RX_CONFIG = {
serialrx_provider: 0,
stick_max: 0,
stick_center: 0,
stick_min: 0,
spektrum_sat_bind: 0,
rx_min_usec: 0,
rx_max_usec: 0,
rcInterpolation: 0,
rcInterpolationInterval: 0,
rcInterpolationChannels: 0,
airModeActivateThreshold: 0,
rxSpiProtocol: 0,
rxSpiId: 0,
rxSpiRfChannelCount: 0,
fpvCamAngleDegrees: 0,
rcSmoothingType: 0,
rcSmoothingSetpointCutoff: 0,
rcSmoothingFeedforwardCutoff: 0,
rcSmoothingInputType: 0,
rcSmoothingDerivativeType: 0,
rcSmoothingAutoFactor: 0,
usbCdcHidType: 0,
rcSmoothingMode: 0,
elrsUid: [0, 0, 0, 0, 0, 0],
};
this.FAILSAFE_CONFIG = {
failsafe_delay: 0,
failsafe_off_delay: 0,
failsafe_throttle: 0,
failsafe_switch_mode: 0,
failsafe_throttle_low_delay: 0,
failsafe_procedure: 0,
};
this.GPS_RESCUE = {
angle: 0,
returnAltitudeM: 0,
descentDistanceM: 0,
groundSpeed: 0,
throttleMin: 0,
throttleMax: 0,
throttleHover: 0,
sanityChecks: 0,
minSats: 0,
ascendRate: 0,
descendRate: 0,
allowArmingWithoutFix: 0,
altitudeMode: 0,
minStartDistM: 0,
initialClimbM: 0,
};
this.RXFAIL_CONFIG = [];
this.VTX_CONFIG = {
vtx_type: 0,
vtx_band: 0,
vtx_channel: 0,
vtx_power: 0,
vtx_pit_mode: false,
vtx_frequency: 0,
vtx_device_ready: false,
vtx_low_power_disarm: 0,
vtx_pit_mode_frequency: 0,
vtx_table_available: false,
vtx_table_bands: 0,
vtx_table_channels: 0,
vtx_table_powerlevels: 0,
vtx_table_clear: false,
};
this.VTXTABLE_BAND = {
vtxtable_band_number: 0,
vtxtable_band_name: "",
vtxtable_band_letter: "",
vtxtable_band_is_factory_band: false,
vtxtable_band_frequencies: [],
};
this.VTXTABLE_POWERLEVEL = {
vtxtable_powerlevel_number: 0,
vtxtable_powerlevel_value: 0,
vtxtable_powerlevel_label: 0,
};
this.MOTOR_OUTPUT_ORDER = [];
this.MULTIPLE_MSP = {
msp_commands: [],
};
this.DEFAULT = {
gyro_lowpass_hz: 100,
gyro_lowpass_dyn_min_hz: 150,
gyro_lowpass_dyn_max_hz: 450,
gyro_lowpass_type: this.FILTER_TYPE_FLAGS.PT1,
gyro_lowpass2_hz: 300,
gyro_lowpass2_type: this.FILTER_TYPE_FLAGS.PT1,
gyro_notch_cutoff: 300,
gyro_notch_hz: 400,
gyro_notch2_cutoff: 100,
gyro_notch2_hz: 200,
gyro_rpm_notch_harmonics: 3,
gyro_rpm_notch_min_hz: 100,
dterm_lowpass_hz: 100,
dterm_lowpass_dyn_min_hz: 150,
dterm_lowpass_dyn_max_hz: 250,
dyn_lpf_curve_expo: 5,
dterm_lowpass_type: this.FILTER_TYPE_FLAGS.PT1,
dterm_lowpass2_hz: 200,
dterm_lowpass2_type: this.FILTER_TYPE_FLAGS.BIQUAD,
dterm_notch_cutoff: 160,
dterm_notch_hz: 260,
yaw_lowpass_hz: 100,
dyn_notch_q: 120,
dyn_notch_width_percent: 8,
dyn_notch_count: 3,
dyn_notch_q_rpm: 500, // default with rpm filtering
dyn_notch_count_rpm: 1,
dyn_notch_min_hz: 150,
dyn_notch_max_hz: 600,
};
this.DEFAULT_PIDS = [42, 85, 35, 20, 90, 46, 90, 38, 22, 95, 30, 90, 0, 0, 90];
this.VTX_DEVICE_STATUS = null;
this.TUNING_SLIDERS = {
slider_pd_ratio: 0,
slider_pd_gain: 0,
slider_feedforward_gain: 0,
slider_master_multiplier: 0,
slider_dterm_filter: 0,
slider_dterm_filter_multiplier: 0,
slider_gyro_filter: 0,
slider_gyro_filter_multiplier: 0,
// introduced in 4.3
slider_pids_mode: 0,
slider_d_gain: 0,
slider_pi_gain: 0,
slider_dmax_gain: 0,
slider_i_gain: 0,
slider_roll_pitch_ratio: 0,
slider_pitch_pi_gain: 0,
slider_pids_valid: 0,
slider_gyro_valid: 0,
slider_dterm_valid: 0,
};
this.DEFAULT_TUNING_SLIDERS = {
slider_pids_mode: 2,
slider_d_gain: 100,
slider_pi_gain: 100,
slider_feedforward_gain: 100,
slider_dmax_gain: 100,
slider_i_gain: 100,
slider_roll_pitch_ratio: 100,
slider_pitch_pi_gain: 100,
slider_master_multiplier: 100,
slider_dterm_filter: 1,
slider_dterm_filter_multiplier: 100,
slider_gyro_filter: 1,
slider_gyro_filter_multiplier: 100,
slider_pids_valid: 1,
slider_gyro_valid: 1,
slider_dterm_valid: 1,
};
},
getSerialRxTypes: () => {
const apiVersion = FC.CONFIG.apiVersion;
// defaults
const serialRxTypes = [
"SPEKTRUM1024",
"SPEKTRUM2048",
"SBUS",
"SUMD",
"SUMH",
"XBUS_MODE_B",
"XBUS_MODE_B_RJ01",
"IBUS",
"JETIEXBUS",
"CRSF",
"SPEKTRUM2048/SRXL",
"TARGET_CUSTOM",
"FPORT",
"SPEKTRUM SRXL2",
"IRC GHOST",
];
if (semver.gte(apiVersion, API_VERSION_1_46)) {
// Default to NONE and move SPEKTRUM1024 to the end (firmware PR #12500)
serialRxTypes[0] = "NONE";
serialRxTypes.push("SPEKTRUM1024");
}
return serialRxTypes;
},
getSupportedSerialRxTypes: () => {
if (FC.CONFIG.buildOptions?.length) {
const options = FC.CONFIG.buildOptions;
let supportedRxTypes = ["NONE"];
if (options.includes("USE_SERIALRX_TARGET_CUSTOM")) {
supportedRxTypes.push("TARGET_CUSTOM");
}
if (options.includes("USE_SERIALRX_SPEKTRUM")) {
supportedRxTypes.push("SPEKTRUM1024");
supportedRxTypes.push("SPEKTRUM2048");
supportedRxTypes.push("SPEKTRUM2048/SRXL");
}
if (options.includes("USE_SERIALRX_SBUS")) {
supportedRxTypes.push("SBUS");
}
if (options.includes("USE_SERIALRX_SUMD")) {
supportedRxTypes.push("SUMD");
}
if (options.includes("USE_SERIALRX_SUMH")) {
supportedRxTypes.push("SUMH");
}
if (options.includes("USE_SERIALRX_XBUS")) {
supportedRxTypes.push("XBUS_MODE_B");
supportedRxTypes.push("XBUS_MODE_B_RJ01");
}
if (options.includes("USE_SERIALRX_IBUS")) {
supportedRxTypes.push("IBUS");
}
if (options.includes("USE_SERIALRX_JETIEXBUS")) {
supportedRxTypes.push("JETIEXBUS");
}
if (options.includes("USE_SERIALRX_CRSF")) {
supportedRxTypes.push("CRSF");
}
if (options.includes("USE_SERIALRX_FPORT")) {
supportedRxTypes.push("FPORT");
}
if (options.includes("USE_SERIALRX_SRXL2")) {
supportedRxTypes.push("SPEKTRUM SRXL2");
}
if (options.includes("USE_SERIALRX_GHST")) {
supportedRxTypes.push("IRC GHOST");
}
return supportedRxTypes;
}
return FC.getSerialRxTypes();
},
calculateHardwareName() {
let name;
if (this.CONFIG.targetName) {
name = this.CONFIG.targetName;
} else {
name = this.CONFIG.boardIdentifier;
}
if (this.CONFIG.boardName && this.CONFIG.boardName !== name) {
name = `${this.CONFIG.boardName}(${name})`;
}
if (this.CONFIG.manufacturerId) {
name = `${this.CONFIG.manufacturerId}/${name}`;
}
this.CONFIG.hardwareName = name;
},
MCU_TYPES: {
0: "SIMULATOR",
1: "F40X",
2: "F411",
3: "F446",
4: "F722",
5: "F745",
6: "F746",
7: "F765",
8: "H750",
9: "H743_REV_UNKNOWN",
10: "H743_REV_Y",
11: "H743_REV_X",
12: "H743_REV_V",
13: "H7A3",
14: "H723_725",
15: "G474",
16: "H730",
17: "AT32F435G",
18: "APM32F405",
19: "APM32F407",
20: "AT32F435M",
21: "RP2350B",
255: "Unknown MCU",
},
getMcuType() {
return this.MCU_TYPES[this.CONFIG.mcuTypeId];
},
CONFIGURATION_STATES: {
DEFAULTS_BARE: 0,
DEFAULTS_CUSTOM: 1,
CONFIGURED: 2,
},
TARGET_CAPABILITIES_FLAGS: {
HAS_VCP: 0,
HAS_SOFTSERIAL: 1,
IS_UNIFIED: 2,
HAS_FLASH_BOOTLOADER: 3,
SUPPORTS_CUSTOM_DEFAULTS: 4,
HAS_CUSTOM_DEFAULTS: 5,
SUPPORTS_RX_BIND: 6,
},
CONFIGURATION_PROBLEM_FLAGS: {
ACC_NEEDS_CALIBRATION: 0,
MOTOR_PROTOCOL_DISABLED: 1,
},
processBuildOptions() {
const buildOptions = [];
for (const [key, value] of Object.entries(FIRMWARE_BUILD_OPTIONS)) {
for (const option of this.CONFIG.buildOptions) {
if (option === value) {
buildOptions.push(key);
break;
}
}
}
this.CONFIG.buildOptions = buildOptions;
},
boardHasVcp() {
return bit_check(this.CONFIG.targetCapabilities, this.TARGET_CAPABILITIES_FLAGS.HAS_VCP);
},
boardHasFlashBootloader() {
return bit_check(this.CONFIG.targetCapabilities, this.TARGET_CAPABILITIES_FLAGS.HAS_FLASH_BOOTLOADER);
},
FILTER_TYPE_FLAGS: {
PT1: 0,
BIQUAD: 1,
},
getFilterDefaults() {
const versionFilterDefaults = this.DEFAULT;
// Change filter defaults depending on API version here
versionFilterDefaults.gyro_lowpass_hz = 150;
versionFilterDefaults.gyro_lowpass_type = this.FILTER_TYPE_FLAGS.BIQUAD;
versionFilterDefaults.gyro_lowpass2_hz = 0;
versionFilterDefaults.gyro_lowpass2_type = this.FILTER_TYPE_FLAGS.BIQUAD;
versionFilterDefaults.dterm_lowpass_hz = 150;
versionFilterDefaults.dterm_lowpass_type = this.FILTER_TYPE_FLAGS.BIQUAD;
versionFilterDefaults.dterm_lowpass2_hz = 150;
versionFilterDefaults.dterm_lowpass2_type = this.FILTER_TYPE_FLAGS.BIQUAD;
// Introduced in 1.42
versionFilterDefaults.gyro_lowpass_hz = 200;
versionFilterDefaults.gyro_lowpass_dyn_min_hz = 200;
versionFilterDefaults.gyro_lowpass_dyn_max_hz = 500;
versionFilterDefaults.gyro_lowpass_type = this.FILTER_TYPE_FLAGS.PT1;
versionFilterDefaults.gyro_lowpass2_hz = 250;
versionFilterDefaults.gyro_lowpass2_type = this.FILTER_TYPE_FLAGS.PT1;
versionFilterDefaults.dterm_lowpass_hz = 150;
versionFilterDefaults.dterm_lowpass_dyn_min_hz = 70;
versionFilterDefaults.dterm_lowpass_dyn_max_hz = 170;
versionFilterDefaults.dterm_lowpass_type = this.FILTER_TYPE_FLAGS.PT1;
versionFilterDefaults.dterm_lowpass2_hz = 150;
versionFilterDefaults.dterm_lowpass2_type = this.FILTER_TYPE_FLAGS.PT1;
// Introduced in 1.44
versionFilterDefaults.dyn_notch_q = 300;
versionFilterDefaults.gyro_lowpass_hz = 250;
versionFilterDefaults.gyro_lowpass_dyn_min_hz = 250;
versionFilterDefaults.gyro_lowpass2_hz = 500;
versionFilterDefaults.dterm_lowpass_hz = 75;
versionFilterDefaults.dterm_lowpass_dyn_min_hz = 75;
versionFilterDefaults.dterm_lowpass_dyn_max_hz = 150;
// Introduced in 1.45
if (semver.gte(this.CONFIG.apiVersion, API_VERSION_1_45)) {
versionFilterDefaults.dyn_notch_min_hz = 100;
}
return versionFilterDefaults;
},
getPidDefaults() {
// if defaults change they should go here
// Introduced in 1.44
const versionPidDefaults = [45, 80, 30, 40, 120, 47, 84, 34, 46, 125, 45, 80, 0, 0, 120];
return versionPidDefaults;
},
getSliderDefaults() {
return this.DEFAULT_TUNING_SLIDERS;
},
RATES_TYPE: {
BETAFLIGHT: 0,
RACEFLIGHT: 1,
KISS: 2,
ACTUAL: 3,
QUICKRATES: 4,
},
};
export default FC;