diff --git a/README.md b/README.md
index 1d1032067..9bcbb5711 100644
--- a/README.md
+++ b/README.md
@@ -41,12 +41,42 @@ Depending on target operating system, _INAV Configurator_ is distributed as _sta
### Linux
1. Visit [release page](https://github.com/iNavFlight/inav-configurator/releases)
-1. Download Configurator for Linux platform (linux32 and linux64 are present)
-1. Extract tar.gz archive
-1. Make the following files executable:
- * inav-configurator `chmod +x inav-configurator`
- * (5.0.0+) chrome_crashpad_handler `chmod +x chrome_crashpad_handler`
-1. Run INAV Configurator app from unpacked folder
+2. Download Configurator for Linux platform (linux32 and linux64 are present)
+ * **.rpm** is the Fedora installation file. Just download and install using `sudo dnf localinstall /path/to/INAV-Configurator_linux64-x.y.z-x86_64.rpm` or open it with a package manager (e.g. via Files)
+ * **.deb** is the Debian/Ubuntu installation file. Just download and install using `sudo apt install /path/to/INAV-Configurator_linux64_x.y.z.deb` or open it with a package manager (e.g. via the File Manager)
+ * **.tar.gz** is a universal archive. Download and continue with these instructions to install
+3. Change to the directory containing the downloaded **tar.gz** file
+4. download [this](https://raw.githubusercontent.com/iNavFlight/inav-configurator/master/assets/linux/inav-configurator.desktop) file to the same directory. Its filename should be `inav-configurator.desktop`.
+5. Extract **tar.gz** archive
+```
+tar -C /tmp/ -xf INAV-Configurator_linuxNN_x.y.z.tar.gz
+```
+ **NN** is the bits of your OS. **x.y.z** is the INAV Configurator version number.
+
+6. If this is the first time installing INAV Configurator, create a home for its files
+```
+sudo mkdir /opt/inav
+sudo chown $USER /opt/inav
+```
+7. Move the temporary files in to their home
+```
+mv /tmp/INAV\ Configurator /opt/inav/inav-configurator
+```
+8. Update the application icon.
+```
+sudo mkdir /opt/inav/inav-configurator/icon
+sudo cp /opt/inav/inav-configurator/images/inav_icon_128.png /opt/inav/inav-configurator/icon
+```
+9. As a one off, move the desktop file into the applications directory
+```
+sudo mv inav-configurator.desktop /usr/share/applications/
+```
+10. Make the following files executable:
+ * inav-configurator `chmod +x /opt/inav/inav-configurator/inav-configurator`
+ * (5.0.0+) chrome_crashpad_handler `chmod +x /opt/inav/inav-configurator/chrome_crashpad_handler`
+11. Run INAV Configurator app from unpacked folder `/opt/inav/inav-configurator/inav-configurator`
+
+#### Notes
On some Linux distros, you may be missing `libatomic`, a `NW.JS` (specially `libnode.so`) dependency. If so, please install `libatomic` using your distro's package manager, e.g:
@@ -54,15 +84,17 @@ On some Linux distros, you may be missing `libatomic`, a `NW.JS` (specially `lib
* Debian / Ubuntu: `sudo apt install libatomic1`
* Fedora: `sudo dnf install libatomic`
+1. Dont forget to add your user into dialout group "sudo usermod -aG dialout YOUR_USERNAME" for serial access
+2. If you have 3D model animation problems, enable "Override software rendering list" in Chrome flags chrome://flags/#ignore-gpu-blacklist
+
### Mac
1. Visit [release page](https://github.com/iNavFlight/inav-configurator/releases)
1. Download Configurator for Mac platform
1. Extract ZIP archive
1. Run INAV Configurator
-1. Configurator is not signed, so you have to allow Mac to run untrusted application. There might be a monit for it during first run
-## Building and running INAV Configurator locally (for development or Linux users)
+## Building and running INAV Configurator locally (for development)
For local development, **node.js** build system is used.
@@ -83,6 +115,7 @@ in the `./dist/` directory.
- **release**: Create NW.js apps for each supported platform (win32, osx64 and linux64) in the `./apps`
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.
+ `--installer` argument can be added to build installers for particular OS. NOTE: MacOS Installer can be built with MacOS only.
To build a specific release, use the command `release --platform="win64"` for example.
@@ -94,7 +127,7 @@ To be able to open Inspector, you will need SDK flavours of NW.js
## 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 (Aerial View), and MapProxy map providers.
INAV Configurator is shipped **WITHOUT** API key for Bing Maps. That means: every user who wants to use Bing Maps has to create own account, agree to all _Terms and Conditions_ required by Bing Maps and configure INAV Configuerator by himself.
### How to choose Map provider
@@ -125,17 +158,16 @@ INAV Configurator is shipped **WITHOUT** API key for Bing Maps. That means: ever
1. Enter MapProxy service layer (inav_layer if configured from MAPPROXY.md)
1. Once completed, you can zoom in on area you will be flying in while connected to the internet in either GPS or Mission Control tab to save the cache for offline use
+## Font Customisation
+
+INAV provides the font images so that custom fonts can be created for your personal preference. This is the case for both analogue and digital fonts. The resources can be found in the [osd](/resources/osd) folder. Within the **analogue** and **digital** subfolders, you will find information on compiling your own fonts. There is also an [INAV Character Map](/resources/osd/INAV%20Character%20Map.md) document. This contains previews of all the character images in the fonts, and the appropriate variable names within the firmware and Configurator. There are tools for compiling the [analogue](https://github.com/fiam/max7456tool) and [digital](https://github.com/MrD-RC/hdosd-font-tool) fonts. New font submissions via pull requests are welcome.
+
## Notes
### WebGL
Make sure Settings -> System -> "User hardware acceleration when available" is checked to achieve the best performance
-### Linux users
-
-1. Dont forget to add your user into dialout group "sudo usermod -aG dialout YOUR_USERNAME" for serial access
-2. If you have 3D model animation problems, enable "Override software rendering list" in Chrome flags chrome://flags/#ignore-gpu-blacklist
-
## Issue trackers
For INAV configurator issues raise them here
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index a0663a96e..740ad2e02 100755
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -2,7 +2,6 @@
"translation_version": {
"message": "0"
},
-
"options_title": {
"message": "Application Options"
},
@@ -21,7 +20,6 @@
"options_render": {
"message": "Configurator rendering options"
},
-
"connect": {
"message": "Connect"
},
@@ -139,7 +137,129 @@
"tabAuxiliary": {
"message": "Modes"
},
-
+ "tabSitl": {
+ "message" : "SITL"
+ },
+ "sitlDemoMode": {
+ "message": "Demo Mode"
+ },
+ "sitlResetDemoModeData": {
+ "message": "Reset Demo Mode"
+ },
+ "sitlOSNotSupported": {
+ "message": "SITL is not supported on this operating system."
+ },
+ "sitlOptions": {
+ "message": "SITL Options"
+ },
+ "sitlEnableSim": {
+ "message": "Enable simulator"
+ },
+ "sitlSimulator": {
+ "message": "Simulator"
+ },
+ "sitlUseImu": {
+ "message": "Use IMU"
+ },
+ "sitlSimIP": {
+ "message" : "Simulator IP"
+ },
+ "sitlPort": {
+ "message" : "Simulator Port"
+ },
+ "sitlChannelMap": {
+ "message": "Channel Mapping"
+ },
+ "sitlSimInput": {
+ "message": "Simulator Input"
+ },
+ "sitlInavOutput": {
+ "message": "INAV Output"
+ },
+ "sitlLog": {
+ "message": "Log"
+ },
+ "sitlStart": {
+ "message": "Start"
+ },
+ "sitlStop": {
+ "message": "Stop"
+ },
+ "sitlStopped": {
+ "message": "SITL stopped\n"
+ },
+ "sitlProfiles": {
+ "message": "SITL Profiles"
+ },
+ "sitlNew": {
+ "message": "New"
+ },
+ "sitlSave": {
+ "message": "Save"
+ },
+ "sitlDelete": {
+ "message": "Delete"
+ },
+ "sitlNewProfile": {
+ "message": "New SITL Profile"
+ },
+ "sitlEnterName": {
+ "message": "(Profile name)"
+ },
+ "sitlProfileExists": {
+ "message": "A profile with this name already exists."
+ },
+ "sitlStdProfileCantDeleted": {
+ "message": "SITL standard profile can't be deleted."
+ },
+ "sitlStdProfileCantOverwritten": {
+ "message": "SITL standard profile can't be overwritten. Please create a new one."
+ },
+ "sitlSerialToTCP": {
+ "message": "Serial to TCP (UART)"
+ },
+ "sitlSerialProtocoll": {
+ "message": "Preset for RX Protocoll"
+ },
+ "sitlSerialStopbits": {
+ "message": "Stopbits"
+ },
+ "sitlSerialPort": {
+ "message": "Serial port"
+ },
+ "sitlSerialTCPPort": {
+ "message": "TCP port"
+ },
+ "sitlSerialParity": {
+ "message": "Parity"
+ },
+ "sitlSerialTcpEnable": {
+ "message": "Enable"
+ },
+ "sitlHelp": {
+ "message": "SITL (Software in the loop) allows to run INAV completely in software on the PC without using a flight controller and simulate complete FPV flights. For this, INAV is compiled with a normal PC compiler. The sensors are replaced by data provided by a simulator. Currently supported are:
"
+ },
+ "sitlProfilesHelp": {
+ "message": "Profiles are saved locally. The profiles contain not only all data of this tab, but also the configuration file (\"EEPROM\") of INAV itself. Note: Standard profiles can't be overwriten. To save your changes, create a new profile. "
+ },
+ "sitlEnableSimulatorHelp": {
+ "message": "If this option is deactivated, only UARTS (MSP/Configurator) can be used. Useful to configure INAV without having to start the simulator."
+ },
+ "sitlUseImuHelp": {
+ "message": "Use IMU sensor data from the simulator instead of using attitude data from the simulator directly (Experimental, not recommended)."
+ },
+ "sitlIpHelp": {
+ "message": "IP address of the computer on which the simulator is running. If the simulator is running on the same computer, leave it at \"127.0.0.1"
+ },
+ "sitlPortHelp": {
+ "message": "Port number of the interface of the simulator. Note: The RealFlight port is fixed and cannot be changed."
+ },
+ "sitlSer2TcpHelp": {
+ "message": "Devices with a UART interface can be used with SITL via a serial to USB interface. Especially intended for serial receivers to use the full number of channels. "
+ },
+ "auxiliaryAcroEnabled": {
+ "message": "ACRO"
+ },
"serialPortOpened": {
"message": "MSP connection successfully opened with ID: $1"
},
@@ -161,7 +281,7 @@
"connectionBleType": {
"message": "BLE device type: $1"
},
- "connectionBleNotSupported" : {
+ "connectionBleNotSupported": {
"message": "Connection error: Firmware doesn't support BLE connections. Abort."
},
"connectionBleInterrupted": {
@@ -191,7 +311,6 @@
"usbDeviceUdevNotice": {
"message": "Are udev rules installed correctly? See docs for instructions"
},
-
"stm32UsbDfuNotFound": {
"message": "USB DFU not found"
},
@@ -341,6 +460,9 @@
"statusbar_cpu_load": {
"message": "CPU Load: $1%"
},
+ "statusbar_arming_flags": {
+ "message": "Arming Flags:"
+ },
"dfu_connect_message": {
"message": "Please use the Firmware Flasher to access DFU devices"
@@ -362,7 +484,9 @@
"defaultWelcomeIntro": {
"message": "Welcome to INAV - Configurator, a utility designed to simplify updating, configuring and tuning of your flight controller."
},
-
+ "defaultWelcomeHead": {
+ "message": "Hardware"
+ },
"defaultWelcomeText": {
"message": "The application supports all hardware that can run INAV (Matek F765-WSE, Matek H743-SLIM and many other). The full list of recommended hardware is available here.
The firmware source code can be downloaded from here The newest binary firmware image is available here.
Latest STM USB VCP Drivers can be downloaded from here Latest Zadig for Windows DFU flashing can be downloaded from here "
},
@@ -698,6 +822,12 @@
"featureBLACKBOXTip": {
"message": "Configure via the BlackBox tab after enabling."
},
+ "onboardLoggingBlackbox": {
+ "message": "Blackbox logging device"
+ },
+ "onboardLoggingBlackboxRate": {
+ "message": "Portion of flight loop iterations to log (logging rate)"
+ },
"featureCHANNEL_FORWARDING": {
"message": "Forward aux channels to servo outputs"
},
@@ -761,7 +891,7 @@
"serialrx_inverted": {
"message": "Serial Port Inverted (comparing to protocol default)"
},
- "serialrx_halfduplex" : {
+ "serialrx_halfduplex": {
"message": "Serial receiver half-duplex"
},
"configurationFeaturesHelp": {
@@ -1010,14 +1140,20 @@
"configurationGPSProtocol": {
"message": "Protocol"
},
- "configurationGPSUseGalileo": {
- "message": "Gps use Galileo Satellites"
+ "configurationGPSUseGalileo": {
+ "message": "Gps use Galileo Satellites (EU)"
+ },
+ "configurationGPSUseBeidou": {
+ "message": "Gps use BeiDou Satellites (CN)"
+ },
+ "configurationGPSUseGlonass": {
+ "message": "Gps use Glonass Satellites (RU)"
},
"tzOffset": {
- "message": "Timezone Offset [Mins]"
+ "message": "Timezone Offset"
},
"tzOffsetHelp": {
- "message": "Time zone offset from UTC, in minutes. This is applied to the GPS time for logging and time-stamping of Blackbox logs. (Default = 0)"
+ "message": "Time zone offset from UTC. This is applied to the GPS time for logging and time-stamping of Blackbox logs. (Default = 0 mins)"
},
"tzAutomaticDST": {
"message": "Automatic Daylight Savings Time"
@@ -1166,11 +1302,8 @@
"portsFunction_DJI_FPV": {
"message": "DJI FPV VTX"
},
- "portsFunction_HDZERO_VTX": {
- "message": "HDZero VTX"
- },
- "portsFunction_IMU2": {
- "message": "Secondary IMU"
+ "portsFunction_MSP_DISPLAYPORT": {
+ "message": "MSP DisplayPort"
},
"pidTuning_ShowAllPIDs": {
"message": "Show all PIDs"
@@ -1182,7 +1315,7 @@
"message": "Reset PID Controller"
},
"pidTuning_PIDgains": {
- "message" :"PID gains"
+ "message": "PID gains"
},
"pidTuning_Name": {
"message": "Name"
@@ -1247,7 +1380,7 @@
"pidTuning_RollAndPitchExpo": {
"message": "Roll & Pitch Expo"
},
- "pidTuning_YawExpo" : {
+ "pidTuning_YawExpo": {
"message": "Yaw Expo"
},
"pidTuning_MaxRollAngle": {
@@ -1283,6 +1416,9 @@
"pidTuning_mainFilters": {
"message": "Gyro filters"
},
+ "pidTuning_advancedFilters": {
+ "message": "Advanced gyro filters"
+ },
"pidTuning_gyro_main_lpf_hz": {
"message": "Main gyro filter cutoff frequency"
},
@@ -1412,6 +1548,27 @@
"pidTuning_LoadedProfile": {
"message": "Loaded Profile: $1"
},
+ "pidTuning_gyro_use_dyn_lpf": {
+ "message": "Dynamic gyro LPF"
+ },
+ "pidTuning_gyro_use_dyn_lpf_help": {
+ "message": "When enabled, main gyro LPF frequency is automatically adjusted based on the current throttle position. When disabled, static LPF cutoff frequency is used."
+ },
+ "pidTuning_gyro_dyn_lpf_min_hz": {
+ "message": "Dynamic gyro LPF min. cutoff"
+ },
+ "pidTuning_gyro_dyn_lpf_max_hz": {
+ "message": "Dynamic gyro LPF max. cutoff"
+ },
+ "pidTuning_gyro_dyn_lpf_curve_expo": {
+ "message": "Dynamic gyro LPF curve expo"
+ },
+ "pidTuning_gyro_dyn_lpf_min_hz_help": {
+ "message": "Defines the gyro LPF cutoff frequency at minimum throttle. When throttle is increased, LPF cutoff frequency is increased as well, up to the maximum cutoff frequency."
+ },
+ "pidTuning_gyro_dyn_lpf_max_hz_help": {
+ "message": "Defines the gyro LPF cutoff frequency at maximum throttle. When throttle is decreased, LPF cutoff frequency is decreased as well, down to the minimum cutoff frequency."
+ },
"loadedBatteryProfile": {
"message": "Loaded Battery Profile: $1"
},
@@ -1489,7 +1646,7 @@
"auxiliaryHelp": {
"message": "Use ranges to define the switches on your transmitter and corresponding mode assignments. A receiver channel that gives a reading between a range min/max will activate the mode. Remember to save your settings using the Save button."
},
- "auxiliaryToggleUnused": {
+ "auxiliaryToggleUnused": {
"message": "Hide unused modes"
},
"auxiliaryMin": {
@@ -1501,6 +1658,9 @@
"auxiliaryAddRange": {
"message": "Add Range"
},
+ "auxiliaryAutoChannelSelect": {
+ "message": "AUTO"
+ },
"auxiliaryButtonSave": {
"message": "Save"
},
@@ -1562,7 +1722,7 @@
"adjustmentsGroupPIDTuning": {
"message": "PID Tuning"
},
- "adjustmentsGroupNavigationFlight" : {
+ "adjustmentsGroupNavigationFlight": {
"message": "Navigation and Flight"
},
"adjustmentsGroupMisc": {
@@ -1745,6 +1905,9 @@
"adjustmentsFunction58": {
"message": "Fixed Wing Level Trim"
},
+ "adjustmentsFunction59": {
+ "message": "Multi Mission Index Adjustment"
+ },
"adjustmentsSave": {
"message": "Save"
},
@@ -1800,7 +1963,7 @@
"message": "Mixer wizard"
},
"mixerWizardInfo": {
- "message":"
Remove propellers
Connect LiPo and use Outputs Tab to test all motors
Note the position of each motor (motor #1 - Left Top and so on)
Fill the table below
"
+ "message": "
Remove propellers
Connect LiPo and use Outputs Tab to test all motors
Note the position of each motor (motor #1 - Left Top and so on)
Fill the table below
"
},
"gpsHead": {
"message": "Position"
@@ -1875,7 +2038,7 @@
"message": "Magnetometer Alignment"
},
"magnetometerHelp": {
- "message": "Adjust the magnetometer position until you get the same on the quad. Note: If you have changed your flight controller alignment, make your adjustment relative to the FC position and not to the UAV position "
+ "message": "Adjust the magnetometer orientation to match physical orientation on the aircraft. If magnetometer is not BN-880, adjust according to \"compass direction\" arrow or axis markings on your magnetometer model. Note: Magnetometer alignment is relative to FC. Make sure to align FC first (board_align_yaw, board_align_pitch, board_align_roll)."
},
"magnetometerOrientationPreset": {
"message": "Orientation presets"
@@ -1886,6 +2049,20 @@
"magnetometerElementToShow": {
"message": "Element to show"
},
+
+ "axisTableTitleAxis": {
+ "message": "Axis"
+ },
+ "axisTableTitleSlider": {
+ "message": "Slider"
+ },
+ "axisTableTitleValue": {
+ "message": "Value [degree]"
+ },
+
+
+
+
"configurationMagnetometerHelp": {
"message": "Note: Remember to configure a Serial Port (via Ports tab) when using the Magnetometer feature."
},
@@ -1933,6 +2110,9 @@
"cliReboot": {
"message": "CLI reboot detected"
},
+ "cliDocsBtn": {
+ "message": "CLI Command Docs"
+ },
"cliSaveToFileBtn": {
"message": "Save to File"
},
@@ -1946,25 +2126,31 @@
"message": "CLI output successfully saved to file"
},
"cliClearOutputHistoryBtn": {
- "message": "Clear output history"
+ "message": "Clear Screen"
},
"cliCopyToClipboardBtn": {
- "message": "Copy to clipboard"
+ "message": "Copy to Clipboard"
},
"cliExitBtn": {
- "message": "EXIT"
+ "message": "Exit"
},
"cliSaveSettingsBtn": {
- "message": "SAVE SETTINGS"
+ "message": "Save Settings"
},
"cliMscBtn": {
"message": "MSC"
},
+ "cliDiffAllBtn": {
+ "message": "Diff All"
+ },
+ "cliCommandsHelp": {
+ "message": "Type or paste commands in the box to the left. You can use the up and down arrow keys to recall previously typed commands. Type 'help' or click on this icon for more info."
+ },
"cliCopySuccessful": {
"message": "Copied!"
},
"cliLoadFromFileBtn": {
- "message": "Load from file"
+ "message": "Load from File"
},
"cliConfirmSnippetDialogTitle": {
"message": "Review loaded commands"
@@ -2018,10 +2204,19 @@
"blackboxButtonSave": {
"message": "Save and reboot"
},
-
+ "serialLogging": {
+ "message": "Outboard serial logging device"
+ },
"serialLoggingSupportedNote": {
"message": "You can log to an external logging device (such as an OpenLog or compatible clone) by using a serial port. Configure the port on the Ports tab."
},
+
+ "onboardLoggingFlashLogger": {
+ "message": "Onboard dataflash chip"
+ },
+ "OnboardSDCard": {
+ "message": "Onboard SD card"
+ },
"sdcardNote": {
"message": "Flight logs can be recorded to your flight controller's onboard SD card slot."
},
@@ -2047,6 +2242,9 @@
"dataflashConfirmEraseNote": {
"message": "This will erase any Blackbox logs or other data contained in the dataflash which will take about 20 seconds, are you sure?"
},
+ "dataflashEraseing": {
+ "message": "Erase in progress, please wait..."
+ },
"dataflashSavingTitle": {
"message": "Saving dataflash to file"
},
@@ -2125,11 +2323,10 @@
"message": "No reboot sequence"
},
"firmwareFlasherOnlineSelectBoardDescription": {
-
- "message": "Select your board to see available online firmware releases - Select the correct firmware appropriate for your board."
+ "message": "Select your board to see available online firmware releases - Select the correct firmware appropriate for your board. Please note that Auto-select Target will only work for INAV firmwares 5.0 and newer."
},
"firmwareFlasherOnlineSelectFirmwareVersionDescription": {
- "message": "Select firmware version for your board."
+ "message": "Select firmware version for your board. Note: even though you can flash different versions of the firmware using this Configurator. When setting up the flight controller, you should match the major and minor version numbers for both firmware and Configurator."
},
"firmwareFlasherNoRebootDescription": {
"message": "Enable if you powered your FC while the bootloader pins are jumpered or have your FC's BOOT button pressed."
@@ -2158,10 +2355,10 @@
"firmwareFlasherManualBaudDescription": {
"message": "Manual selection of baud rate for boards that don't support the default speed or for flashing via bluetooth. Note: Not used when flashing via USB DFU"
},
- "firmwareFlasherShowDevelopmentReleases":{
+ "firmwareFlasherShowDevelopmentReleases": {
"message": "Show unstable releases"
},
- "firmwareFlasherShowDevelopmentReleasesDescription":{
+ "firmwareFlasherShowDevelopmentReleasesDescription": {
"message": "Show Release-Candidates and Development Releases."
},
"firmwareFlasherOptionLabelSelectFirmware": {
@@ -2176,6 +2373,9 @@
"firmwareFlasherOptionLabelSelectFirmwareVersionFor": {
"message": "Choose a Firmware version for"
},
+ "firmwareFlasherButtonAutoSelect": {
+ "message": "Auto-select Target"
+ },
"firmwareFlasherButtonLoadLocal": {
"message": "Load Firmware [Local]"
},
@@ -2210,7 +2410,7 @@
"message": "Warning"
},
"firmwareFlasherWarningText": {
- "message": "Please do not try to flash non-iNAV hardware with this firmware flasher. Do notdisconnect the board or turn off your computer while flashing.
Note: STM32 bootloader is stored in ROM, it cannot be bricked. Note: Auto-Connect is always disabled while you are inside firmware flasher. Note: Make sure you have a backup; some upgrades/downgrades will wipe your configuration. Note: If you have problems flashing try disconnecting all cables from your FC first, try rebooting, upgrade chrome, upgrade drivers. Note: When flashing boards that have directly connected USB sockets (SPRacingF3Mini, Sparky, ColibriRace, etc) ensure you have read the USB Flashing section of the INAV manual and have the correct software and drivers installed"
+ "message": "Please do not try to flash non-iNAV hardware with this firmware flasher. Do notdisconnect the board or turn off your computer while flashing.
Note: STM32 bootloader is stored in ROM, it cannot be bricked. Note: Make sure you have a backup; some upgrades/downgrades will wipe your configuration. Note: If you have problems flashing try disconnecting all cables from your FC first, try rebooting, upgrade chrome, upgrade drivers. Note: When flashing boards that have directly connected USB sockets (Matek H743-SLIM, Holybro Kakute etc) ensure you have read the USB Flashing section of the INAV manual and have the correct software and drivers installed"
},
"firmwareFlasherRecoveryHead": {
"message": "Recovery / Lost communication"
@@ -2243,7 +2443,6 @@
"ledStripEepromSaved": {
"message": "EEPROM saved: LED"
},
-
"controlAxisRoll": {
"message": "Roll [A]"
},
@@ -2256,6 +2455,9 @@
"controlAxisThrottle": {
"message": "Throttle [T]"
},
+ "controlAxisMotor": {
+ "message": "Motor"
+ },
"radioChannelShort": {
"message": "CH "
},
@@ -2380,31 +2582,31 @@
"message": "ESC protocol"
},
"escRefreshRate": {
- "message" : "ESC refresh rate"
+ "message": "ESC refresh rate"
},
"escProtocolHelp": {
- "message" : "ESC has to support chosen protocol. Change only if you know that ESC supports it!"
+ "message": "ESC has to support chosen protocol. Change only if you know that ESC supports it!"
},
"escRefreshRatelHelp": {
- "message" : "ESC has to support refresh rate. Change only if you know that ESC supports it!"
+ "message": "ESC has to support refresh rate. Change only if you know that ESC supports it!"
},
"servoRefreshRate": {
- "message" : "Servo refresh rate"
+ "message": "Servo refresh rate"
},
"servoRefreshRatelHelp": {
- "message" : "Servo has to support refresh rate. Change only if you know that servo supports it. Too high refresh rate might damage servos!"
+ "message": "Servo has to support refresh rate. Change only if you know that servo supports it. Too high refresh rate might damage servos!"
},
"logPwmOutputDisabled": {
- "message" : "PWM output is disabled. Motors and servos will not work. Use Outputs tab to enable!"
+ "message": "PWM output is disabled. Motors and servos will not work. Use Outputs tab to enable!"
},
"configurationGyroSyncTitle": {
- "message" : "Synchronize looptime with gyroscope"
+ "message": "Synchronize looptime with gyroscope"
},
"configurationGyroLpfTitle": {
- "message" : "Gyroscope LPF cutoff frequency"
+ "message": "Gyroscope LPF cutoff frequency"
},
"configurationGyroSyncDenominator": {
- "message" : "Gyroscope denominator"
+ "message": "Gyroscope denominator"
},
"yawJumpPreventionLimit": {
"message": "Yaw jump prevention"
@@ -2572,7 +2774,7 @@
"message": "Optic Flow Calibration"
},
"OpflowCalText": {
- "message": "After pressing the button you have 30 seconds to hold the copter in the air and tilt it to sides without moving it horizontally. Note that optic flow sensor needs to observe the surface at all times."
+ "message": "After pressing the button you have 30 seconds to hold the model in the air and tilt it to sides without moving it horizontally. Note that optic flow sensor needs to observe the surface at all times."
},
"OpflowCalBtn": {
"message": "Calibrate Optic Flow sensor"
@@ -2584,13 +2786,56 @@
"message": "Acc Gain"
},
"NoteCalibration": {
- "message": "Note: If the flightcontroller is mounted in another angle or upside down, do the calibration steps with the flightcontroller pointing as shown in the pictures, not the quad (otherwise calibration won´t work)."
+ "message": "Note: If the IMU is mounted in another angle or on the underside of the flight controller. Do the calibration steps with the IMU pointing as shown in the pictures, not the quad (otherwise calibration won´t work)."
},
"AccBtn": {
"message": "Calibrate Accelerometer"
},
+
+ "stepTitle1": {
+ "message": "Step 1"
+ },
+ "stepTitle2": {
+ "message": "Step 2"
+ },
+ "stepTitle3": {
+ "message": "Step 3"
+ },
+ "stepTitle4": {
+ "message": "Step 4"
+ },
+ "stepTitle5": {
+ "message": "Step 5"
+ },
+ "stepTitle6": {
+ "message": "Step 6"
+ },
+ "MagXText": {
+ "message": "Zero X"
+ },
+ "MagYText": {
+ "message": "Zero Y"
+ },
+ "MagZText": {
+ "message": "Zero Z"
+ },
+ "MagGainXText": {
+ "message": "Gain X"
+ },
+ "MagGainYText": {
+ "message": "Gain Y"
+ },
+ "MagGainZText": {
+ "message": "Gain Z"
+ },
+ "OpflowScaleText": {
+ "message": "Scale"
+ },
+ "AccResetBtn": {
+ "message": "Reset Accelerometer Calibration"
+ },
"MagCalText": {
- "message": "After pressing the button you have 30 seconds to hold the copter in the air and rotate it so that each side (front, back, left, right, top and bottom) points down towards the earth."
+ "message": "After pressing the button you have 30 seconds to hold the model in the air and rotate it so that each side (front, back, left, right, top and bottom) points down towards the earth. Be sure that your compass is not near magnets or electromagnets when installed in the craft or performing the calibration."
},
"MagBtn": {
"message": "Calibrate Compass"
@@ -2640,6 +2885,12 @@
"tabAdvancedTuningTitle": {
"message": "Advanced Tuning"
},
+ "tabAdvancedTuningAirplaneTuningTitle": {
+ "message": ": Fixed Wing"
+ },
+ "tabAdvancedTuningMultirotorTuningTitle": {
+ "message": ": Multirotors"
+ },
"tabAdvancedTuningGenericTitle": {
"message": "Generic settings"
},
@@ -2802,18 +3053,84 @@
"rthAbortThresholdHelp": {
"message": "RTH sanity checking feature will notice if the distance to home is increasing during RTH and if it exceeds the threshold defined by this parameter, instead of continuing RTH the UAV will enter emergency landing. Default is 500m which is safe enough for both multirotors and airplanes."
},
+ "fsMissionDelay": {
+ "message": "Failsafe Mission Delay"
+ },
+ "fsMissionDelayHelp": {
+ "message": "Defines a delay in seconds, how long INAV has to wait before Failsafe RTH is engaged, if the Aircraft is in a waypoint mission. Set to -1 to disable Failsafe entirely [0-600s]"
+ },
+ "drNavigation": {
+ "message": "Dead Reckoning Navigation"
+ },
+ "drNavigationHelp": {
+ "message": "Allows INAV to continue navigation (Waypoint, Return to Home, Cruise, Coursehold, etc.) during short GPS outages. This feature needs compass and airspeed sensor enabled on Fixed Wing aircraft."
+ },
"rthAltitude": {
"message": "RTH altitude"
},
"rthAltitudeHelp": {
"message": "Used in Extra, Fixed and 'At Least' RTH altitude modes"
},
+ "rthTrackBack": {
+ "message": "RTH Track Back Mode"
+ },
+ "rthTrackBackHelp": {
+ "message": "When enabled, the aircraft will follow its last path backwards first before flying home directly. Fixed Wing crafts will fly back the path with climbing but not descending. Usage modes for RTH Track Back. OFF = disabled, ON = Normal and Failsafe RTH, FS = Failsafe RTH only."
+ },
+ "rthTrackBackDistance": {
+ "message": "RTH Track Back Distance"
+ },
+ "rthTrackBackDistanceHelp": {
+ "message": "Distance flown during Track Back. Normal RTH is executed once this total flight distance is exceeded [m]."
+ },
+ "rthSafeHome": {
+ "message": "Safe Home Mode"
+ },
+ "rthSafeHomeHelp": {
+ "message": "Used to control when safehomes will be used. Possible values are OFF, RTH and RTH_FS. See Safehome documentation for more information."
+ },
+ "rthSafeHomeDistance": {
+ "message": "Safe Home Max Distance"
+ },
+ "rthSafeHomeDistanceHelp": {
+ "message": "In order for a safehome to be used, it must be less than this distance [in cm] from the arming point."
+ },
+ "navMaxAltitude": {
+ "message": "Max Altitude for Navigation"
+ },
+ "navMaxAltitudeHelp": {
+ "message": "Max allowed altitude (above Home Point) that applies to all NAV modes (including Altitude Hold). 0 means limit is disabled"
+ },
"rthHomeAltitudeLabel": {
"message": "RTH Home altitude"
},
"rthHomeAltitudeHelp": {
"message": "Used when not landing at the home point. Upon arriving at home, the plane will loiter and change altitude to the RTH Home Altitude. Default is 0, which is feature disabled."
},
+ "rthTwoStage": {
+ "message": "Climb First Stage Method"
+ },
+ "rthTwoStageHelp": {
+ "message": "Staged Return To Home Function if Climb First is enabled. Set Climb First Stage Altitude to 0, to use classic Single-Stage RTH."
+ },
+ "rthTwoStageAlt": {
+ "message": "Climb First Stage Altitude"
+ },
+ "rthTwoStageAltHelp": {
+ "message": "Altitude Setting for the first Stage of Staged RTH. Set to 0 to Disable Two-Stage RTH [0-65000cm]"
+ },
+ "rthUseLinearDescent": {
+ "message": "Use Linear Descent"
+ },
+ "rthUseLinearDescentHelp": {
+ "message": "If enabled, the aircraft will slowly descent to the RTH Home Altitude on the heading home leg of RTH."
+ },
+ "rthLinearDescentStart": {
+ "message": "Linear Descent Start Distance"
+ },
+ "rthLinearDescentStartHelp": {
+ "message": "This is the distance away from the home position to start the linear descent. If set to 0, the linear descent will start immediately."
+ },
"landMaxAltVspd": {
"message": "The craft will start to descend at this speed, once it reaches the Home location."
},
@@ -2895,6 +3212,12 @@
"pitchToThrottleHelp": {
"message": "In navigation modes, each degree of climb will add this many units to the cruise throttle. Conversely, each degree of diving will substract from it."
},
+ "minThrottleDownPitch": {
+ "message": "Min Throttle Down Pitch"
+ },
+ "minThrottleDownPitchHelp": {
+ "message": "Automatic pitch down angle when throttle is at 0 in angle mode. Progressively applied between cruise throttle and zero throttle."
+ },
"pitchToThrottleSmoothing": {
"message": "Throttle smoothing"
},
@@ -2916,12 +3239,24 @@
"loiterDirectionHelp": {
"message": "This setting allows you to choose the loiter direction. Selecting YAW allows you to change the loiter direction with the yaw stick."
},
- "controlSmoothness": {
+ "controlSmoothness": {
"message": "Control Smoothness"
},
- "controlSmoothnessHelp": {
+ "controlSmoothnessHelp": {
"message": "How smoothly the autopilot controls the airplane to correct the navigation error [0-9]."
},
+ "wpTrackingAccuracy": {
+ "message": "Waypoint Tracking Accuracy"
+ },
+ "wpTrackingAccuracyHelp": {
+ "message": "How precise the craft tries to follow a waypoint track. Lower values means higher precision but can cause overshoots. 6 is a good starting point [0-10]."
+ },
+ "wpTrackingAngle": {
+ "message": "Waypoint Tracking Angle"
+ },
+ "wpTrackingAngleHelp": {
+ "message": "The angle the craft approaches the waypoint track. Lower values make the approach longer while higher values can cause overshoot. 60° is a good starting point [30-80]."
+ },
"powerConfiguration": {
"message": "Battery Estimation Settings"
},
@@ -2955,9 +3290,51 @@
"waypointConfiguration": {
"message": "Waypoint Navigation Settings"
},
+ "wpLoadBoot": {
+ "message": "Load Waypoints on Boot"
+ },
+ "wpLoadBootHelp": {
+ "message": "If enabled, Waypoint Missions in EEPROM will be loaded automatically after bootup."
+ },
+ "wpEnforceAlt": {
+ "message": "Enforce Altitude at Waypoint"
+ },
+ "wpEnforceAltHelp": {
+ "message": "Ensures that the altitude at each waypoint is reached before continue to the next one. Craft will hold position [loiter for fixed wing] and climb/decent until the altitude is within the set range [1-2000 cm] from the waypoint altitude. Set to [0] to disable. Fixed wing crafts should not be set below 500cm."
+ },
"waypointRadius": {
"message": "Waypoint radius"
},
+ "wpRestartMission": {
+ "message": "Restart Waypoint Mission"
+ },
+ "wpRestartMissionHelp": {
+ "message": "Sets restart behaviour for a WP mission when interrupted mid mission. START from first WP, RESUME from last active WP or SWITCH between START and RESUME each time WP Mode is reselected ON. SWITCH effectively allows resuming once only from a previous mid mission waypoint after which the mission will restart from the first waypoint."
+ },
+ "wpTurnSmoothing": {
+ "message": "Waypoint Turn Smoothing"
+ },
+ "wpTurnSmoothingHelp": {
+ "message": "Smooths turns during WP missions by switching to a loiter turn at waypoints. When set to ON the craft will reach the waypoint during the turn. When set to ON-CUT the craft will turn inside the waypoint without actually reaching it (cuts the corner)."
+ },
+ "navMotorStop": {
+ "message": "Navigation Motor Stop Override"
+ },
+ "navMotorStopHelp": {
+ "message": "When set to OFF the navigation system will not take over the control of the motor if the throttle is low (motor will stop). When set to OFF_ALWAYS the navigation system will not take over the control of the motor if the throttle was low even when failsafe is triggered. When set to AUTO_ONLY the navigation system will only take over the control of the throttle in autonomous navigation modes (NAV WP and NAV RTH). When set to ALL_NAV (default) the navigation system will take over the control of the motor completely and never allow the motor to stop even when the throttle is low. This setting only has an effect on NAV modes which take control of the throttle when combined with MOTOR_STOP and is likely to cause a stall if fw_min_throttle_down_pitch isn't set correctly or the pitch estimation is wrong for fixed wing models when not set to ALL_NAV."
+ },
+ "soarMotorStop": {
+ "message": "Soaring Mode Motor Stop"
+ },
+ "soarMotorStopHelp": {
+ "message": "Stops motor when Soaring mode enabled."
+ },
+ "soarPitchDeadband": {
+ "message": "Soaring Mode Pitch Deadband"
+ },
+ "soarPitchDeadbandHelp": {
+ "message": "Pitch Angle deadband when soaring mode enabled (deg). Angle mode inactive within deadband allowing pitch to free float whilst soaring."
+ },
"waypointRadiusHelp": {
"message": "This sets the distance away from a waypoint that triggers the waypoint as reached."
},
@@ -2968,73 +3345,130 @@
"message": "The maximum distance between the home point and the first waypoint."
},
"fixedWingNavigationConfiguration": {
- "message": "Fixed Wing Navigation Settings"
+ "message": "Fixed Wing Navigation Settings"
},
"osd_unsupported_msg1": {
- "message" : "Your flight controller isn't responding to OSD commands. This probably means that it does not have an integrated OSD."
+ "message": "Your flight controller isn't responding to OSD commands. This probably means that it does not have an integrated OSD."
},
"osd_unsupported_msg2": {
- "message" : "Note that some flight controllers have an onboard MinimOSD that can be flashed and configured with scarab-osd, however the MinimOSD cannot be configured through this interface."
+ "message": "Note that some flight controllers have an onboard MinimOSD that can be flashed and configured with scarab-osd, however the MinimOSD cannot be configured through this interface."
},
"osd_elements": {
- "message" : "Elements"
+ "message": "Elements"
},
"osd_preview_title": {
- "message" : "Preview (drag to change position)"
+ "message": "Preview (drag to change position)"
},
- "osd_preview_title_drag":{
+ "osd_preview_title_drag": {
"message": ""
},
"osd_video_format": {
- "message" : "Video Format"
+ "message": "Video Format"
},
"osd_craft_name": {
- "message" : "Craft Name"
+ "message": "Craft Name"
+ },
+ "osd_pilot_name": {
+ "message": "Pilot's Name"
},
"osd_units": {
- "message" : "Units"
+ "message": "Units"
},
"osd_main_voltage_decimals": {
- "message" : "Voltage Decimals"
+ "message": "Voltage Decimals"
},
"osd_mah_used_precision": {
- "message" : "mAh Used Precision"
+ "message": "mAh Used Precision"
},
"osd_coordinate_digits": {
- "message" : "Coordinate Digits"
+ "message": "Coordinate Digits"
},
"osd_plus_code_digits": {
- "message" : "Plus Code Digits"
+ "message": "Plus Code Digits"
},
"osd_plus_code_short": {
- "message" : "Plus Code Remove Leading Digits"
+ "message": "Plus Code Remove Leading Digits"
},
"osd_esc_rpm_precision": {
- "message": "ESC RPM precision"
+ "message": "ESC RPM precision"
},
"osd_esc_rpm_precision_help": {
"message": "The number of digits shown in the RPM display. If the RPM is higher than the number of digits, it will be shown in thousand RPM with as many decimal places as allowed."
- },
+ },
"osd_crosshairs_style": {
- "message" : "Crosshairs Style"
+ "message": "Crosshairs Style"
+ },
+ "osd_horizon_offset": {
+ "message": "AHI & HUD offset"
+ },
+ "osd_horizon_offset_help": {
+ "message": "Move the HUD and AHI up or down on the OSD to get it level with the actual horizon. The AHI can appear high or low depending on the camera angle in flight. NOTE: This does not work with the Pixel OSD. For that use the `osd_ahi_vertical_offset` command in the CLI."
},
"osd_left_sidebar_scroll": {
- "message" : "Left Sidebar Scroll"
+ "message": "Left Sidebar Scroll"
},
"osd_right_sidebar_scroll": {
- "message" : "Right Sidebar Scroll"
+ "message": "Right Sidebar Scroll"
},
"osd_crsf_lq_format": {
- "message" : "Crossfire LQ Format"
+ "message": "Crossfire LQ Format"
},
"osd_sidebar_scroll_arrows": {
- "message" : "Sidebar Scroll Arrows"
+ "message": "Sidebar Scroll Arrows"
},
"osd_home_position_arm_screen": {
- "message" : "Home Position on Arming Screen"
+ "message": "Home Position on Arming Screen"
+ },
+ "osd_hud_settings": {
+ "message": "Heads up Display settings"
+ },
+ "osd_hud_settings_HELP": {
+ "message": "This section allows tweaking the behavior of HUD elements."
+ },
+ "osd_hud_radar_disp": {
+ "message": "Maximum number of radar elements on screen."
+ },
+ "osd_hud_radar_disp_help": {
+ "message": "This is used for INAV Radar/FormationFlight. 0 disables this feature."
+ },
+
+ "osd_hud_radar_range_min": {
+ "message": "Minimum radar range"
+ },
+ "osd_hud_radar_range_min_help": {
+ "message": "Radar aircrafts closer than this will not be displayed in the HUD."
+ },
+
+ "osd_hud_radar_range_max": {
+ "message": "Maximum radar range"
+ },
+ "osd_hud_radar_range_max_help": {
+ "message": "Radar aircrafts further away than this will not be displayed in the HUD."
+ },
+
+
+ "osd_hud_wp_disp": {
+ "message": "Maximum number of waypoint elements on screen."
+ },
+ "osd_hud_wp_disp_help": {
+ "message": "Number of Wayponts to show on screen. 0 disables this feature."
+ },
+ "osd_camera_fov_h": {
+ "message": "Camera Horizontal FOV"
+ },
+ "osd_camera_fov_h_help": {
+ "message": "Camera Horizontal Field of View in Degrees. It is used to calculate the position of elements in the HUD display."
},
+ "osd_camera_fov_v": {
+ "message": "Camera Vertical FOV"
+ },
+ "osd_camera_fov_v_help": {
+ "message": "Camera Vertical Field of View in Degrees. It is used to calculate the position of elements in the HUD display."
+ },
+
+
"osd_alarms": {
- "message" : "Alarms"
+ "message": "Alarms"
},
"osdLayoutDefault": {
"message": "Default Layout"
@@ -3093,6 +3527,18 @@
"osdAlarmMAX_NEG_ALTITUDE_HELP": {
"message": "The altitude indicator will flash when altitude is negative and its absolute value is greater than this alarm. Useful when taking off from elevated places. Zero disables this alarm."
},
+ "osd_airspeed_min_alarm": {
+ "message": "Minimum Airspeed"
+ },
+ "osd_airspeed_min_alarm_HELP": {
+ "message": "The airspeed indicator will flash when the airspeed is below this threshold. Zero disables this alarm."
+ },
+ "osd_airspeed_max_alarm": {
+ "message": "Maximum Airspeed"
+ },
+ "osd_airspeed_max_alarm_HELP": {
+ "message": "The airspeed indicator will flash when the airspeed is above this threshold. Zero disables this alarm."
+ },
"osd_gforce_alarm": {
"message": "g force"
},
@@ -3264,11 +3710,11 @@
"osdElement_PLIMIT_ACTIVE_POWER_LIMIT": {
"message": "Active power limit"
},
- "osdElement_THROTTLE_POSITION_AUTO_THR": {
- "message": "Throttle Position / Auto Throttle"
+ "osdElement_THROTTLE_POSITION_HELP": {
+ "message": "Shows the throttle stick position in flight modes where it controls the throttle output. On navigation modes, it shows the throttle value commanded by INAV."
},
- "osdElement_THROTTLE_POSITION_AUTO_THR_HELP": {
- "message": "Shows the throttle stick position in flight modes where it controls the throttle output. On navigation modes, it shows the actual throttle value applied to the motors."
+ "osdElement_SCALED_THROTTLE_POSITION_HELP": {
+ "message": "Shows the throttle stick position in flight modes where it controls the throttle output. On navigation modes, it shows the throttle value commanded by INAV. This throttle is scaled based on the idle throttle and max throttle."
},
"osdElement_GPS_SPEED": {
"message": "Ground Speed"
@@ -3405,6 +3851,12 @@
"osdElement_GLIDESLOPE_HELP": {
"message": "Amount of horizontal distance traveled per unit of lost altitude"
},
+ "osdElement_PAN_SERVO_CENTRED": {
+ "message": "Pan Servo Centred"
+ },
+ "osdElement_PAN_SERVO_CENTRED_HELP": {
+ "message": "Displays if the pan servo is centred (0) or offset (arrows). Check the osd_pan_servo_ settings for configuring the pan servo."
+ },
"osdElement_VTX_CHANNEL": {
"message": "Video TX Band and Channel"
},
@@ -3531,6 +3983,33 @@
"osdElement_SWITCH_INDICATOR_3": {
"message": "Switch Indicator 4"
},
+ "osd_pan_servo_settings": {
+ "message": "Pan Servo OSD Settings"
+ },
+ "osd_pan_servo_settings_HELP": {
+ "message": "This section enables and configures the pan servo offset feature. It is used to keep OSD elements, like the home arrow and POIs, pointing to or in the correct direction. Even when you have panned the camera around."
+ },
+ "osdPanServoIndex": {
+ "message": "Pan Servo Output"
+ },
+ "osdPanServoIndex_HELP": {
+ "message": "Set the is to the output number of the pan servo; as shown in the mixer outputs table. For example output S6."
+ },
+ "osdPanServoPwm2centideg": {
+ "message": "Total degrees of movement of the pan servo"
+ },
+ "osdPanServoPwm2centideg_HELP": {
+ "message": "Degrees of pan servo rotation. A servo with 180 degrees of rotation from 1000 to 2000 us PWM typically needs 180 for this setting. Make the value negative to inverse the direction."
+ },
+ "osdPanServoIndicatorShowDegrees": {
+ "message": "Show degrees of offset next to pan indicator"
+ },
+ "osdPanServoOffcentreWarning": {
+ "message": "Off-centre warning"
+ },
+ "osdPanServoOffcentreWarning_HELP": {
+ "message": "Degrees either side of the pan servo centre; where it is assumed camera is wanted to be facing forwards, but isn't at 0. If in this range and not 0 for longer than 10 seconds, the pan servo offset OSD element will blink. 0 means the warning is disabled."
+ },
"osdGroupGVars": {
"message": "Global Variables"
},
@@ -3585,83 +4064,89 @@
"osdSettingCRSF_LQ_FORMAT_HELP": {
"message": "TYPE1 shows LQ% as used by TBS hardware. TYPE2 shows RF Profile Modes (2=150Hz, 1=50Hz, 0=4Hz update rates) and LQ % [0..100%]. Tracer shows RFMode 1 (1=250Hz) and LQ % [0..100%]."
},
+ "osd_video_show_guides": {
+ "message": "Show preview guides"
+ },
+ "osd_video_HELP": {
+ "message": "For HD: red lines show 4:3 screen, HDZero: keep within the blue box for a higher refresh rate, AUTO/PAL: green line is NTSC limit."
+ },
"osd_dji_HD_FPV": {
- "message" : "DJI HD FPV"
+ "message": "DJI HD FPV"
},
- "osd_dji_hide_unsupported": {
+ "osd_dji_hide_unsupported": {
"message": "Hide unsupported elements"
},
"osd_dji_ESC_temp": {
- "message" : "Source of ESC Temperature"
+ "message": "Source of ESC Temperature"
},
"osd_dji_RSSI_source": {
- "message" : "Source of RSSI"
+ "message": "Source of RSSI"
},
"osd_dji_GPS_source": {
- "message" : "Source of GPS Speed"
+ "message": "Source of GPS Speed"
},
"osd_dji_speed_source": {
- "message" : "Source of 3D Speed"
+ "message": "Source of 3D Speed"
},
"osd_dji_use_craft_name_elements": {
- "message" : "Use craft name for messages and additional elements. Elements in blue appear in Craft Name."
+ "message": "Use craft name for messages and additional elements. Elements in blue appear in Craft Name."
},
"osd_dji_adjustments": {
- "message" : "Show adjustments in Craft Name"
+ "message": "Show adjustments in Craft Name"
},
"osd_dji_cn_alternating_duration": {
- "message" : "Craft Name alternating duration (in 1/10 sec)"
+ "message": "Craft Name alternating duration (in 1/10 sec)"
},
"osd_switch_indicator_settings": {
- "message" : "Switch Indicator Settings"
+ "message": "Switch Indicator Settings"
},
"osd_switch_indicators_align_left": {
- "message" : "Align switch names to left of switches"
+ "message": "Align switch names to left of switches"
},
"osdSwitchInd0": {
- "message" : "Switch 1"
+ "message": "Switch 1"
},
"osdSwitchInd1": {
- "message" : "Switch 2"
+ "message": "Switch 2"
},
"osdSwitchInd2": {
- "message" : "Switch 3"
+ "message": "Switch 3"
},
"osdSwitchInd3": {
- "message" : "Switch 4"
+ "message": "Switch 4"
},
"osd_font_default": {
- "message" : "Default"
+ "message": "Default"
},
"osd_font_vision": {
- "message" : "Vision"
+ "message": "Vision"
},
"osd_font_impact": {
- "message" : "Impact"
+ "message": "Impact"
},
"osd_font_impact_mini": {
- "message" : "Impact mini"
+ "message": "Impact mini"
},
"osd_font_clarity": {
- "message" : "Clarity"
+ "message": "Clarity"
},
"osd_font_clarity_medium": {
- "message" : "Clarity medium"
+ "message": "Clarity medium"
},
"osd_font_bold": {
- "message" : "Bold"
+ "message": "Bold"
},
"osd_font_large": {
- "message" : "Large"
+ "message": "Large"
},
"osd_font_load_file": {
- "message" : "Open Font File"
+ "message": "Open Font File"
},
"osd_font_upload": {
- "message" : "Upload Font"
+ "message": "Upload Font"
},
"osd_font_manager": {
- "message" : "Font Manager"
+ "message": "Font Manager"
},
"uploadingCharacters": {
"message": "Uploading..."
@@ -3669,9 +4154,24 @@
"uploadedCharacters": {
"message": "Uploaded $1 characters"
},
+ "portsIdentifier": {
+ "message": "Identifier"
+ },
+ "portsConfiguration": {
+ "message": "Data"
+ },
+ "portsTelemetryOut": {
+ "message": "Telemetry"
+ },
+ "portsSerialRx": {
+ "message": "RX"
+ },
"portColumnSensors": {
"message": "Sensors"
},
+ "portsPeripherals": {
+ "message": "Peripherals"
+ },
"appUpdateNotificationHeader": {
"message": "New Configurator version available."
},
@@ -3726,6 +4226,108 @@
"missionTotalInformationHead": {
"message": "Total information"
},
+ "missionTotalInfoFilenameLoaded": {
+ "message": "Filename loaded:"
+ },
+ "missionTotalInfoDistance": {
+ "message": "Distance (m):"
+ },
+ "missionTotalInfoAvailablePoints": {
+ "message": "Available Points"
+ },
+ "missionTotalInfoMissionValid": {
+ "message": "Mission valid"
+ },
+ "missionDefaultPointAlt": {
+ "message": "Alt (cm): "
+ },
+ "missionDefaultPointSpeed": {
+ "message": "Speed (cm/s): "
+ },
+ "missionDefaultSafeRangeSH": {
+ "message": "Radius (m): "
+ },
+ "missionMultiMissionsInfo": {
+ "message": "Missions Info:"
+ },
+ "missionMultiActiveMission": {
+ "message": "Active Mission:"
+ },
+ "missionMultiMissionNo": {
+ "message": "Mission No."
+ },
+ "missionMultiUpdateAll": {
+ "message": "Update All"
+ },
+ "missionMultiAddNewMission": {
+ "message": "Add New Mission"
+ },
+ "missionLevelEarthDEMModel": {
+ "message": "Use Sea Level Earth DEM Model: "
+ },
+ "SafehomeLegend": {
+ "message": "Legend : "
+ },
+ "SafehomeMaxDistance": {
+ "message": "Max distance (m):"
+ },
+ "SafehomeSafeRadius": {
+ "message": "Safe Radius (m):"
+ },
+ "missionTitleHide": {
+ "message": "Hide"
+ },
+ "missionTitleCancel": {
+ "message": "Cancel"
+ },
+ "missionTitleSave": {
+ "message": "Save"
+ },
+ "missionTitlRemove": {
+ "message": "Remove"
+ },
+ "missionTitleLoadMissionFile": {
+ "message": "Load Mission File"
+ },
+ "missionTitleSaveMissionFile": {
+ "message": "Save Mission File"
+ },
+ "missionTitleLoadMissionFromFC": {
+ "message": "Load mission from FC"
+ },
+ "missionTitleSaveMissionToFC": {
+ "message": "Save mission to FC"
+ },
+ "missionTitleLoadEepromMission": {
+ "message": "Load Eeprom mission"
+ },
+ "missionTitleSaveEepromMission": {
+ "message": "Save Eeprom mission"
+ },
+ "missionTitleRemoveAll": {
+ "message": "Remove all"
+ },
+ "missionTitleSetActive": {
+ "message": "Set Active"
+ },
+ "missionTitleUpdateAll": {
+ "message": "Update All"
+ },
+ "missionTitleAdd": {
+ "message": "Add"
+ },
+ "missionTitleMoveToCenterView": {
+ "message": "move to center view"
+ },
+ "missionTitleSaveEepromSafehome": {
+ "message": "Save Eeprom Safehome"
+ },
+ "missionTitleLoadEepromSafehome": {
+ "message": "Load Eeprom Safehome"
+ },
+ "missionTitlEditMission": {
+ "message": "Edit Mission"
+ },
"missionRTHsettingsTitle": {
"message": "RTH settings"
},
@@ -3792,6 +4394,9 @@
"platformConfiguration": {
"message": "Platform configuration"
},
+ "output_modeTitle": {
+ "message": "Output mode"
+ },
"mixerPreset": {
"message": "Mixer preset"
},
@@ -3807,7 +4412,7 @@
"mixerLoadAndApplyPresetRules": {
"message": "Load and apply"
},
- "mixerApplyModalTitle" : {
+ "mixerApplyModalTitle": {
"message": "Confirm"
},
"mixerButtonSaveAndReboot": {
@@ -3816,10 +4421,10 @@
"mixerApplyDescription": {
"message": "This action overrides all current mixer settings and replaces them with default values. There is no 'Undo' option!"
},
- "mixerWizardModalTitle" : {
+ "mixerWizardModalTitle": {
"message": "Quadcopter Mixer Wizard"
},
- "mixerWizardModalApply" : {
+ "mixerWizardModalApply": {
"message": "Apply"
},
"motorWizard0": {
@@ -4117,7 +4722,7 @@
"message": "Should be enabled on Airplanes, Rovers and Boats. Should not be enabled on Multirotors! On Multirotors, when Airmode is active, motors will not stop."
},
"reversibleEscWarning": {
- "message": "When Reversible Motors are used, set Motors IDLE power ot 0%"
+ "message": "When Reversible Motors are used, set Motors IDLE power to 0%"
},
"dynamic_gyro_notch_enabled_help": {
"message": "Matrix Gyro Filter is the new generation of dynamic gyro notches available in INAV. It is recommended to enable it on all Multirotor builds on F4 and F7 flight controllers."
@@ -4252,7 +4857,10 @@
"message": "Illegal state. Restart required."
},
"motor_direction_inverted": {
- "message": "Reversed motor direction / Props In configuration"
+ "message": "Normal motor direction / Props In configuration"
+ },
+ "motor_direction_isInverted": {
+ "message": "Reversed motor direction / Props Out configuration"
},
"motor_direction_inverted_hint": {
"message": "Enable if the motor direction is reversed and the props are mounted in the opposite direction."
@@ -4287,6 +4895,18 @@
"BLACKBOX_FEATURE_MOTORS": {
"message": "Motors output"
},
+ "BLACKBOX_FEATURE_GYRO_RAW": {
+ "message": "Gyro RAW (no filtering)"
+ },
+ "BLACKBOX_FEATURE_GYRO_PEAKS_ROLL": {
+ "message": "Gyro Noise peak freq. Roll"
+ },
+ "BLACKBOX_FEATURE_GYRO_PEAKS_PITCH": {
+ "message": "Gyro Noise peak freq. Pitch"
+ },
+ "BLACKBOX_FEATURE_GYRO_PEAKS_YAW": {
+ "message": "Gyro Noise peak freq. Yaw"
+ },
"axisRoll": {
"message": "Roll"
},
@@ -4298,5 +4918,555 @@
},
"showAdvancedPIDs": {
"message": "Show advanced PID controllers"
+ },
+ "rc_filter_lpf_hz": {
+ "message": "Manual LPF Hz"
+ },
+ "rc_filter_smoothing_factor": {
+ "message": "Auto Smoothing Factor"
+ },
+ "rc_filter_auto": {
+ "message": "Use automatic RC smoothing"
+ },
+ "rcSmoothing": {
+ "message": "RC Smoothing"
+ },
+ "throttle_scale": {
+ "message": "Throttle scale"
+ },
+ "throttle_scale_help": {
+ "message": "Allow to limit effective power fed to the motors. Throttle Scale 1 mean there is no power limiting. Throttle Scale 0.5 means throttle position will be cut in half before passed to the motors."
+ },
+ "pidTuning_MatrixFilterType": {
+ "message": "Matrix Filter Type"
+ },
+ "pidTuning_MatrixFilterTypeHelp": {
+ "message": "Defines the type of Matrix Filter. Default 2D filter is recommended for most users. 7-inch and larger quads may benefit from 3D filter."
+ },
+ "nmeaWarning": {
+ "message": "NMEA protocol is deprecated and might be removed in the future. Please use UBLOX or UBLOX7 protocol instead."
+ },
+ "softSerialWarning": {
+ "message": "It is not advisable to use softserial for flight critical devices like GPS or receiver, or high traffic devices like MSP DisplayPort."
+ },
+ "ledStripColorSetupTitle": {
+ "message": "Color setup"
+ },
+ "ledStripH": {
+ "message": "H"
+ },
+ "ledStripS": {
+ "message": "S"
+ },
+ "ledStripV": {
+ "message": "V"
+ },
+ "ledStripRemainingText": {
+ "message": "Remaining"
+ },
+ "ledStripClearSelectedButton": {
+ "message": "Clear selected"
+ },
+ "ledStripClearAllButton": {
+ "message": "Clear ALL"
+ },
+ "ledStripFunctionSection": {
+ "message": "LED Functions"
+ },
+ "ledStripFunctionTitle": {
+ "message": "Function"
+ },
+ "ledStripFunctionNoneOption": {
+ "message": "None"
+ },
+ "ledStripFunctionColorOption": {
+ "message": "Color"
+ },
+ "ledStripFunctionModesOption": {
+ "message": "Modes & Orientation"
+ },
+ "ledStripFunctionArmOption": {
+ "message": "Arm State"
+ },
+ "ledStripFunctionBatteryOption": {
+ "message": "Battery"
+ },
+ "ledStripFunctionRSSIOption": {
+ "message": "RSSI"
+ },
+ "ledStripFunctionGPSOption": {
+ "message": "GPS"
+ },
+ "ledStripFunctionRingOption": {
+ "message": "Ring"
+ },
+ "ledStripFunctionChannelOption": {
+ "message": "Channel"
+ },
+ "ledStripColorModifierTitle": {
+ "message": "Color modifier"
+ },
+ "ledStripThrottleText": {
+ "message": "Throttle"
+ },
+ "ledStripLarsonscannerText": {
+ "message": "Larson scanner"
+ },
+ "ledStripBlinkTitle": {
+ "message": "Blink"
+ },
+ "ledStripBlinkAlwaysOverlay": {
+ "message": "Blink always"
+ },
+ "ledStripBlinkLandingOverlay": {
+ "message": "Blink on landing"
+ },
+ "ledStripStrobeText": {
+ "message": "Strobe"
+ },
+ "ledStripEnableStrobeLightEffectText": {
+ "message": "Enable strobe light effect"
+ },
+ "ledStripOverlayTitle": {
+ "message": "Overlay"
+ },
+ "ledStripWarningsOverlay": {
+ "message": "Warnings"
+ },
+ "ledStripIndecatorOverlay": {
+ "message": "Indicator"
+ },
+ "colorBlack": {
+ "message": "black"
+ },
+ "colorWhite": {
+ "message": "white"
+ },
+ "colorRed": {
+ "message": "red"
+ },
+ "colorOrange": {
+ "message": "orange"
+ },
+ "colorYellow": {
+ "message": "yellow"
+ },
+ "colorLimeGreen": {
+ "message": "lime green"
+ },
+ "colorGreen": {
+ "message": "green"
+ },
+ "colorMintGreen": {
+ "message": "mint green"
+ },
+ "colorCyan": {
+ "message": "cyan"
+ },
+ "colorLightBlue": {
+ "message": "light blue"
+ },
+ "colorBlue": {
+ "message": "blue"
+ },
+ "colorDarkViolet": {
+ "message": "dark violet"
+ },
+ "colorMagenta": {
+ "message": "magenta"
+ },
+ "colorDeepPink": {
+ "message": "deep pink"
+ },
+ "ledStripSelectChannelFromColorList": {
+ "message": "Select Channel from color list"
+ },
+ "ledStripModeColorsTitle": {
+ "message": "Mode colors"
+ },
+ "ledStripModeColorsModeOrientation": {
+ "message": "Orientation"
+ },
+ "ledStripModeColorsModeHeadfree": {
+ "message": "Headfree"
+ },
+ "ledStripModeColorsModeHorizon": {
+ "message": "Horizon"
+ },
+ "ledStripModeColorsModeAngle": {
+ "message": "Angle"
+ },
+ "ledStripModeColorsModeMag": {
+ "message": "Mag"
+ },
+ "ledStripModeColorsModeBaro": {
+ "message": "Baro"
+ },
+
+ "ledStripDirN": {
+ "message": "N"
+ },
+ "ledStripDirE": {
+ "message": "E"
+ },
+ "ledStripDirS": {
+ "message": "S"
+ },
+ "ledStripDirW": {
+ "message": "W"
+ },
+ "ledStripDirU": {
+ "message": "U"
+ },
+ "ledStripDirD": {
+ "message": "D"
+ },
+ "ledStripModesOrientationTitle": {
+ "message": "LED Orientation and Color"
+ },
+ "ledStripModesSpecialColorsTitle": {
+ "message": "Special colors"
+ },
+ "ledStripModeColorsModeDisarmed": {
+ "message": "Disarmed"
+ },
+ "ledStripModeColorsModeArmed": {
+ "message": "Armed"
+ },
+ "ledStripModeColorsModeAnimation": {
+ "message": "Animation"
+ },
+ "ledStripModeColorsModeBlinkBg": {
+ "message": "Blink background"
+ },
+ "ledStripModeColorsModeGPSNoSats": {
+ "message": "GPS: no sats"
+ },
+ "ledStripModeColorsModeGPSNoLock": {
+ "message": "GPS: no lock"
+ },
+ "ledStripModeColorsModeGPSLocked": {
+ "message": "GPS: locked"
+ },
+ "ledStripWiring": {
+ "message": "LED Strip Wiring"
+ },
+ "ledStripWiringMode": {
+ "message": "Wire Ordering Mode"
+ },
+ "ledStripWiringClearControl": {
+ "message": "Clear selected"
+ },
+ "ledStripWiringClearAllControl": {
+ "message": "Clear ALL Wiring"
+ },
+ "ledStripWiringMessage": {
+ "message": "LEDs without wire ordering number will not be saved."
+ },
+
+
+ "mainLogoText": {
+ "message": "CONFIGURATOR"
+ },
+ "mainLogoTextFirmware": {
+ "message": "FC FIRMWARE"
+ },
+ "mainPortOverrideLabel": {
+ "message": "Port: "
+ },
+ "mainManual": {
+ "message": "Manual"
+ },
+ "sensorDataFlashNotFound": {
+ "message": "No dataflash chip found"
+ },
+ "sensorDataFlashFreeSpace": {
+ "message": "Dataflash: free space"
+ },
+ "sensorProfile1": {
+ "message": "Profile 1"
+ },
+ "sensorProfile2": {
+ "message": "Profile 2"
+ },
+ "sensorProfile3": {
+ "message": "Profile 3"
+ },
+ "sensorBatteryProfile1": {
+ "message": "Battery profile 1"
+ },
+ "sensorBatteryProfile2": {
+ "message": "Battery profile 2"
+ },
+ "sensorBatteryProfile3": {
+ "message": "Battery profile 3"
+ },
+ "sensorStatusGyro": {
+ "message": "Gyroscope"
+ },
+ "sensorStatusGyroShort": {
+ "message": "Gyro",
+ "description": "Text of the image in the top sensors icons. Please keep it short."
+ },
+ "sensorStatusAccel": {
+ "message": "Accelerometer"
+ },
+ "sensorStatusAccelShort": {
+ "message": "Accel",
+ "description": "Text of the image in the top sensors icons. Please keep it short."
+ },
+ "sensorStatusMag": {
+ "message": "Magnetometer"
+ },
+ "sensorStatusMagShort": {
+ "message": "Mag",
+ "description": "Text of the image in the top sensors icons. Please keep it short."
+ },
+ "sensorStatusBaro": {
+ "message": "Barometer"
+ },
+ "sensorStatusBaroShort": {
+ "message": "Baro",
+ "description": "Text of the image in the top sensors icons. Please keep it short."
+ },
+ "sensorStatusGPS": {
+ "message": "GPS"
+ },
+ "sensorStatusGPSShort": {
+ "message": "GPS",
+ "description": "Text of the image in the top sensors icons. Please keep it short."
+ },
+ "sensorOpticalFlow": {
+ "message": "Optical flow"
+ },
+ "sensorOpticalFlowShort": {
+ "message": "Flow"
+ },
+ "sensorStatusSonar": {
+ "message": "Sonar / Range finder"
+ },
+ "sensorStatusSonarShort": {
+ "message": "Sonar",
+ "description": "Text of the image in the top sensors icons. Please keep it short."
+ },
+ "sensorAirspeed": {
+ "message": "Airspeed"
+ },
+ "sensorAirspeedShort": {
+ "message": "Speed"
+ },
+ "sensorBatteryVoltage": {
+ "message": "Battery voltage"
+ },
+ "mainShowLog": {
+ "message": "Show Log"
+ },
+ "mainHideLog": {
+ "message": "Hide Log"
+ },
+ "waitingForData": {
+ "message": "Waiting for data ..."
+ },
+ "outputStatsTableAcc": {
+ "message": "Acc. noise RMS"
+ },
+ "outputStatsTableCurrent": {
+ "message": "Current [A]"
+ },
+ "outputStatsTableVoltage": {
+ "message": "Voltage [V]"
+ },
+ "LogicConditions": {
+ "message": "Logic Conditions"
+ },
+ "PIDControllers": {
+ "message": "PID Controllers"
+ },
+ "sensorsGyroSelect": {
+ "message": "Gyroscope"
+ },
+ "sensorsAccelSelect": {
+ "message": "Accelerometer"
+ },
+ "sensorsMagSelect": {
+ "message": "Magnetometer"
+ },
+ "sensorsAltitudeSelect": {
+ "message": "Barometer"
+ },
+ "sensorsSonarSelect": {
+ "message": "Sonar"
+ },
+ "sensorsAirSpeedSelect": {
+ "message": "Air speed"
+ },
+ "sensorsTemperaturesSelect": {
+ "message": "Temperatures"
+ },
+
+ "sensorsDebugSelect": {
+ "message": "Debug"
+ },
+ "sensorsDebugTrace": {
+ "message": "Open Debug Trace"
+ },
+ "sensorsGyroscope": {
+ "message": "Gyroscope - deg/s"
+ },
+ "sensorsAccelerometer": {
+ "message": "Accelerometer - g"
+ },
+ "sensorsMagnetometer": {
+ "message": "Magnetometer - Ga"
+ },
+ "sensorsBarometer": {
+ "message": "Barometer - meters"
+ },
+ "sensorsSonar": {
+ "message": "Sonar - cm"
+ },
+ "sensorsAirspeed": {
+ "message": "Air speed - cm/s"
+ },
+ "sensorsTemperature0": {
+ "message": "Temperature 0 - °C"
+ },
+ "sensorsTemperature1": {
+ "message": "Temperature 1 - °C"
+ },
+ "sensorsTemperature2": {
+ "message": "Temperature 2 - °C"
+ },
+ "sensorsTemperature3": {
+ "message": "Temperature 3 - °C"
+ },
+ "sensorsTemperature4": {
+ "message": "Temperature 4 - °C"
+ },
+ "sensorsTemperature5": {
+ "message": "Temperature 5 - °C"
+ },
+ "sensorsTemperature6": {
+ "message": "Temperature 6 - °C"
+ },
+ "sensorsTemperature7": {
+ "message": "Temperature 7 - °C"
+ },
+ "sensorsTemperatureValue": {
+ "message": "value:"
+ },
+ "getRunningOS": {
+ "message": "Running - OS: "
+ },
+ "getConfiguratorVersion": {
+ "message": "Configurator: "
+ },
+ "loadedReleaseInfo": {
+ "message": "Loaded release information from GitHub."
+ },
+ "newVersionAvailable": {
+ "message": "New version available!"
+ },
+ "ReceiveTime": {
+ "message": "Receive time: "
+ },
+ "SendTime": {
+ "message": "Send time: "
+ },
+ "ErrorWritingFile": {
+ "message": "Error writing file"
+ },
+ "FileSaved": {
+ "message": "File saved"
+ },
+ "selectedTarget": {
+ "message": "selected target = "
+ },
+ "toggledRCs": {
+ "message": "toggled RCs"
+ },
+ "noFirmwareSelectedToLoad": {
+ "message": "No firmware selected to load"
+ },
+ "selectValidSerialPort": {
+ "message": "Please select valid serial port'"
+ },
+ "writePermissionsForFile": {
+ "message": "You don\\'t have write permissions for this file"
+ },
+ "automaticTargetSelect": {
+ "message": "Attempting automatic target selection"
+ },
+ "notAWAYPOINT": {
+ "message": "Previous selection was not a WAYPOINT!"
+ },
+ "startGettingSafehomePoints": {
+ "message": "Start of getting Safehome points"
+ },
+ "endGettingSafehomePoints": {
+ "message": "End of getting Safehome points"
+ },
+ "startSendingSafehomePoints": {
+ "message": "Start of sending Safehome points"
+ },
+ "endSendingSafehomePoints": {
+ "message": "End of sending Safehome points"
+ },
+ "startGetPoint": {
+ "message": "Start get point"
+ },
+ "startSendPoint": {
+ "message": "Start send point"
+ },
+ "errorReadingFileXml2jsNotFound": {
+ "message": "Error reading file (xml2js not found)'"
+ },
+ "errorReadingFile": {
+ "message": "Error reading file"
+ },
+ "errorParsingFile": {
+ "message": "Error parsing file"
+ },
+ "loadedSuccessfully": {
+ "message": " has been loaded successfully !"
+ },
+ "errorWritingFileXml2jsNotFound": {
+ "message": "Error writing file (xml2js not found)"
+ },
+ "savedSuccessfully": {
+ "message": " has been saved successfully !"
+ },
+ "endGetPoint": {
+ "message": "End get point"
+ },
+ "endSendPoint": {
+ "message": "End send point"
+ },
+ "osdSettingsSaved": {
+ "message": "OSD settings saved"
+ },
+ "failedToOpenSerialPort": {
+ "message": "Failed to open serial port"
+ },
+ "failedToFlash": {
+ "message": "Failed to flash"
+ },
+ "targetPrefetchsuccessful": {
+ "message": "Target prefetch successful: "
+ },
+ "targetPrefetchFail": {
+ "message": "Cannot prefetch target: "
+ },
+ "targetPrefetchFailDFU": {
+ "message": "Cannot prefetch target: Flight Controller in DFU"
+ },
+ "targetPrefetchFailOld": {
+ "message": "Cannot prefetch target: INAV Firmware too old"
+ },
+ "targetPrefetchFailNonINAV": {
+ "message": "Cannot prefetch target: Non-INAV Firmware"
+ },
+ "targetPrefetchFailNoPort": {
+ "message": "Cannot prefetch target: No port"
}
}
diff --git a/assets/linux/copyright b/assets/linux/copyright
new file mode 100644
index 000000000..c5b761e2a
--- /dev/null
+++ b/assets/linux/copyright
@@ -0,0 +1,23 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: INAV Configurator
+Source: https://github.com/iNavFlight/inav-configurator
+
+Files: *
+Copyright: Copyright 2022 The INAV open source project
+License: GPL-3
+
+License: GPL-3
+ This program is free software: you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation, either version 3 of the License, or (at your option) any later
+ version.
+ .
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License along with
+ this program. If not, see .
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ can be found in `/usr/share/common-licenses/GPL-3'.
\ No newline at end of file
diff --git a/assets/linux/icon/inav_icon_128.png b/assets/linux/icon/inav_icon_128.png
new file mode 100644
index 000000000..84a797bfe
Binary files /dev/null and b/assets/linux/icon/inav_icon_128.png differ
diff --git a/assets/linux/icon/inav_icon_english_128.png b/assets/linux/icon/inav_icon_english_128.png
new file mode 100644
index 000000000..84a797bfe
Binary files /dev/null and b/assets/linux/icon/inav_icon_english_128.png differ
diff --git a/assets/linux/inav-configurator.desktop b/assets/linux/inav-configurator.desktop
new file mode 100644
index 000000000..40b0c778d
--- /dev/null
+++ b/assets/linux/inav-configurator.desktop
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Name=INAV Configurator
+Comment=Crossplatform configuration tool for the INAV flight control system
+Exec=/opt/inav/inav-configurator/inav-configurator
+Icon=/opt/inav/inav-configurator/icon/inav_icon_128.png
+Terminal=false
+Type=Application
+Categories=Utility
\ No newline at end of file
diff --git a/assets/osx/dmg-background.png b/assets/osx/dmg-background.png
new file mode 100644
index 000000000..1bce6e37d
Binary files /dev/null and b/assets/osx/dmg-background.png differ
diff --git a/assets/osx/dmg-background.psd b/assets/osx/dmg-background.psd
new file mode 100644
index 000000000..36c70e258
Binary files /dev/null and b/assets/osx/dmg-background.psd differ
diff --git a/assets/osx/dmg-background@2x.png b/assets/osx/dmg-background@2x.png
new file mode 100644
index 000000000..ab773ad29
Binary files /dev/null and b/assets/osx/dmg-background@2x.png differ
diff --git a/assets/windows/inav_installer.bmp b/assets/windows/inav_installer.bmp
new file mode 100644
index 000000000..d65f39407
Binary files /dev/null and b/assets/windows/inav_installer.bmp differ
diff --git a/assets/windows/inav_installer_icon.ico b/assets/windows/inav_installer_icon.ico
new file mode 100644
index 000000000..e180941b5
Binary files /dev/null and b/assets/windows/inav_installer_icon.ico differ
diff --git a/assets/windows/inav_installer_small.bmp b/assets/windows/inav_installer_small.bmp
new file mode 100644
index 000000000..535303fb4
Binary files /dev/null and b/assets/windows/inav_installer_small.bmp differ
diff --git a/assets/windows/installer.iss b/assets/windows/installer.iss
new file mode 100644
index 000000000..89f56efa7
--- /dev/null
+++ b/assets/windows/installer.iss
@@ -0,0 +1,169 @@
+; ------------------------------------------
+; Installer for INAV
+; ------------------------------------------
+; It receives from the command line with /D the parameters:
+; version
+; archName
+; archAllowed
+; archInstallIn64bit
+; sourceFolder
+; targetFolder
+
+#define ApplicationName "INAV Configurator"
+#define CompanyName "The INAV open source project"
+#define CompanyUrl "https://github.com/iNavFlight/inav"
+#define ExecutableFileName "inav-configurator.exe"
+#define GroupName "INAV"
+#define InstallerFileName "INAV-Configurator_" + archName + "_" + version
+#define SourcePath "..\..\" + sourceFolder + "\inav-configurator\" + archName
+#define TargetFolderName "INAV-Configurator"
+#define UpdatesUrl "https://github.com/iNavFlight/inav-configurator/releases"
+
+[CustomMessages]
+AppName=inav-configurator
+LaunchProgram=Start {#ApplicationName}
+
+[Files]
+Source: "{#SourcePath}\*"; DestDir: "{app}"; Flags: recursesubdirs
+
+[Icons]
+; Programs group
+Name: "{group}\{#ApplicationName}"; Filename: "{app}\{#ExecutableFileName}";
+; Desktop icon
+Name: "{autodesktop}\{#ApplicationName}"; Filename: "{app}\{#ExecutableFileName}";
+; Non admin users, uninstall icon
+Name: "{group}\Uninstall {#ApplicationName}"; Filename: "{uninstallexe}"; Check: not IsAdminInstallMode
+
+[Languages]
+; English default, it must be first
+Name: "en"; MessagesFile: "compiler:Default.isl"
+; Official languages
+;Name: "ca"; MessagesFile: "compiler:Languages\Catalan.isl"
+;Name: "da"; MessagesFile: "compiler:Languages\Danish.isl"
+;Name: "de"; MessagesFile: "compiler:Languages\German.isl"
+;Name: "es"; MessagesFile: "compiler:Languages\Spanish.isl"
+;Name: "fr"; MessagesFile: "compiler:Languages\French.isl"
+;Name: "it"; MessagesFile: "compiler:Languages\Italian.isl"
+;Name: "ja"; MessagesFile: "compiler:Languages\Japanese.isl"
+;Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl"
+;Name: "pt"; MessagesFile: "compiler:Languages\Portuguese.isl"
+;Name: "pl"; MessagesFile: "compiler:Languages\Polish.isl"
+;Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"
+; Not official. Sometimes not updated to latest version (strings missing)
+;Name: "ga"; MessagesFile: "unofficial_inno_languages\Galician.isl"
+;Name: "eu"; MessagesFile: "unofficial_inno_languages\Basque.isl"
+;Name: "hr"; MessagesFile: "unofficial_inno_languages\Croatian.isl"
+;Name: "hu"; MessagesFile: "unofficial_inno_languages\Hungarian.isl"
+;Name: "id"; MessagesFile: "unofficial_inno_languages\Indonesian.isl"
+;Name: "ko"; MessagesFile: "unofficial_inno_languages\Korean.isl"
+;Name: "lv"; MessagesFile: "unofficial_inno_languages\Latvian.isl"
+;Name: "sv"; MessagesFile: "unofficial_inno_languages\Swedish.isl"
+;Name: "zh_CN"; MessagesFile: "unofficial_inno_languages\ChineseSimplified.isl"
+;Name: "zh_TW"; MessagesFile: "unofficial_inno_languages\ChineseTraditional.isl"
+; Not available
+; pt_BR (Portuguese Brasileiro)
+
+[Run]
+; Add a checkbox to start the app after installed
+Filename: {app}\{cm:AppName}.exe; Description: {cm:LaunchProgram,{cm:AppName}}; Flags: nowait postinstall skipifsilent
+
+[Setup]
+AppId=2e5662ca-1fb3-8f1e-a7e1-e390add7a19d
+AppName={#ApplicationName}
+AppPublisher={#CompanyName}
+AppPublisherURL={#CompanyUrl}
+AppUpdatesURL={#UpdatesUrl}
+AppVersion={#version}
+ArchitecturesAllowed={#archAllowed}
+ArchitecturesInstallIn64BitMode={#archInstallIn64bit}
+Compression=lzma2
+DefaultDirName={autopf}\{#GroupName}\{#TargetFolderName}
+DefaultGroupName={#GroupName}\{#ApplicationName}
+LicenseFile=..\..\LICENSE
+MinVersion=6.2
+OutputBaseFilename={#InstallerFileName}
+OutputDir=..\..\{#targetFolder}\
+PrivilegesRequiredOverridesAllowed=commandline dialog
+SetupIconFile=inav_installer_icon.ico
+ShowLanguageDialog=yes
+SolidCompression=yes
+UninstallDisplayIcon={app}\{#ExecutableFileName}
+UninstallDisplayName={#ApplicationName}
+WizardImageFile=inav_installer.bmp
+WizardSmallImageFile=inav_installer_small.bmp
+WizardStyle=modern
+
+[Code]
+function GetOldNsisUninstallerPath(): String;
+var
+ RegKey: String;
+begin
+ Result := '';
+ // Look into the different registry entries: win32, win64 and without user rights
+ if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\INAV Configurator', 'UninstallString', Result) then
+ begin
+ if not RegQueryStringValue(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\INAV Configurator', 'UninstallString', Result) then
+ begin
+ RegQueryStringValue(HKCU, 'SOFTWARE\INAV\INAV Configurator', 'UninstallString', Result)
+ end;
+ end;
+end;
+
+function GetQuietUninstallerPath(): String;
+var
+ RegKey: String;
+begin
+ Result := '';
+ RegKey := Format('%s\%s_is1', ['Software\Microsoft\Windows\CurrentVersion\Uninstall', '{#emit SetupSetting("AppId")}']);
+ if not RegQueryStringValue(HKEY_LOCAL_MACHINE, RegKey, 'QuietUninstallString', Result) then
+ begin
+ RegQueryStringValue(HKEY_CURRENT_USER, RegKey, 'QuietUninstallString', Result);
+ end;
+end;
+
+function InitializeSetup(): Boolean;
+var
+ ResultCode: Integer;
+ ParameterStr : String;
+ UninstPath : String;
+begin
+
+ Result := True;
+
+ // Check if the application is already installed by the old NSIS installer, and uninstall it
+ UninstPath := GetOldNsisUninstallerPath();
+
+ // Found, start uninstall
+ if UninstPath <> '' then
+ begin
+
+ UninstPath := RemoveQuotes(UninstPath);
+
+ // Add this parameter to not return until uninstall finished. The drawback is that the uninstaller file is not deleted
+ ParameterStr := '_?=' + ExtractFilePath(UninstPath);
+
+ if Exec(UninstPath, ParameterStr, '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
+ begin
+ // Delete the unistaller file and empty folders. Not deleting the files.
+ DeleteFile(UninstPath);
+ DelTree(ExtractFilePath(UninstPath), True, False, True);
+ end
+ else begin
+ Result := False;
+ MsgBox('Error uninstalling old Configurator ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
+ end;
+ end
+ else begin
+
+ // Search for new Inno Setup installations
+ UninstPath := GetQuietUninstallerPath();
+ if UninstPath <> '' then
+ begin
+ if not Exec('>', UninstPath, '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
+ begin
+ Result := False;
+ MsgBox('Error uninstalling Configurator ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
+ end;
+ end;
+ end;
+end;
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
index 992ca9713..0f850d452 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -7,12 +7,13 @@ var minimist = require('minimist');
var archiver = require('archiver');
var del = require('del');
-var NwBuilder = require('nw-builder');
var semver = require('semver');
var gulp = require('gulp');
var concat = require('gulp-concat');
+const commandExistsSync = require('command-exists').sync;
+
// Each key in the *sources* variable must be an array of
// the source files that will be combined into a single
// file and stored in *outputDir*. Each key in *sources*
@@ -134,6 +135,7 @@ sources.js = [
'./js/waypoint.js',
'./node_modules/openlayers/dist/ol.js',
'./js/libraries/plotly-latest.min.js',
+ './js/sitl.js',
];
sources.receiverCss = [
@@ -248,8 +250,10 @@ gulp.task('dist-build', gulp.series('build', function() {
'./src/css/opensans_webfontkit/*.{eot,svg,ttf,woff,woff2}',
'./resources/*.json',
'./resources/models/*',
- './resources/osd/*.mcm',
+ './resources/osd/analogue/*.mcm',
'./resources/motor_order/*.svg',
+ './resources/sitl/windows/*',
+ './resources/sitl/linux/*'
];
return gulp.src(distSources, { base: '.' })
.pipe(gulp.dest(distDir));
@@ -259,6 +263,7 @@ gulp.task('dist', gulp.series('clean', 'dist-build'));
// Create app directories in ./apps
gulp.task('apps', gulp.series('dist', function(done) {
+ var NwBuilder = require('nw-builder');
var builder = new NwBuilder({
files: './dist/**/*',
buildDir: appsDir,
@@ -266,7 +271,8 @@ gulp.task('apps', gulp.series('dist', function(done) {
flavor: 'normal',
macIcns: './images/inav.icns',
winIco: './images/inav.ico',
- version: get_nw_version()
+ version: get_nw_version(),
+ zip: false
});
builder.on('log', console.log);
builder.build(function (err) {
@@ -284,38 +290,79 @@ function get_nw_version() {
return semver.valid(semver.coerce(require('./package.json').dependencies.nw));
}
-function get_release_filename(platform, ext) {
- var pkg = require('./package.json');
- return 'INAV-Configurator_' + platform + '_' + pkg.version + '.' + ext;
+function get_release_filename_base(platform) {
+ return 'INAV-Configurator_' + platform;
}
-gulp.task('release-win32', function() {
+function get_release_filename(platform, ext, addition = '') {
var pkg = require('./package.json');
- var src = path.join(appsDir, pkg.name, 'win32');
- var output = fs.createWriteStream(path.join(appsDir, get_release_filename('win32', 'zip')));
- var archive = archiver('zip', {
- zlib: { level: 9 }
- });
- archive.on('warning', function(err) { throw err; });
- archive.on('error', function(err) { throw err; });
- archive.pipe(output);
- archive.directory(src, 'INAV Configurator');
- return archive.finalize();
-});
+ return get_release_filename_base(platform) + addition + '_' + pkg.version + '.' + ext;
+}
-gulp.task('release-win64', function() {
- var pkg = require('./package.json');
- var src = path.join(appsDir, pkg.name, 'win64');
- var output = fs.createWriteStream(path.join(appsDir, get_release_filename('win64', 'zip')));
- var archive = archiver('zip', {
- zlib: { level: 9 }
- });
- archive.on('warning', function(err) { throw err; });
- archive.on('error', function(err) { throw err; });
- archive.pipe(output);
- archive.directory(src, 'INAV Configurator');
- return archive.finalize();
-});
+function build_win_zip(arch) {
+ return function build_win_zip_proc(done) {
+ var pkg = require('./package.json');
+
+ // Create ZIP
+ console.log(`Creating ${arch} ZIP file...`);
+ var src = path.join(appsDir, pkg.name, arch);
+ var output = fs.createWriteStream(path.join(appsDir, get_release_filename(arch, 'zip')));
+ var archive = archiver('zip', {
+ zlib: { level: 9 }
+ });
+ archive.on('warning', function(err) { throw err; });
+ archive.on('error', function(err) { throw err; });
+ archive.pipe(output);
+ archive.directory(src, 'INAV Configurator');
+ return archive.finalize();
+ }
+}
+
+function build_win_iss(arch) {
+ return function build_win_iss_proc(done) {
+ if (!getArguments().installer) {
+ done();
+ return null;
+ }
+
+ // Create Installer
+ console.log(`Creating ${arch} Installer...`);
+ const innoSetup = require('@quanle94/innosetup');
+
+ const APPS_DIR = './apps/';
+ const pkg = require('./package.json');
+
+ // Parameters passed to the installer script
+ const parameters = [];
+
+ // Extra parameters to replace inside the iss file
+ parameters.push(`/Dversion=${pkg.version}`);
+ parameters.push(`/DarchName=${arch}`);
+ parameters.push(`/DarchAllowed=${(arch === 'win32') ? 'x86 x64' : 'x64'}`);
+ parameters.push(`/DarchInstallIn64bit=${(arch === 'win32') ? '' : 'x64'}`);
+ parameters.push(`/DsourceFolder=${APPS_DIR}`);
+ parameters.push(`/DtargetFolder=${APPS_DIR}`);
+
+ // Show only errors in console
+ parameters.push(`/Q`);
+
+ // Script file to execute
+ parameters.push("assets/windows/installer.iss");
+
+ innoSetup(parameters, {},
+ function(error) {
+ if (error != null) {
+ console.error(`Installer for platform ${arch} finished with error ${error}`);
+ } else {
+ console.log(`Installer for platform ${arch} finished`);
+ }
+ done();
+ });
+ }
+}
+
+gulp.task('release-win32', gulp.series(build_win_zip('win32'), build_win_iss('win32')));
+gulp.task('release-win64', gulp.series(build_win_zip('win64'), build_win_iss('win64')));
gulp.task('release-osx64', function(done) {
var pkg = require('./package.json');
@@ -336,37 +383,317 @@ gulp.task('release-osx64', function(done) {
codesignArgs.push('-e', 'entitlements.plist');
codesignArgs.push(src)
execSync.apply(this, codesignArgs);
+
+ // Check if the bundle is signed
+ const codesignCheckArgs = [ 'codesign', '-vvv', '--deep', '--strict', src ];
+ execSync.apply(this, codesignCheckArgs);
}
- const zipFilename = path.join(appsDir, get_release_filename('macOS', 'zip'));
- var output = fs.createWriteStream(zipFilename);
- var archive = archiver('zip', {
- zlib: { level: 9 }
- });
- archive.on('warning', function(err) { throw err; });
- archive.on('error', function(err) { throw err; });
- archive.pipe(output);
- archive.directory(src, 'INAV Configurator.app');
- output.on('close', function() {
- if (getArguments().notarize) {
- const notarizeArgs = ['macapptool', '-v', '1', 'notarize'];
- const notarizationUsername = getArguments()['notarization-username'];
- if (notarizationUsername) {
- notarizeArgs.push('-u', notarizationUsername)
+
+ // 'old' .zip mode
+ if (!getArguments().installer) {
+ const zipFilename = path.join(appsDir, get_release_filename('macOS', 'zip'));
+ console.log('Creating ZIP file: ' + zipFilename);
+ var output = fs.createWriteStream(zipFilename);
+ var archive = archiver('zip', {
+ zlib: { level: 9 }
+ });
+ archive.on('warning', function(err) { throw err; });
+ archive.on('error', function(err) { throw err; });
+ archive.pipe(output);
+ archive.directory(src, 'INAV Configurator.app');
+ output.on('close', function() {
+ if (getArguments().notarize) {
+ console.log('Notarizing DMG file: ' + zipFilename);
+ const notarizeArgs = ['macapptool', '-v', '1', 'notarize'];
+ const notarizationUsername = getArguments()['notarization-username'];
+ if (notarizationUsername) {
+ notarizeArgs.push('-u', notarizationUsername)
+ }
+ const notarizationPassword = getArguments()['notarization-password'];
+ if (notarizationPassword) {
+ notarizeArgs.push('-p', notarizationPassword)
+ }
+ notarizeArgs.push(zipFilename)
+ execSync.apply(this, notarizeArgs);
}
- const notarizationPassword = getArguments()['notarization-password'];
- if (notarizationPassword) {
- notarizeArgs.push('-p', notarizationPassword)
+ done();
+ });
+ archive.finalize();
+ }
+ // 'new' .dmg mode
+ else {
+ const appdmg = require('appdmg');
+
+ var target = path.join(appsDir, get_release_filename('macOS', 'dmg'));
+ console.log('Creating DMG file: ' + target);
+ var basepath = path.join(appsDir, pkg.name, 'osx64');
+ console.log('Base path: ' + basepath);
+
+ if (fs.existsSync(target)) {
+ fs.unlinkSync(target);
+ }
+
+ var specs = {};
+
+ specs["title"] = "INAV Configurator";
+ specs["contents"] = [
+ { "x": 448, "y": 342, "type": "link", "path": "/Applications" },
+ { "x": 192, "y": 344, "type": "file", "path": pkg.name + ".app", "name": "INAV Configurator.app" },
+ ];
+ specs["background"] = path.join(__dirname, 'assets/osx/dmg-background.png');
+ specs["format"] = "UDZO";
+ specs["window"] = {
+ "size": {
+ "width": 638,
+ "height": 479,
+ }
+ };
+
+ const codesignIdentity = getArguments()['codesign-identity'];
+ if (getArguments().codesign) {
+ specs['code-sign'] = {
+ 'signing-identity': codesignIdentity,
}
- notarizeArgs.push(zipFilename)
- execSync.apply(this, notarizeArgs);
}
- done();
- });
- archive.finalize();
+
+ const ee = appdmg({
+ target: target,
+ basepath: basepath,
+ specification: specs,
+ });
+
+ ee.on('progress', function(info) {
+ //console.log(info);
+ });
+
+ ee.on('error', function(err) {
+ console.log(err);
+ });
+
+ ee.on('finish', function() {
+ if (getArguments().codesign) {
+ // Check if the bundle is signed
+ const codesignCheckArgs = [ 'codesign', '-vvv', '--deep', '--strict', target ];
+ execSync.apply(this, codesignCheckArgs);
+ }
+ if (getArguments().notarize) {
+ console.log('Notarizing DMG file: ' + target);
+ const notarizeArgs = ['xcrun', 'notarytool', 'submit'];
+ notarizeArgs.push(target);
+ const notarizationUsername = getArguments()['notarization-username'];
+ if (notarizationUsername) {
+ notarizeArgs.push('--apple-id', notarizationUsername)
+ } else {
+ throw new Error('Missing notarization username');
+ }
+ const notarizationPassword = getArguments()['notarization-password'];
+ if (notarizationPassword) {
+ notarizeArgs.push('--password', notarizationPassword)
+ } else {
+ throw new Error('Missing notarization password');
+ }
+ const notarizationTeamId = getArguments()['notarization-team-id'];
+ if (notarizationTeamId) {
+ notarizeArgs.push('--team-id', notarizationTeamId)
+ } else {
+ throw new Error('Missing notarization Team ID');
+ }
+ notarizeArgs.push('--wait');
+
+ const notarizationWebhook = getArguments()['notarization-webhook'];
+ if (notarizationWebhook) {
+ notarizeArgs.push('--webhook', notarizationWebhook);
+ }
+ execSync.apply(this, notarizeArgs);
+
+ console.log('Stapling DMG file: ' + target);
+ const stapleArgs = ['xcrun', 'stapler', 'staple'];
+ stapleArgs.push(target);
+ execSync.apply(this, stapleArgs);
+
+ console.log('Checking DMG file: ' + target);
+ const checkArgs = ['spctl', '-vvv', '--assess', '--type', 'install', target];
+ execSync.apply(this, checkArgs);
+ }
+ done();
+ });
+ }
});
+function post_build(arch, folder) {
+ return function post_build_linux(done) {
+ if ((arch === 'linux32') || (arch === 'linux64')) {
+ const metadata = require('./package.json');
+ // Copy Ubuntu launcher scripts to destination dir
+ const launcherDir = path.join(folder, metadata.name, arch);
+ console.log(`Copy Ubuntu launcher scripts to ${launcherDir}`);
+ return gulp.src('assets/linux/**')
+ .pipe(gulp.dest(launcherDir));
+ }
+
+ return done();
+ }
+}
+
+// Create the dir directory, with write permissions
+function createDirIfNotExists(dir) {
+ fs.mkdir(dir, '0775', function(err) {
+ if (err && err.code !== 'EEXIST') {
+ throw err;
+ }
+ });
+}
+
+function release_deb(arch) {
+ return function release_deb_proc(done) {
+ if (!getArguments().installer) {
+ done();
+ return null;
+ }
+
+ // Check if dpkg-deb exists
+ if (!commandExistsSync('dpkg-deb')) {
+ console.warn(`dpkg-deb command not found, not generating deb package for ${arch}`);
+ done();
+ return null;
+ }
+
+ const deb = require('gulp-debian');
+ const LINUX_INSTALL_DIR = '/opt/inav';
+ const metadata = require('./package.json');
+
+ console.log(`Generating deb package for ${arch}`);
+
+ return gulp.src([path.join(appsDir, metadata.name, arch, '*')])
+ .pipe(deb({
+ package: metadata.name,
+ version: metadata.version,
+ section: 'base',
+ priority: 'optional',
+ architecture: getLinuxPackageArch('deb', arch),
+ maintainer: metadata.author,
+ description: metadata.description,
+ preinst: [`rm -rf ${LINUX_INSTALL_DIR}/${metadata.name}`],
+ postinst: [
+ `chown root:root ${LINUX_INSTALL_DIR}`,
+ `chown -R root:root ${LINUX_INSTALL_DIR}/${metadata.name}`,
+ `xdg-desktop-menu install ${LINUX_INSTALL_DIR}/${metadata.name}/${metadata.name}.desktop`,
+ ],
+ prerm: [`xdg-desktop-menu uninstall ${metadata.name}.desktop`],
+ depends: ['libgconf-2-4', 'libatomic1'],
+ changelog: [],
+ _target: `${LINUX_INSTALL_DIR}/${metadata.name}`,
+ _out: appsDir,
+ _copyright: 'assets/linux/copyright',
+ _clean: true,
+ }));
+ }
+}
+
+function post_release_deb(arch) {
+ return function post_release_linux_deb(done) {
+ if (!getArguments().installer) {
+ done();
+ return null;
+ }
+ if ((arch === 'linux32') || (arch === 'linux64')) {
+ var rename = require("gulp-rename");
+ const metadata = require('./package.json');
+ const renameFrom = path.join(appsDir, metadata.name + '_' + metadata.version + '_' + getLinuxPackageArch('.deb', arch) + '.deb');
+ const renameTo = path.join(appsDir, get_release_filename_base(arch) + '_' + metadata.version + '.deb');
+ // Rename .deb build to common naming
+ console.log(`Renaming .deb installer ${renameFrom} to ${renameTo}`);
+ return gulp.src(renameFrom)
+ .pipe(rename(renameTo))
+ .pipe(gulp.dest("."));
+ }
+
+ return done();
+ }
+}
+
+function release_rpm(arch) {
+ return function release_rpm_proc(done) {
+ if (!getArguments().installer) {
+ done();
+ return null;
+ }
+
+ // Check if rpmbuild exists
+ if (!commandExistsSync('rpmbuild')) {
+ console.warn(`rpmbuild command not found, not generating rpm package for ${arch}`);
+ done();
+ return;
+ }
+
+ const buildRpm = require('rpm-builder');
+ const NAME_REGEX = /-/g;
+ const LINUX_INSTALL_DIR = '/opt/inav';
+ const metadata = require('./package.json');
+
+ console.log(`Generating rpm package for ${arch}`);
+
+ // The buildRpm does not generate the folder correctly, manually
+ createDirIfNotExists(appsDir);
+
+ const options = {
+ name: get_release_filename_base(arch), // metadata.name,
+ version: metadata.version.replace(NAME_REGEX, '_'), // RPM does not like release candidate versions
+ buildArch: getLinuxPackageArch('rpm', arch),
+ vendor: metadata.author,
+ summary: metadata.description,
+ license: 'GNU General Public License v3.0',
+ requires: ['libatomic1'],
+ prefix: '/opt',
+ files: [{
+ cwd: path.join(appsDir, metadata.name, arch),
+ src: '*',
+ dest: `${LINUX_INSTALL_DIR}/${metadata.name}`,
+ }],
+ postInstallScript: [`xdg-desktop-menu install ${LINUX_INSTALL_DIR}/${metadata.name}/${metadata.name}.desktop`],
+ preUninstallScript: [`xdg-desktop-menu uninstall ${metadata.name}.desktop`],
+ tempDir: path.join(appsDir, `tmp-rpm-build-${arch}`),
+ keepTemp: false,
+ verbose: false,
+ rpmDest: appsDir,
+ execOpts: { maxBuffer: 1024 * 1024 * 16 },
+ };
+
+ buildRpm(options, function(err) {
+ if (err) {
+ console.error(`Error generating rpm package: ${err}`);
+ }
+ done();
+ });
+ }
+}
+
+function getLinuxPackageArch(type, arch) {
+ let packArch;
+
+ switch (arch) {
+ case 'linux32':
+ packArch = 'i386';
+ break;
+ case 'linux64':
+ if (type === 'rpm') {
+ packArch = 'x86_64';
+ } else {
+ packArch = 'amd64';
+ }
+ break;
+ default:
+ console.error(`Package error, arch: ${arch}`);
+ process.exit(1);
+ break;
+ }
+
+ return packArch;
+}
+
function releaseLinux(bits) {
return function() {
+ console.log(`Generating zip package for linux${bits}`);
var dirname = 'linux' + bits;
var pkg = require('./package.json');
var src = path.join(appsDir, pkg.name, dirname);
@@ -383,8 +710,8 @@ function releaseLinux(bits) {
}
}
-gulp.task('release-linux32', releaseLinux(32));
-gulp.task('release-linux64', releaseLinux(64));
+gulp.task('release-linux32', gulp.series(releaseLinux(32), post_build('linux32', appsDir), release_deb('linux32'), post_release_deb('linux32')));
+gulp.task('release-linux64', gulp.series(releaseLinux(64), post_build('linux64', appsDir), release_deb('linux64'), post_release_deb('linux64'), release_rpm('linux64')));
// Create distributable .zip files in ./apps
gulp.task('release', gulp.series('apps', getPlatforms().map(function(v) { return 'release-' + v; })));
diff --git a/images/icons/cf_icon_setup_white.svg b/images/icons/cf_icon_setup_white.svg
index d79669da5..7501a9f07 100644
--- a/images/icons/cf_icon_setup_white.svg
+++ b/images/icons/cf_icon_setup_white.svg
@@ -1,12 +1,16 @@
-
+
+
diff --git a/images/icons/cf_icon_sitl_grey.svg b/images/icons/cf_icon_sitl_grey.svg
new file mode 100644
index 000000000..94072aca1
--- /dev/null
+++ b/images/icons/cf_icon_sitl_grey.svg
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/images/icons/cf_icon_sitl_white.svg b/images/icons/cf_icon_sitl_white.svg
new file mode 100644
index 000000000..018a59f72
--- /dev/null
+++ b/images/icons/cf_icon_sitl_white.svg
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/images/icons/sensor_imu2_error.png b/images/icons/sensor_imu2_error.png
deleted file mode 100644
index 3cd8883ba..000000000
Binary files a/images/icons/sensor_imu2_error.png and /dev/null differ
diff --git a/images/icons/sensor_imu2_off.png b/images/icons/sensor_imu2_off.png
deleted file mode 100644
index aede7f67a..000000000
Binary files a/images/icons/sensor_imu2_off.png and /dev/null differ
diff --git a/images/icons/sensor_imu2_on.png b/images/icons/sensor_imu2_on.png
deleted file mode 100644
index 5f26f44a0..000000000
Binary files a/images/icons/sensor_imu2_on.png and /dev/null differ
diff --git a/images/inav.ico b/images/inav.ico
index e180941b5..24501afed 100644
Binary files a/images/inav.ico and b/images/inav.ico differ
diff --git a/js/appUpdater.js b/js/appUpdater.js
index 74044ef22..e4d36ab31 100644
--- a/js/appUpdater.js
+++ b/js/appUpdater.js
@@ -5,7 +5,7 @@ var appUpdater = appUpdater || {};
appUpdater.checkRelease = function (currVersion) {
var modalStart;
$.get('https://api.github.com/repos/iNavFlight/inav-configurator/releases', function (releaseData) {
- GUI.log('Loaded release information from GitHub.');
+ GUI.log(chrome.i18n.getMessage('loadedReleaseInfo'));
//Git return sorted list, 0 - last release
let newVersion = releaseData[0].tag_name;
@@ -15,7 +15,7 @@ appUpdater.checkRelease = function (currVersion) {
GUI.log(newVersion, chrome.runtime.getManifest().version);
GUI.log(currVersion);
- GUI.log('New version available!');
+ GUI.log(chrome.i18n.getMessage('newVersionAvailable'));
modalStart = new jBox('Modal', {
width: 400,
height: 200,
diff --git a/js/data_storage.js b/js/data_storage.js
index 8b58dd88d..d711bb373 100755
--- a/js/data_storage.js
+++ b/js/data_storage.js
@@ -2,8 +2,8 @@
var CONFIGURATOR = {
// all versions are specified and compared using semantic versioning http://semver.org/
- 'minfirmwareVersionAccepted': '5.0.0',
- 'maxFirmwareVersionAccepted': '6.0.0', // Condition is < (lt) so we accept all in 5.x branch
+ 'minfirmwareVersionAccepted': '7.0.0',
+ 'maxFirmwareVersionAccepted': '8.0.0', // Condition is < (lt) so we accept all in 7.x branch
'connectionValid': false,
'connectionValidCliOnly': false,
'cliActive': false,
diff --git a/js/defaults_dialog.js b/js/defaults_dialog.js
index 19bca0339..0a93a55c6 100644
--- a/js/defaults_dialog.js
+++ b/js/defaults_dialog.js
@@ -11,8 +11,200 @@ helper.defaultsDialog = (function () {
let $container;
- let data = [{
- "title": 'Mini Quad with 3"-7" propellers',
+ let data = [
+ {
+ "title": 'Mini Quad with 3" propellers',
+ "id": 6,
+ "notRecommended": false,
+ "reboot": true,
+ "mixerToApply": 3,
+ "settings": [
+ {
+ key: "model_preview_type",
+ value: 3
+ },
+ /*
+ System
+ */
+ {
+ key: "gyro_hardware_lpf",
+ value: "256HZ"
+ },
+ {
+ key: "looptime",
+ value: 500
+ },
+ {
+ key: "motor_pwm_protocol",
+ value: "DSHOT300"
+ },
+ /*
+ Filtering
+ */
+ {
+ key: "gyro_main_lpf_hz",
+ value: 90
+ },
+ {
+ key: "gyro_main_lpf_type",
+ value: "PT1"
+ },
+ {
+ key: "dterm_lpf_hz",
+ value: 85
+ },
+ {
+ key: "dterm_lpf_type",
+ value: "PT3"
+ },
+ {
+ key: "dterm_lpf2_hz",
+ value: 0
+ },
+ {
+ key: "dterm_lpf2_type",
+ value: "PT1"
+ },
+ {
+ key: "dynamic_gyro_notch_enabled",
+ value: "ON"
+ },
+ {
+ key: "dynamic_gyro_notch_q",
+ value: 250
+ },
+ {
+ key: "dynamic_gyro_notch_min_hz",
+ value: 70
+ },
+ {
+ key: "setpoint_kalman_enabled",
+ value: "ON"
+ },
+ {
+ key: "setpoint_kalman_q",
+ value: 200
+ },
+ {
+ key: "smith_predictor_delay", // Enable Smith Predictor
+ value: 1.5
+ },
+ /*
+ Mechanics
+ */
+ {
+ key: "airmode_type",
+ value: "THROTTLE_THRESHOLD"
+ },
+ {
+ key: "airmode_throttle_threshold",
+ value: 1150
+ },
+ {
+ key: "mc_iterm_relax",
+ value: "RP"
+ },
+ {
+ key: "d_boost_min",
+ value: 1.0
+ },
+ {
+ key: "d_boost_max",
+ value: 1.0
+ },
+ {
+ key: "antigravity_gain",
+ value: 2
+ },
+ {
+ key: "antigravity_accelerator",
+ value: 5
+ },
+ /*
+ Rates
+ */
+ {
+ key: "rc_yaw_expo",
+ value: 75
+ },
+ {
+ key: "rc_expo",
+ value: 75
+ },
+ {
+ key: "roll_rate",
+ value: 70
+ },
+ {
+ key: "pitch_rate",
+ value: 70
+ },
+ {
+ key: "yaw_rate",
+ value: 60
+ },
+ /*
+ PIDs
+ */
+ {
+ key: "mc_p_pitch",
+ value: 32
+ },
+ {
+ key: "mc_i_pitch",
+ value: 90
+ },
+ {
+ key: "mc_d_pitch",
+ value: 25
+ },
+ {
+ key: "mc_p_roll",
+ value: 28
+ },
+ {
+ key: "mc_i_roll",
+ value: 80
+ },
+ {
+ key: "mc_d_roll",
+ value: 23
+ },
+ {
+ key: "mc_p_yaw",
+ value: 30
+ },
+ {
+ key: "mc_i_yaw",
+ value: 80
+ },
+ /*
+ * TPA
+ */
+ {
+ key: "tpa_rate",
+ value: 20
+ },
+ {
+ key: "tpa_breakpoint",
+ value: 1200
+ },
+ {
+ key: "platform_type",
+ value: "MULTIROTOR"
+ },
+ {
+ key: "applied_defaults",
+ value: 6
+ },
+ {
+ key: "failsafe_procedure",
+ value: "DROP"
+ }
+ ]
+ },
+ {
+ "title": 'Mini Quad with 5" propellers',
"id": 2,
"notRecommended": false,
"reboot": true,
@@ -48,6 +240,28 @@ helper.defaultsDialog = (function () {
key: "gyro_main_lpf_type",
value: "PT1"
},
+ /*
+ Dynamic gyro LPF
+ */
+ {
+ key: "gyro_use_dyn_lpf",
+ value: "ON"
+ },
+ {
+ key: "gyro_dyn_lpf_min_hz",
+ value: 85
+ },
+ {
+ key: "gyro_dyn_lpf_max_hz",
+ value: 300
+ },
+ {
+ key: "gyro_dyn_lpf_curve_expo",
+ value: 3
+ },
+ /*
+ D-term
+ */
{
key: "dterm_lpf_hz",
value: 110
@@ -74,7 +288,7 @@ helper.defaultsDialog = (function () {
},
{
key: "dynamic_gyro_notch_min_hz",
- value: 120
+ value: 100
},
{
key: "setpoint_kalman_enabled",
@@ -103,6 +317,201 @@ helper.defaultsDialog = (function () {
key: "mc_iterm_relax",
value: "RP"
},
+ {
+ key: "d_boost_min",
+ value: 1.0
+ },
+ {
+ key: "d_boost_max",
+ value: 1.0
+ },
+ {
+ key: "antigravity_gain",
+ value: 2
+ },
+ {
+ key: "antigravity_accelerator",
+ value: 5
+ },
+ /*
+ Rates
+ */
+ {
+ key: "rc_yaw_expo",
+ value: 75
+ },
+ {
+ key: "rc_expo",
+ value: 75
+ },
+ {
+ key: "roll_rate",
+ value: 70
+ },
+ {
+ key: "pitch_rate",
+ value: 70
+ },
+ {
+ key: "yaw_rate",
+ value: 60
+ },
+ /*
+ PIDs
+ */
+ {
+ key: "mc_p_pitch",
+ value: 40
+ },
+ {
+ key: "mc_i_pitch",
+ value: 90
+ },
+ {
+ key: "mc_d_pitch",
+ value: 27
+ },
+ {
+ key: "mc_p_roll",
+ value: 36
+ },
+ {
+ key: "mc_i_roll",
+ value: 80
+ },
+ {
+ key: "mc_d_roll",
+ value: 25
+ },
+ {
+ key: "mc_p_yaw",
+ value: 35
+ },
+ {
+ key: "mc_i_yaw",
+ value: 80
+ },
+ /*
+ * TPA
+ */
+ {
+ key: "tpa_rate",
+ value: 20
+ },
+ {
+ key: "tpa_breakpoint",
+ value: 1200
+ },
+ {
+ key: "platform_type",
+ value: "MULTIROTOR"
+ },
+ {
+ key: "applied_defaults",
+ value: 2
+ },
+ {
+ key: "failsafe_procedure",
+ value: "DROP"
+ }
+ ]
+ },
+ {
+ "title": 'Mini Quad with 7" propellers',
+ "id": 5,
+ "notRecommended": false,
+ "reboot": true,
+ "mixerToApply": 3,
+ "settings": [
+ {
+ key: "model_preview_type",
+ value: 3
+ },
+ /*
+ System
+ */
+ {
+ key: "gyro_hardware_lpf",
+ value: "256HZ"
+ },
+ {
+ key: "looptime",
+ value: 500
+ },
+ {
+ key: "motor_pwm_protocol",
+ value: "DSHOT300"
+ },
+ /*
+ Filtering
+ */
+ {
+ key: "gyro_main_lpf_hz",
+ value: 90
+ },
+ {
+ key: "gyro_main_lpf_type",
+ value: "PT1"
+ },
+ {
+ key: "dterm_lpf_hz",
+ value: 80
+ },
+ {
+ key: "dterm_lpf_type",
+ value: "PT3"
+ },
+ {
+ key: "dterm_lpf2_hz",
+ value: 0
+ },
+ {
+ key: "dterm_lpf2_type",
+ value: "PT1"
+ },
+ {
+ key: "dynamic_gyro_notch_enabled",
+ value: "ON"
+ },
+ {
+ key: "dynamic_gyro_notch_mode",
+ value: "3D"
+ },
+ {
+ key: "dynamic_gyro_notch_q",
+ value: 250
+ },
+ {
+ key: "dynamic_gyro_notch_min_hz",
+ value: 60
+ },
+ {
+ key: "setpoint_kalman_enabled",
+ value: "ON"
+ },
+ {
+ key: "setpoint_kalman_q",
+ value: 200
+ },
+ {
+ key: "smith_predictor_delay", // Enable Smith Predictor
+ value: 1.5
+ },
+ /*
+ Mechanics
+ */
+ {
+ key: "airmode_type",
+ value: "THROTTLE_THRESHOLD"
+ },
+ {
+ key: "airmode_throttle_threshold",
+ value: 1150
+ },
+ {
+ key: "mc_iterm_relax",
+ value: "RPY"
+ },
{
key: "d_boost_min",
value: 0.8
@@ -151,11 +560,11 @@ helper.defaultsDialog = (function () {
},
{
key: "mc_i_pitch",
- value: 75
+ value: 85
},
{
key: "mc_d_pitch",
- value: 25
+ value: 28
},
{
key: "mc_p_roll",
@@ -163,15 +572,15 @@ helper.defaultsDialog = (function () {
},
{
key: "mc_i_roll",
- value: 60
+ value: 75
},
{
key: "mc_d_roll",
- value: 23
+ value: 26
},
{
key: "mc_p_yaw",
- value: 35
+ value: 40
},
{
key: "mc_i_yaw",
@@ -194,7 +603,7 @@ helper.defaultsDialog = (function () {
},
{
key: "applied_defaults",
- value: 2
+ value: 5
},
{
key: "failsafe_procedure",
@@ -261,6 +670,10 @@ helper.defaultsDialog = (function () {
key: "motor_pwm_protocol",
value: "STANDARD"
},
+ {
+ key: "ahrs_inertia_comp_method",
+ value: "ADAPTIVE"
+ },
{
key: "throttle_idle",
value: 5.0
@@ -287,19 +700,23 @@ helper.defaultsDialog = (function () {
},
{
key: "nav_fw_pos_z_p",
- value: 15
+ value: 25
},
{
- key: "nav_fw_pos_z_d",
+ key: "nav_fw_pos_z_i",
value: 5
},
+ {
+ key: "nav_fw_pos_z_d",
+ value: 8
+ },
{
key: "nav_fw_pos_xy_p",
- value: 60
+ value: 55
},
{
key: "fw_turn_assist_pitch_gain",
- value: 0.5
+ value: 0.4
},
{
key: "max_angle_inclination_rll",
@@ -343,7 +760,7 @@ helper.defaultsDialog = (function () {
},
{
key: "fw_p_yaw",
- value: 20
+ value: 50
},
{
key: "fw_i_yaw",
@@ -351,19 +768,11 @@ helper.defaultsDialog = (function () {
},
{
key: "fw_d_yaw",
- value: 0
+ value: 20
},
{
key: "fw_ff_yaw",
- value: 100
- },
- {
- key: "imu_acc_ignore_rate",
- value: 9
- },
- {
- key: "imu_acc_ignore_slope",
- value: 5
+ value: 255
},
{
key: "airmode_type",
@@ -393,6 +802,26 @@ helper.defaultsDialog = (function () {
key: "nav_wp_radius",
value: 5000
},
+ {
+ key: "nav_wp_max_safe_distance",
+ value: 500
+ },
+ {
+ key: "nav_fw_launch_max_angle",
+ value: 45
+ },
+ {
+ key: "nav_fw_launch_motor_delay",
+ value: 100
+ },
+ {
+ key: "nav_fw_launch_max_altitude",
+ value: 5000
+ },
+ {
+ key: "nav_fw_launch_climb_angle",
+ value: 25
+ },
],
"features": [
{
@@ -404,7 +833,7 @@ helper.defaultsDialog = (function () {
{
"title": 'Airplane without a Tail (Wing, Delta, etc)',
"notRecommended": false,
- "id": 3,
+ "id": 4,
"reboot": true,
"mixerToApply": 8,
"settings": [
@@ -418,7 +847,7 @@ helper.defaultsDialog = (function () {
},
{
key: "applied_defaults",
- value: 3
+ value: 4
},
{
key: "gyro_hardware_lpf",
@@ -460,6 +889,10 @@ helper.defaultsDialog = (function () {
key: "motor_pwm_protocol",
value: "STANDARD"
},
+ {
+ key: "ahrs_inertia_comp_method",
+ value: "ADAPTIVE"
+ },
{
key: "throttle_idle",
value: 5.0
@@ -486,19 +919,23 @@ helper.defaultsDialog = (function () {
},
{
key: "nav_fw_pos_z_p",
- value: 15
+ value: 35
},
{
- key: "nav_fw_pos_z_d",
+ key: "nav_fw_pos_z_i",
value: 5
},
+ {
+ key: "nav_fw_pos_z_d",
+ value: 10
+ },
{
key: "nav_fw_pos_xy_p",
- value: 60
+ value: 70
},
{
key: "fw_turn_assist_pitch_gain",
- value: 0.2
+ value: 0.3
},
{
key: "max_angle_inclination_rll",
@@ -556,14 +993,6 @@ helper.defaultsDialog = (function () {
key: "fw_ff_yaw",
value: 100
},
- {
- key: "imu_acc_ignore_rate",
- value: 9
- },
- {
- key: "imu_acc_ignore_slope",
- value: 5
- },
{
key: "airmode_type",
value: "STICK_CENTER_ONCE"
@@ -592,6 +1021,26 @@ helper.defaultsDialog = (function () {
key: "nav_wp_radius",
value: 5000
},
+ {
+ key: "nav_wp_max_safe_distance",
+ value: 500
+ },
+ {
+ key: "nav_fw_launch_max_angle",
+ value: 75
+ },
+ {
+ key: "nav_fw_launch_motor_delay",
+ value: 100
+ },
+ {
+ key: "nav_fw_launch_max_altitude",
+ value: 5000
+ },
+ {
+ key: "nav_fw_launch_climb_angle",
+ value: 25
+ },
],
"features": [
{
@@ -640,8 +1089,8 @@ helper.defaultsDialog = (function () {
value: "ROVER"
},
{
- key: "nav_wp_safe_distance",
- value: 50000
+ key: "nav_wp_max_safe_distance",
+ value: 500
},
{
key: "nav_fw_loiter_radius",
@@ -718,7 +1167,9 @@ helper.defaultsDialog = (function () {
GUI.tab_switch_cleanup(function () {
MSP.send_message(MSPCodes.MSP_SET_REBOOT, false, false, function () {
//noinspection JSUnresolvedVariable
- savingDefaultsModal.close();
+ if (typeof savingDefaultsModal !== 'undefined') {
+ savingDefaultsModal.close();
+ }
GUI.log(chrome.i18n.getMessage('deviceRebooting'));
GUI.handleReconnect();
});
@@ -728,13 +1179,21 @@ helper.defaultsDialog = (function () {
};
privateScope.setSettings = function (selectedDefaultPreset) {
+ var currentControlProfile = parseInt($("#profilechange").val());
+ var currentBatteryProfile = parseInt($("#batteryprofilechange").val());
//Save analytics
googleAnalytics.sendEvent('Setting', 'Defaults', selectedDefaultPreset.title);
Promise.mapSeries(selectedDefaultPreset.settings, function (input, ii) {
return mspHelper.getSetting(input.key);
}).then(function () {
Promise.mapSeries(selectedDefaultPreset.settings, function (input, ii) {
- return mspHelper.setSetting(input.key, input.value);
+ if (FC.isControlProfileParameter(input.key)) {
+ return privateScope.setSettingForAllControlProfiles(input.key, input.value);
+ } else if (FC.isBatteryProfileParameter(input.key)) {
+ return privateScope.setSettingForAllBatteryProfiles(input.key, input.value);
+ } else {
+ return mspHelper.setSetting(input.key, input.value);
+ }
}).then(function () {
// If default preset is associated to a mixer, apply the mixer as well
@@ -743,25 +1202,63 @@ helper.defaultsDialog = (function () {
helper.mixer.loadServoRules(currentMixerPreset);
helper.mixer.loadMotorRules(currentMixerPreset);
+
+ MIXER_CONFIG.platformType = currentMixerPreset.platform;
+ MIXER_CONFIG.appliedMixerPreset = selectedDefaultPreset.mixerToApply;
+ MIXER_CONFIG.hasFlaps = (currentMixerPreset.hasFlaps === true) ? true : false;
SERVO_RULES.cleanup();
SERVO_RULES.inflate();
MOTOR_RULES.cleanup();
MOTOR_RULES.inflate();
- mspHelper.sendServoMixer(function () {
- mspHelper.sendMotorMixer(function () {
- privateScope.finalize(selectedDefaultPreset);
- })
+ mspHelper.saveMixerConfig(function() {
+ mspHelper.sendServoMixer(function () {
+ mspHelper.sendMotorMixer(function () {
+ MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [currentControlProfile], false, function() {
+ MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [currentBatteryProfile], false, privateScope.finalize(selectedDefaultPreset));
+ });
+ });
+ });
});
+
} else {
- privateScope.finalize(selectedDefaultPreset);
+ MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [currentControlProfile], false, function() {
+ MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [currentBatteryProfile], false, privateScope.finalize(selectedDefaultPreset));
+ });
}
+ })
+ });
+ };
-
+ privateScope.setSettingForAllControlProfiles = function (key, value) {
+ MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [0], false, function () {
+ mspHelper.setSetting(key, value, function() {
+ MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [1], false, function () {
+ mspHelper.setSetting(key, value, function() {
+ MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [2], false, function () {
+ mspHelper.setSetting(key, value);
+ });
+ });
+ });
+ });
+ });
+ return;
+ };
- })
+ privateScope.setSettingForAllBatteryProfiles = function (key, value) {
+ MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [0], false, function () {
+ mspHelper.setSetting(key, value, function() {
+ MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [1], false, function () {
+ mspHelper.setSetting(key, value, function() {
+ MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [2], false, function () {
+ mspHelper.setSetting(key, value);
+ });
+ });
+ });
+ });
});
+ return;
};
privateScope.onPresetClick = function (event) {
diff --git a/js/fc.js b/js/fc.js
index ab0e5375c..b1040b0fb 100644
--- a/js/fc.js
+++ b/js/fc.js
@@ -92,8 +92,7 @@ var FC = {
gpsHwStatus: 0,
rangeHwStatus: 0,
speedHwStatus: 0,
- flowHwStatus: 0,
- imu2HwStatus: 0
+ flowHwStatus: 0
};
SENSOR_CONFIG = {
@@ -596,9 +595,9 @@ var FC = {
return [
'NMEA',
'UBLOX',
- 'DJI NAZA',
'UBLOX7',
- 'MSP'
+ 'MSP',
+ 'FAKE'
];
},
getGpsBaudRates: function () {
@@ -765,6 +764,24 @@ var FC = {
return retVal;
},
+ getAccelerometerCalibrated: function () {
+ var calibrated = true;
+ var flagNames = FC.getArmingFlags();
+
+ if (CALIBRATION_DATA.accGain.X === 4096 && CALIBRATION_DATA.accGain.Y === 4096 && CALIBRATION_DATA.accGain.Z === 4096 &&
+ CALIBRATION_DATA.accZero.X === 0 && CALIBRATION_DATA.accZero.Y === 0 && CALIBRATION_DATA.accZero.Z === 0
+ ) {
+ calibrated = false;
+ }
+
+ if ((calibrated) && flagNames.hasOwnProperty(13)) {
+ if (bit_check(CONFIG.armingFlags, 13)) {
+ calibrated = false;
+ }
+ }
+
+ return calibrated;
+ },
getUserControlMode: function () {
return [
"Attitude",
@@ -890,19 +907,19 @@ var FC = {
output: "boolean"
},
1: {
- name: "Equal",
+ name: "Equal (A = B)",
operandType: "Comparison",
hasOperand: [true, true],
output: "boolean"
},
2: {
- name: "Greater Than",
+ name: "Greater Than (A > B)",
operandType: "Comparison",
hasOperand: [true, true],
output: "boolean"
},
3: {
- name: "Lower Than",
+ name: "Lower Than (A < B)",
operandType: "Comparison",
hasOperand: [true, true],
output: "boolean"
@@ -1160,6 +1177,36 @@ var FC = {
hasOperand: [true, true],
output: "boolean"
},
+ 47: {
+ name: "Edge",
+ operandType: "Logic Switches",
+ hasOperand: [true, true],
+ output: "boolean"
+ },
+ 48: {
+ name: "Delay",
+ operandType: "Logic Switches",
+ hasOperand: [true, true],
+ output: "boolean"
+ },
+ 49: {
+ name: "Timer",
+ operandType: "Logic Switches",
+ hasOperand: [true, true],
+ output: "boolean"
+ },
+ 50: {
+ name: "Delta (|A| >= B)",
+ operandType: "Comparison",
+ hasOperand: [true, true],
+ output: "boolean"
+ },
+ 51: {
+ name: "Approx Equals (A ~ B)",
+ operandType: "Comparison",
+ hasOperand: [true, true],
+ output: "boolean"
+ },
}
},
getOperandTypes: function () {
@@ -1206,24 +1253,21 @@ var FC = {
20: "Is Controlling Position",
21: "Is Emergency Landing",
22: "Is RTH",
- 23: "Is WP",
- 24: "Is Landing",
- 25: "Is Failsafe",
- 26: "Stabilized Roll",
- 27: "Stabilized Pitch",
- 28: "Stabilized Yaw",
- 29: "Current Waypoint Index",
- 30: "Current Waypoint Action",
- 31: "3D home distance [m]",
- 32: "CRSF LQ",
- 33: "CRSF SNR",
- 34: "GPS Valid Fix",
- 35: "Loiter Radius [cm]",
- 36: "Active Profile",
- 37: "Battery cells",
- 38: "AGL status [0/1]",
- 39: "AGL [cm]",
- 40: "Rangefinder [cm]",
+ 23: "Is Landing",
+ 24: "Is Failsafe",
+ 25: "Stabilized Roll",
+ 26: "Stabilized Pitch",
+ 27: "Stabilized Yaw",
+ 28: "3D home distance [m]",
+ 29: "CRSF LQ",
+ 30: "CRSF SNR",
+ 31: "GPS Valid Fix",
+ 32: "Loiter Radius [cm]",
+ 33: "Active Profile",
+ 34: "Battery cells",
+ 35: "AGL status [0/1]",
+ 36: "AGL [cm]",
+ 37: "Rangefinder [cm]",
}
},
3: {
@@ -1241,13 +1285,18 @@ var FC = {
7: "Horizon",
8: "Air",
9: "USER 1",
- 10: "USER 2"
+ 10: "USER 2",
+ 11: "Course Hold",
+ 12: "USER 3",
+ 13: "USER 4",
+ 14: "Acro",
+ 15: "Waypoint Mission",
}
},
4: {
name: "Logic Condition",
type: "range",
- range: [0, 31],
+ range: [0, (LOGIC_CONDITIONS.getMaxLogicConditionCount()-1)],
default: 0
},
5: {
@@ -1261,7 +1310,28 @@ var FC = {
type: "range",
range: [0, 3],
default: 0
- }
+ },
+ 7: {
+ name: "Waypoints",
+ type: "dictionary",
+ default: 0,
+ values: {
+ 0: "Is WP",
+ 1: "Current Waypoint Index",
+ 2: "Current Waypoint Action",
+ 3: "Next Waypoint Action",
+ 4: "Distance to next Waypoint [m]",
+ 5: "Distance from last Waypoint [m]",
+ 6: "Current WP has User Action 1",
+ 7: "Current WP has User Action 2",
+ 8: "Current WP has User Action 3",
+ 9: "Current WP has User Action 4",
+ 10: "Next WP has User Action 1",
+ 11: "Next WP has User Action 2",
+ 12: "Next WP has User Action 3",
+ 13: "Next WP has User Action 4",
+ }
+ },
}
},
getBatteryProfileParameters: function () {
@@ -1280,7 +1350,6 @@ var FC = {
'throttle_idle',
'turtle_mode_power_factor',
'failsafe_throttle',
- 'fw_min_throttle_down_pitch',
'nav_mc_hover_thr',
'nav_fw_cruise_thr',
'nav_fw_min_thr',
@@ -1341,7 +1410,6 @@ var FC = {
'dterm_lpf2_type',
'yaw_lpf_hz',
'fw_iterm_throw_limit',
- 'fw_loiter_direction',
'fw_reference_airspeed',
'fw_turn_assist_yaw_gain',
'fw_turn_assist_pitch_gain',
diff --git a/js/gui.js b/js/gui.js
index 301abf71a..3d20d07a1 100644
--- a/js/gui.js
+++ b/js/gui.js
@@ -14,6 +14,7 @@ var GUI_control = function () {
'landing',
'firmware_flasher',
'mission_control',
+ 'sitl',
'help'
];
this.defaultAllowedTabsWhenConnected = [
@@ -202,9 +203,49 @@ GUI_control.prototype.content_ready = function (callback) {
};
GUI_control.prototype.updateStatusBar = function() {
+
+ var armingFlags = {
+ 'ARMED':(1 << 2),
+ //'WAS_EVER_ARMED':(1 << 3),
+ 'SIMULATOR_MODE':(1 << 4),
+ 'ARMING_DISABLED_FAILSAFE_SYSTEM':(1 << 7),
+ 'ARMING_DISABLED_NOT_LEVEL':(1 << 8),
+ 'ARMING_DISABLED_SENSORS_CALIBRATING':(1 << 9),
+ 'ARMING_DISABLED_SYSTEM_OVERLOADED':(1 << 10),
+ 'ARMING_DISABLED_NAVIGATION_UNSAFE':(1 << 11),
+ 'ARMING_DISABLED_COMPASS_NOT_CALIBRATED':(1 << 12),
+ 'ARMING_DISABLED_ACCELEROMETER_NOT_CALIBRATED':(1 << 13),
+ 'ARMING_DISABLED_ARM_SWITCH':(1 << 14),
+ 'ARMING_DISABLED_HARDWARE_FAILURE':(1 << 15),
+ 'ARMING_DISABLED_BOXFAILSAFE':(1 << 16),
+ 'ARMING_DISABLED_BOXKILLSWITCH':(1 << 17),
+ 'ARMING_DISABLED_RC_LINK':(1 << 18),
+ 'ARMING_DISABLED_THROTTLE':(1 << 19),
+ 'ARMING_DISABLED_CLI':(1 << 20),
+ 'ARMING_DISABLED_CMS_MENU':(1 << 21),
+ 'ARMING_DISABLED_OSD_MENU':(1 << 22),
+ 'ARMING_DISABLED_ROLLPITCH_NOT_CENTERED':(1 << 23),
+ 'ARMING_DISABLED_SERVO_AUTOTRIM':(1 << 24),
+ 'ARMING_DISABLED_OOM':(1 << 25),
+ 'ARMING_DISABLED_INVALID_SETTING':(1 << 26),
+ 'ARMING_DISABLED_PWM_OUTPUT_ERROR':(1 << 27),
+ 'ARMING_DISABLED_NO_PREARM':(1 << 28),
+ 'ARMING_DISABLED_DSHOT_BEEPER':(1 << 29),
+ 'ARMING_DISABLED_LANDING_DETECTED':(1 << 30),
+ };
+
+ var activeArmFlags = [];
+ for(var i=0;i<32;i++) {
+ var checkBit = (1 << i);
+ if(Object.values(armingFlags).includes(checkBit) && (checkBit & CONFIG.armingFlags)) {
+ activeArmFlags.push(Object.keys(armingFlags)[Object.values(armingFlags).indexOf(checkBit)]);
+ }
+ }
+
$('span.i2c-error').text(CONFIG.i2cError);
$('span.cycle-time').text(CONFIG.cycleTime);
$('span.cpu-load').text(chrome.i18n.getMessage('statusbar_cpu_load', [CONFIG.cpuload]));
+ $('span.arming-flags').text(activeArmFlags.length ? activeArmFlags.join(', ') : '-');
};
GUI_control.prototype.updateProfileChange = function() {
@@ -279,11 +320,27 @@ GUI_control.prototype.renderOperandValue = function ($container, operandMetadata
$t.append('');
}
} else if (operandMetadata.type == "dictionary") {
- for (let k in operandMetadata.values) {
- if (operandMetadata.values.hasOwnProperty(k)) {
- $t.append('');
+ let operandValues = [];
+
+ for (let j in operandMetadata.values) {
+ if (operandMetadata.values.hasOwnProperty(j)) {
+ operandValues[parseInt(j,10)] = {
+ id: parseInt(j, 10),
+ name: operandMetadata.values[j],
+ };
}
}
+
+ operandValues.sort((a, b) => {
+ let ovAN = a.name.toLowerCase(),
+ ovBN = b.name.toLowerCase();
+
+ return (ovAN < ovBN) ? -1 : 1;
+ });
+
+ operandValues.forEach( val => {
+ $t.append('');
+ });
}
$t.val(value);
@@ -300,16 +357,27 @@ GUI_control.prototype.renderOperandValue = function ($container, operandMetadata
* @param {function} onChange
* @param {boolean} withAlways
*/
-GUI_control.prototype.renderLogicConditionSelect = function ($container, logicConditions, current, onChange, withAlways) {
+GUI_control.prototype.renderLogicConditionSelect = function ($container, logicConditions, current, onChange, withAlways, onlyEnabled) {
let $select = $container.append('