diff --git a/MAPPROXY.md b/MAPPROXY.md
index d6d99a2d..7da63d64 100644
--- a/MAPPROXY.md
+++ b/MAPPROXY.md
@@ -175,13 +175,13 @@ https://hub.docker.com/r/yagajs/mapproxy/ Docker image (untested)
base: GLOBAL_MERCATOR
origin: ul
```
-1. You can use any map provider that is compatible with MapProxy, and once you zoom in on the region you will be flying in, the map tiles will be cached for offline use. You can test this by disabling your internet connection and browsing the demo url in a browser
+1. You can use any map provider that is compatible with MapProxy, and once you zoom in on the region you will be flying in, the map tiles will be cached for offline use. You can test this by disabling your internet connection and browsing the demo URL in a browser
https://wiki.openstreetmap.org/wiki/WMS#OSM_WMS_Servers OpenStreetMap WSM servers
https://lpdaac.usgs.gov/data_access/web_map_services_wms # USGS currently has 400+ WMS layers
- * You can use QGIS to browse different provieders and pick the maps you like for your iNav layers
+ * You can use QGIS to browse different providers and pick the maps you like for your iNav layers
https://qgis.org/en/site/
- * There are many government and public wms providers available in different regions worldwide
+ * There are many government and public WMS providers available in different regions worldwide
diff --git a/README.md b/README.md
index 64cb5810..d84f356d 100644
--- a/README.md
+++ b/README.md
@@ -1,89 +1,121 @@
# INAV Configurator
-INAV Configurator is a crossplatform configuration tool for the [INAV](https://github.com/iNavFlight/inav) flight control system.
+INAV Configurator is a cross-platform configuration tool for the [INAV](https://github.com/iNavFlight/inav) flight control system.
It runs as an app within Google Chrome and allows you to configure the INAV software running on any supported INAV target.
-Various types of aircraft are supported by the tool and by INAV, e.g. quadcopters, hexacopters, octocopters and fixed-wing aircraft.
+Various types of aircraft are supported by the tool and by INAV, e.g. quadcopters, hexacopters, octocopters, and fixed-wing aircraft.
# Support
-INAV Configurator comes `as is`, without any warranty and support from authors. If you found a bug, please create an issue on [GitHub](https://github.com/iNavFlight/inav-configurator/issues).
+INAV Configurator comes `as is`, without any warranty and support from the authors. If you find a bug, please create an issue on [GitHub](https://github.com/iNavFlight/inav-configurator/issues).
-GitHub issue tracker is reserved for bugs and other technical problems. If you do not know how to setup
-everything, hardware is not working or have any other _support_ problem, please consult:
+The GitHub issue tracker is reserved for bugs and other technical problems. If you do not know how to set up
+everything, the hardware is not working, or you have any other _support_ problem, please consult:
* [INAV Discord Server](https://discord.gg/peg2hhbYwN)
* [INAV Official on Facebook](https://www.facebook.com/groups/INAVOfficial)
* [RC Groups Support](https://www.rcgroups.com/forums/showthread.php?2495732-Cleanflight-iNav-(navigation-rewrite)-project)
* [INAV Official on Telegram](https://t.me/INAVFlight)
-## INAV Configurator start minimized, what should I do?
+## INAV Configurator starts minimized, what should I do?
-You have to remove `C:\Users%Your_UserNname%\AppData\Local\inav-configurator` folder and all its content.
+You have to remove the `C:\Users%Your_UserName%\AppData\Local\inav-configurator` folder and all its content.
[https://www.youtube.com/watch?v=XMoULyiFDp4](https://www.youtube.com/watch?v=XMoULyiFDp4)
-Alternatively, on Windows with PowerShell you can use `post_install_cleanup.ps1` script that will do the cleaning. (thank you James Cherrill)
+Alternatively, on Windows with PowerShell, you can use the `post_install_cleanup.ps1` script that will do the cleaning. (thank you, James Cherrill)
## Installation
-Depending on target operating system, _INAV Configurator_ is distributed as _standalone_ application or Chrome App.
+Depending on the target operating system, _INAV Configurator_ is distributed as a _standalone_ application or Chrome App.
### Windows
1. Visit [release page](https://github.com/iNavFlight/inav-configurator/releases)
1. Download Configurator for Windows platform (win32 or win64 is present)
1. Extract ZIP archive
-1. Run INAV Configurator app from unpacked folder
-1. Configurator is not signed, so you have to allow Windows to run untrusted application. There might be a monit for it during first run
+1. Run the INAV Configurator app from the unpacked folder
+1. Configurator is not signed, so you have to allow Windows to run untrusted applications. There might be a monit for it during the first run
### 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.
-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:
+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 into 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 the INAV Configurator app from the unpacked folder `/opt/inav/inav-configurator/inav-configurator`
+
+#### Notes
+
+On some Linux distros, you may be missing `libatomic` and/or `NW.JS` (especially `libnode.so`) dependencies. If so, please install `libatomic` using your distro's package manager, e.g:
* Arch Linux: `sudo pacman -S --needed libatomic_ops`
* Debian / Ubuntu: `sudo apt install libatomic1`
* Fedora: `sudo dnf install libatomic`
+1. Don't forget to add your user to the 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. Download Configurator for the 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.
+For local development, the **node.js** build system is used.
1. Install node.js
-1. From project folder run `npm install`
+1. From the project folder run `npm install`
1. To build the JS and CSS files and start the configurator:
- With NW.js: Run `npm start`.
- With Chrome: Run `npm run gulp`. Then open `chrome://extensions`, enable
- the `Developer mode`, click on the `Load unpacked extension...` button and select the `inav-configurator` directory.
+ the `Developer mode`, click on the `Load unpacked extension...` button, and select the `inav-configurator` directory.
Other tasks are also defined in `gulpfile.js`. To run a task, use `node ./node_modules/gulp/bin/gulp.js task-name`. Available ones are:
- **build**: Generate JS and CSS output files used by the configurator from their sources. It must be run whenever changes are made to any `.js` or `.css` files in order to have those changes appear
in the configurator. If new files are added, they must be included in `gulpfile.js`. See the comments at the top of `gulpfile.js` to learn how to do so. See also the `watch` task.
- **watch**: Watch JS and CSS sources for changes and run the `build` task whenever they're edited.
-- **dist**: Create a distribution of the app (valid for packaging both as a Chrome app or a NW.js app)
+- **dist**: Create a distribution of the app (valid for packaging both as a Chrome app or NW.js app)
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.
+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 a particular OS. NOTE: MacOS Installer can be built with MacOS only.
To build a specific release, use the command `release --platform="win64"` for example.
@@ -95,17 +127,17 @@ 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 (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.
+INAV Configurator 2.1 allows you 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 their own account, agree to all _Terms and Conditions_ required by Bing Maps, and configure INAV Configurator by himself.
-### How to choose Map provider
+### How to choose a Map provider
1. Click **Settings** icon in the top-right corner of INAV Configurator
-1. Choose provider: OpenStreetMap, Bing, or MapProxy
+1. Choose a provider: OpenStreetMap, Bing, or MapProxy
1. In the case of Bing Maps, you have to provide your own, personal, generated by you, Bing Maps API key
1. For MapProxy, you need to provide a server URL and layer name to be used
-### How to get Bing Maps API key
+### How to get the Bing Maps API key
1. Go to the Bing Maps Dev Center at [https://www.bingmapsportal.com/](https://www.bingmapsportal.com/).
* If you have a Bing Maps account, sign in with the Microsoft account that you used to create the account or create a new one. For new accounts, follow the instructions in [Creating a Bing Maps Account](https://msdn.microsoft.com/library/gg650598.aspx).
@@ -113,22 +145,22 @@ INAV Configurator is shipped **WITHOUT** API key for Bing Maps. That means: ever
1. Select the option to create a new key.
1. Provide the following information to create a key:
1. Application name: Required. The name of the application.
- 1. Application URL: The URL of the application. This is an optional field which is useful in helping you remember the purpose of that key in the future.
+ 1. Application URL: The URL of the application. This is an optional field that is useful in helping you remember the purpose of that key in the future.
1. Key type: Required. Select the key type that you want to create. You can find descriptions of key and application types here.
1. Application type: Required. Select the application type that best represents the application that will use this key. You can find descriptions of key and application types [here](https://www.microsoft.com/maps/create-a-bing-maps-key.aspx).
-1. Click the **Create** button. The new key displays in the list of available keys. Use this key to authenticate your Bing Maps application as described in the documentation for the Bing Maps API you are using.
+1. Click the **Create** button. The new key is displayed in the list of available keys. Use this key to authenticate your Bing Maps application as described in the documentation for the Bing Maps API you are using.
-### How to setup a MapProxy server for offline caching and mission planning
-1. Follow process described in [MAPPROXY.md](MAPPROXY.md)
-1. Test your MapProxy server in web browser, eg: http://192.168.145.20/inavmapproxy/
+### How to set up a MapProxy server for offline caching and mission planning
+1. Follow the process described in [MAPPROXY.md](MAPPROXY.md)
+1. Test your MapProxy server in a web browser, eg: http://192.168.145.20/inavmapproxy/
1. Once you have a working MapProxy server choose MapProxy as your map provider
1. Enter MapProxy service URL, eg: http://192.168.145.20/inavmapproxy/service?
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
+1. Once completed, you can zoom in on the area you will be flying in while connected to the internet in either the 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.
+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
@@ -136,18 +168,13 @@ INAV provides the font images so that custom fonts can be created for your perso
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
https://github.com/iNavFlight/inav-configurator/issues
-For INAV firmware issues raise them here
+For INAV firmware issues, raise them here
https://github.com/iNavFlight/inav/issues
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index e4cc5d9f..1ab2b0a5 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"
},
@@ -112,6 +110,9 @@
"tabFailsafe": {
"message": "Failsafe"
},
+ "tabEzTune": {
+ "message": "Ez Tune"
+ },
"tabGPS": {
"message": "GPS"
},
@@ -259,7 +260,10 @@
"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. "
},
- "serialPortOpened": {
+ "auxiliaryAcroEnabled": {
+ "message": "ACRO"
+ },
+ "serialPortOpened": {
"message": "MSP connection successfully opened with ID: $1"
},
"serialPortOpenFail": {
@@ -280,7 +284,7 @@
"connectionBleType": {
"message": "BLE device type: $1"
},
- "connectionBleNotSupported" : {
+ "connectionBleNotSupported": {
"message": "Connection error: Firmware doesn't support BLE connections. Abort."
},
"connectionBleInterrupted": {
@@ -310,7 +314,6 @@
"usbDeviceUdevNotice": {
"message": "Are udev rules installed correctly? See docs for instructions"
},
-
"stm32UsbDfuNotFound": {
"message": "USB DFU not found"
},
@@ -484,9 +487,17 @@
"defaultWelcomeIntro": {
"message": "Welcome to INAV - Configurator, a utility designed to simplify updating, configuring and tuning of your flight controller."
},
-
+ "defaultWelcomeHead": {
+ "message": "Firmware & drivers"
+ },
+ "defaultWelcomeHead2": {
+ "message": "INAV Friends"
+ },
+ "defaultWelcomeText2": {
+ "message": "INAV is supported by a great community of users, developers and companies. Here is a short list: Mateksys, SpeedyBee, GEPRC. "
+ },
"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 "
+ "message": "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 "
},
"defaultContributingHead": {
"message": "Contributing"
@@ -820,6 +831,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"
},
@@ -883,7 +900,7 @@
"serialrx_inverted": {
"message": "Serial Port Inverted (comparing to protocol default)"
},
- "serialrx_halfduplex" : {
+ "serialrx_halfduplex": {
"message": "Serial receiver half-duplex"
},
"configurationFeaturesHelp": {
@@ -892,18 +909,6 @@
"configurationSerialRXHelp": {
"message": "Note: Remember to configure a Serial Port (via Ports tab) for the serial receiver"
},
- "configurationBoardAlignment": {
- "message": "Board and Sensor Alignment"
- },
- "configurationBoardAlignmentRoll": {
- "message": "Roll Degrees"
- },
- "configurationBoardAlignmentPitch": {
- "message": "Pitch Degrees"
- },
- "configurationBoardAlignmentYaw": {
- "message": "Yaw Degrees"
- },
"configurationSensorAlignmentMag": {
"message": "MAG Alignment"
},
@@ -1132,8 +1137,14 @@
"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"
@@ -1301,7 +1312,7 @@
"message": "Reset PID Controller"
},
"pidTuning_PIDgains": {
- "message" :"PID gains"
+ "message": "PID gains"
},
"pidTuning_Name": {
"message": "Name"
@@ -1351,6 +1362,24 @@
"pidTuning_RatesAndExpo": {
"message": "Rates & Expo"
},
+ "pidTuning_RateDynamics": {
+ "message": "Rate Dynamics"
+ },
+ "pidTuning_RateDynamics_Sensitivity": {
+ "message": "Sensitivity"
+ },
+ "pidTuning_RateDynamics_Correction": {
+ "message": "Correction"
+ },
+ "pidTuning_RateDynamics_Weight": {
+ "message": "Weight"
+ },
+ "pidTuning_RateDynamics_Center": {
+ "message": "Center"
+ },
+ "pidTuning_RateDynamics_End": {
+ "message": "End"
+ },
"pidTuning_RollPitchRate": {
"message": "ROLL & PITCH rate"
},
@@ -1366,7 +1395,7 @@
"pidTuning_RollAndPitchExpo": {
"message": "Roll & Pitch Expo"
},
- "pidTuning_YawExpo" : {
+ "pidTuning_YawExpo": {
"message": "Yaw Expo"
},
"pidTuning_MaxRollAngle": {
@@ -1523,7 +1552,7 @@
"message": "Pitch trim for self-leveling flight modes. In degrees. +5 means airplane nose should be raised 5 deg from level"
},
"pidTuning_ButtonSave": {
- "message": "Save"
+ "message": "Save and Reboot"
},
"pidTuning_ButtonRefresh": {
"message": "Refresh"
@@ -1555,6 +1584,9 @@
"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."
},
+ "loadedMixerProfile": {
+ "message": "Loaded Mixer Profile: $1, Check modes tab: MIXER PROFILE 2 if you don't see the changes"
+ },
"loadedBatteryProfile": {
"message": "Loaded Battery Profile: $1"
},
@@ -1632,7 +1664,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": {
@@ -1644,7 +1676,7 @@
"auxiliaryAddRange": {
"message": "Add Range"
},
- "auxiliaryAutoChannelSelect" : {
+ "auxiliaryAutoChannelSelect": {
"message": "AUTO"
},
"auxiliaryButtonSave": {
@@ -1708,7 +1740,7 @@
"adjustmentsGroupPIDTuning": {
"message": "PID Tuning"
},
- "adjustmentsGroupNavigationFlight" : {
+ "adjustmentsGroupNavigationFlight": {
"message": "Navigation and Flight"
},
"adjustmentsGroupMisc": {
@@ -1949,7 +1981,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"
@@ -2021,20 +2053,34 @@
"message": "Signal Strength"
},
"magnetometerHead": {
- "message": "Magnetometer Alignment"
+ "message": "Alignment tool"
},
"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": "1. Adjust Flight Controller orientation to match physical orientation on the aircraft according to \"direction\" arrow on Flight Controller. 2. Adjust magnetometer orientation to match physical orientation on the aircraft according to \"compass direction\" arrow or axis markings on magnetometer. Note: Magnetometer orientation preset (align_mag) is relative to FC. Make sure to align FC first (align_board_pitch, align_board_roll, align_board_yaw). If preset is not used (orientation is set using align_mag_roll, align_mag_pitch and align_mag_yaw), then magnetometer orientation is independent."
},
"magnetometerOrientationPreset": {
- "message": "Orientation presets"
+ "message": "Orientation preset (align_mag). Relative to FC orientation"
+ },
+ "boardInfo": {
+ "message": "1. Select Flight Controller alignment (align_board_roll, align_board_pitch, align_board_yaw)"
},
"magnetometerInfo": {
- "message": "Select a preset or create a custom configuration moving the sliders"
+ "message": "2. Select a preset (align_mag) or create a custom configuration using the sliders (align_mag_roll, align_mag_pitch, align_mag_yaw)"
},
"magnetometerElementToShow": {
- "message": "Element to show"
+ "message": "Element to show: Magnetometer model or axes"
},
+
+ "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."
},
@@ -2042,7 +2088,7 @@
"message": "Mag Statistics"
},
"tabMAGNETOMETER": {
- "message": "Magnetometer"
+ "message": "Alignment tool"
},
"motors": {
"message": "Motors"
@@ -2098,25 +2144,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"
@@ -2168,12 +2220,21 @@
"message": "Blackbox configuration"
},
"blackboxButtonSave": {
- "message": "Save and reboot"
+ "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."
},
@@ -2199,6 +2260,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"
},
@@ -2309,10 +2373,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": {
@@ -2397,7 +2461,6 @@
"ledStripEepromSaved": {
"message": "EEPROM saved: LED"
},
-
"controlAxisRoll": {
"message": "Roll [A]"
},
@@ -2410,6 +2473,9 @@
"controlAxisThrottle": {
"message": "Throttle [T]"
},
+ "controlAxisMotor": {
+ "message": "Motor"
+ },
"radioChannelShort": {
"message": "CH "
},
@@ -2534,31 +2600,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"
@@ -2743,6 +2809,46 @@
"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"
},
@@ -2797,6 +2903,12 @@
"tabAdvancedTuningTitle": {
"message": "Advanced Tuning"
},
+ "tabAdvancedTuningAirplaneTuningTitle": {
+ "message": ": Fixed Wing"
+ },
+ "tabAdvancedTuningMultirotorTuningTitle": {
+ "message": ": Multirotors"
+ },
"tabAdvancedTuningGenericTitle": {
"message": "Generic settings"
},
@@ -2978,34 +3090,34 @@
"message": "Used in Extra, Fixed and 'At Least' RTH altitude modes"
},
"rthTrackBack": {
- "message": "RTH Track Back Mode"
+ "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."
+ "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"
+ "message": "RTH Track Back Distance"
},
"rthTrackBackDistanceHelp": {
- "message": "Distance flown during Track Back. Normal RTH is executed once this total flight distance is exceeded [m]."
+ "message": "Distance flown during Track Back. Normal RTH is executed once this total flight distance is exceeded [m]."
},
"rthSafeHome": {
- "message": "Safe Home Mode"
+ "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."
+ "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"
+ "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."
+ "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"
+ "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"
+ "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"
@@ -3014,16 +3126,28 @@
"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"
+ "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."
+ "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"
+ "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]"
+ "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."
@@ -3133,10 +3257,10 @@
"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": {
@@ -3239,7 +3363,7 @@
"message": "The maximum distance between the home point and the first waypoint."
},
"fixedWingNavigationConfiguration": {
- "message": "Fixed Wing Navigation Settings"
+ "message": "Fixed Wing Navigation Settings"
},
"fixedWingLandingConfiguration": {
"message": "Fixed Wing Landing Settings"
@@ -3290,79 +3414,142 @@
"message": "This value is used when no headwind landing is possible and wind speeds below this value are ignored (inaccuracies in INAV wind measurement)."
},
"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_pilot_name": {
+ "message": "Pilot's Name"
+ },
+ "osdElement_PILOT_LOGO_HELP": {
+ "message": "Shows your small pilot logo in the OSD, where you position it. This requires a custom font with your pilot logo."
+ },
+ "osd_use_pilot_logo": {
+ "message": "Use pilot logo"
+ },
+ "osd_use_large_pilot_logo_help": {
+ "message": "Use your large pilot logo with/instead of the INAV logo. This requires a custom font with your pilot logo. This is seen on the arming screen."
},
"osd_units": {
- "message" : "Units"
+ "message": "Units"
},
"osd_main_voltage_decimals": {
- "message" : "Voltage Decimals"
+ "message": "Voltage Decimals"
},
- "osd_mah_used_precision": {
- "message" : "mAh Used Precision"
+ "osd_mah_precision": {
+ "message": "mAh 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"
+ "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_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_uptilt": {
+ "message": "Camera uptilt"
+ },
+ "osd_camera_uptilt_help": {
+ "message": "Set the camera uptilt for the FPV camera in degres, positive is up, negative is down, relative to the horizontal. Used for correct display of HUD items and AHI (when enabled)."
+ },
+ "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"
@@ -3421,16 +3608,16 @@
"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" : {
+ "osd_airspeed_min_alarm": {
"message": "Minimum Airspeed"
},
- "osd_airspeed_min_alarm_HELP" : {
+ "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" : {
+ "osd_airspeed_max_alarm": {
"message": "Maximum Airspeed"
},
- "osd_airspeed_max_alarm_HELP" : {
+ "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": {
@@ -3965,82 +4152,82 @@
"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..."
@@ -4048,9 +4235,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."
},
@@ -4105,6 +4307,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"
},
@@ -4162,6 +4466,9 @@
"no_waypoints_to_save": {
"message": "No waypoints to save !"
},
+ "mixerThrottleWarning": {
+ "message": "Warning:value beyond normal operation range."
+ },
"servoMixer": {
"message": "Servo mixer"
},
@@ -4195,19 +4502,19 @@
"mixerLoadAndApplyPresetRules": {
"message": "Load and apply"
},
- "mixerApplyModalTitle" : {
+ "mixerApplyModalTitle": {
"message": "Confirm"
},
"mixerButtonSaveAndReboot": {
- "message": "Save and reboot"
+ "message": "Save and Reboot"
},
"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": {
@@ -4268,7 +4575,7 @@
"message": "This will reset all PID settings to firmware default values and save.\nDo you want to continue?"
},
"mappingTableOutput": {
- "message": "Output"
+ "message": "Output (timer)"
},
"mappingTableFunction": {
"message": "Function"
@@ -4603,9 +4910,6 @@
"WaypointOptionP2": {
"message": "P2"
},
- "rollPitchAdjustmentsMoved": {
- "message": "Roll & Pitch board orientation is available only in the CLI. Do not use it to trim the airplane for the level flight! Use Fixed Wing Level Trim on the PID tuning tab under Mechanics instead (fw_level_pitch_trim)."
- },
"pidId": {
"message": "#"
},
@@ -4642,13 +4946,18 @@
"motor_direction_inverted": {
"message": "Normal motor direction / Props In configuration"
},
- "motor_direction_isInverted" :
- {
- "message" : "Reversed motor direction / Props Out 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."
},
+ "mixer_pid_profile_linking": {
+ "message": "PID Profile will use same index as Mixer Profile index"
+ },
+ "mixer_pid_profile_linking_hint": {
+ "message": "mixer_pid_profile_linking: Enable on both Mixer Profile if you want PID Profile switching handled by Mixer Profile switching(Recommend in vtol/mixed plaform type setup)"
+ },
"blackboxFields": {
"message": "Blackbox fields"
},
@@ -4727,10 +5036,608 @@
"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"
+ },
+ "mixerProfile1": {
+ "message": "Mixer profile 1"
+ },
+ "mixerProfile2": {
+ "message": "Mixer profile 2"
+ },
+ "sensorProfile1": {
+ "message": "PID profile 1"
+ },
+ "sensorProfile2": {
+ "message": "PID profile 2"
+ },
+ "sensorProfile3": {
+ "message": "PID 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"
+ },
+ "timerOutputs": {
+ "message": "Timer outputs"
+ },
+ "ezTuneFilterHz": {
+ "message": "Filter Hz"
+ },
+ "ezTuneAxisRatio": {
+ "message": "Axis ratio"
+ },
+ "ezTuneResponse": {
+ "message": "Response"
+ },
+ "ezTuneDamping": {
+ "message": "Damping"
+ },
+ "ezTuneStability": {
+ "message": "Stability"
+ },
+ "ezTuneAggressiveness": {
+ "message": "Aggressiveness"
+ },
+ "ezTuneRate": {
+ "message": "Rate"
+ },
+ "ezTuneExpo": {
+ "message": "Expo"
+ },
+ "ezTuneFilterHzTips": {
+ "message": "This sets the base cutoff frequency for all INAV gyro and D-term filters. Higher values will result in lower filter delay and better stabilization, but more noise will go through the filters and motors will get hot, UAV might oscillate and be unfyable. Your goal is to increase this value as high as possible before any negative effects appear. Negative effects include: hot motors, audible osciallations, UAV rapidly shaking, UAV gaining altitude by itself. Usual starting points for 'Filter Hz' are: 3-inch props: 90, 5-inch props: 110, 7-inch props: 90, 10-inch props: 75, 12-inch props: 60. Use Blackbox and common sense to find a value that is most suited for your UAV."
+ },
+ "ezTuneAxisRatioTips": {
+ "message": "Describes the weight/moment of inertia distribution of your UAV. The longer the frame (more mass on the front-back axis) more Axis Ratio is requires. Perfect X frame is ratio 100. Most modern frames should fit somewhere between 110 and 130. Default 110 is a good starting point."
+ },
+ "ezTuneResponseTips": {
+ "message": "This setting defines how fast the UAV will react to stick movements and gyro signal. Higher values will result in faster reaction, but also in more overshoots and oscillations. If UAV feels sluggish or has a slow wobble, increase the Response. If it has hot motors, audibly osciallates, overshoots or feels too nervous, decrease the Response. Most modern quads should beefy motors will fly best with Response below 80. Should be tuned together with Damping. It is a P-term equivalent."
+ },
+ "ezTuneDampingTips": {
+ "message": "Describes the stengths of a force that opposes any rotation speed change. It dampens roll and pitch acceleration and causes smoother and more stable flight. Your task during tuning is to find out how much you can increase it before any negative symptoms appear: hot motors, audible osciallations, overshoot. Most modern quads should accept 'Damping' up to 150-180. It is a D-term equivalent."
+ },
+ "ezTuneStabilityTips": {
+ "message": "Defines long-term stabilization strength. Most modern quads should tolerate 'Stability' even up to 120-130. Usually does not have to be tuned at all. If UAV suffers from heavy propwash during vertical descent, lowering 'Stability' might help. It is a I-term equivalent"
+ },
+ "ezTuneAggressivenessTips": {
+ "message": "Defines how fast your UAV will react to fast stick movements. Higher 'Aggressiveness' results in snappier fast manouvers. It does not affect stabilization, only stick feeling. It is a FF-term equivalent."
+ },
+ "ezTuneRateTips": {
+ "message": "Defines how fast your UAV will rotate around roll, pitch and yaw axis. Higher 'Rate' results in faster rotation. Value of 0 is the equivalent of 300dps, 100 is the equivalent of 600dps, 200 is the equivalent of 900dps."
+ },
+ "ezTuneExpoTips": {
+ "message": "Defines expo of the RC input. Lower values result in more sensitive stick in the center. Higher values result in less sensitive center and more rapid response at the end of the stick. Value of 0 is the equivalent of 0 expo, 100 is the equivalent of 0.7 expo, 200 is the equivalent of 1.0 expo."
+ },
+ "ezTunePidPreview": {
+ "message": "PID preview"
+ },
+ "ezTuneRatePreview": {
+ "message": "Rate preview"
+ },
+ "ezTuneRatePreviewAxis" : {
+ "message": "Axis"
+ },
+ "ezTuneRatePreviewRate" : {
+ "message": "Rate"
+ },
+ "ezTuneRatePreviewExpo" : {
+ "message": "Expo"
+ },
+ "ezTuneEnabledTips": {
+ "message": "When enabled, Ez Tune will override multiple INAV setting to simplify the tuning process. Instead of setting each PID and filtering setting independently, you only have to work with 7 sliders. Ez Tune will automatically adjust all other settings to match your needs. Ez Tune is a great starting point for new users and a great way to quickly tune a new UAV. It is not recommended to use Ez Tune on advanced builds, as it will override all your settings and you will not be able to fine tune your UAV. When Ez Tune is enabled, settings from the PID tuning tab will be overriden by EzTune."
+ },
+ "ezTuneDisclaimer": {
+ "message": "Disclaimer: Ez Tune is an experimental function. It is not guaranteed to work on all UAVs. It is not guaranteed to work with all frame types. It is not guaranteed to work with all propellers. All computations and tuning result can change in future versions of INAV. We still encourage you to check it out and share your experience on INAV Discord in the #ez-tune channel"
+ },
+ "ezTuneNote": {
+ "message": "Important Ez Tune is enabled. All settings on this tab are set and controlled by the Ez Tune. To use PID Tuning tab you have to disable Ez Tune. To do it, uncheck the Enabled checkbox on the Ez Tune tab."
}
-}
+}
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
index d7d187cc..5ce4b041 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -126,6 +126,7 @@ sources.js = [
'./js/serial_queue.js',
'./js/msp_balanced_interval.js',
'./tabs/advanced_tuning.js',
+ './tabs/ez_tune.js',
'./js/peripherals.js',
'./js/appUpdater.js',
'./js/feature_framework.js',
diff --git a/js/appUpdater.js b/js/appUpdater.js
index 74044ef2..e4d36ab3 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 ddbc0ce0..d711bb37 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': '6.0.0',
- 'maxFirmwareVersionAccepted': '7.0.0', // Condition is < (lt) so we accept all in 6.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 0a93a55c..9f9641b1 100644
--- a/js/defaults_dialog.js
+++ b/js/defaults_dialog.js
@@ -823,12 +823,6 @@ helper.defaultsDialog = (function () {
value: 25
},
],
- "features": [
- {
- bit: 4, // Enable MOTOR_STOP
- state: true
- }
- ]
},
{
"title": 'Airplane without a Tail (Wing, Delta, etc)',
@@ -1042,12 +1036,6 @@ helper.defaultsDialog = (function () {
value: 25
},
],
- "features": [
- {
- bit: 4, // Enable MOTOR_STOP
- state: true
- }
- ]
},
{
"title": 'Rovers & Boats',
@@ -1205,6 +1193,7 @@ helper.defaultsDialog = (function () {
MIXER_CONFIG.platformType = currentMixerPreset.platform;
MIXER_CONFIG.appliedMixerPreset = selectedDefaultPreset.mixerToApply;
+ MIXER_CONFIG.motorStopOnLow = (currentMixerPreset.motorStopOnLow === true) ? true : false;
MIXER_CONFIG.hasFlaps = (currentMixerPreset.hasFlaps === true) ? true : false;
SERVO_RULES.cleanup();
diff --git a/js/fc.js b/js/fc.js
index 2163c0d4..48578b01 100644
--- a/js/fc.js
+++ b/js/fc.js
@@ -65,6 +65,7 @@ var CONFIG,
BOARD_ALIGNMENT,
CURRENT_METER_CONFIG,
FEATURES,
+ RATE_DYNAMICS,
FW_APPROACH;
var FC = {
@@ -118,8 +119,9 @@ var FC = {
i2cError: 0,
activeSensors: 0,
mode: [],
- profile: 0,
- battery_profile: 0,
+ mixer_profile: -1,
+ profile: -1,
+ battery_profile: -1,
uid: [0, 0, 0],
accelerometerTrims: [0, 0],
armingFlags: 0,
@@ -196,6 +198,7 @@ var FC = {
MIXER_CONFIG = {
yawMotorDirection: 0,
yawJumpPreventionLimit: 0,
+ motorStopOnLow: false,
platformType: -1,
hasFlaps: false,
appliedMixerPreset: -1,
@@ -542,6 +545,27 @@ var FC = {
SAFEHOMES = new SafehomeCollection();
+ RATE_DYNAMICS = {
+ sensitivityCenter: null,
+ sensitivityEnd: null,
+ correctionCenter: null,
+ correctionEnd: null,
+ weightCenter: null,
+ weightEnd: null
+ };
+
+ EZ_TUNE = {
+ enabled: null,
+ filterHz: null,
+ axisRatio: null,
+ response: null,
+ damping: null,
+ stability: null,
+ aggressiveness: null,
+ rate: null,
+ expo: null
+ };
+
FW_APPROACH = new FwApproachCollection();
},
getOutputUsages: function() {
@@ -557,7 +581,6 @@ var FC = {
getFeatures: function () {
var features = [
{bit: 1, group: 'batteryVoltage', name: 'VBAT'},
- {bit: 4, group: 'other', name: 'MOTOR_STOP'},
{bit: 6, group: 'other', name: 'SOFTSERIAL', haveTip: true, showNameInTip: true},
{bit: 7, group: 'other', name: 'GPS', haveTip: true},
{bit: 10, group: 'other', name: 'TELEMETRY', showNameInTip: true},
@@ -596,7 +619,6 @@ var FC = {
},
getGpsProtocols: function () {
return [
- 'NMEA',
'UBLOX',
'UBLOX7',
'MSP',
@@ -619,6 +641,7 @@ var FC = {
'North American WAAS',
'Japanese MSAS',
'Indian GAGAN',
+ 'SouthPAN (AU/NZ)',
'Disabled'
];
},
@@ -883,6 +906,7 @@ var FC = {
'GVAR 5', // 35
'GVAR 6', // 36
'GVAR 7', // 37
+ 'Mixer Transition', // 38
];
},
getServoMixInputName: function (input) {
@@ -1210,6 +1234,12 @@ var FC = {
hasOperand: [true, true],
output: "boolean"
},
+ 52: {
+ name: "LED Pin PWM",
+ operandType: "Set Flight Parameter",
+ hasOperand: [true, false],
+ output: "raw"
+ },
}
},
getOperandTypes: function () {
@@ -1266,11 +1296,14 @@ var FC = {
30: "CRSF SNR",
31: "GPS Valid Fix",
32: "Loiter Radius [cm]",
- 33: "Active Profile",
+ 33: "Active PIDProfile",
34: "Battery cells",
35: "AGL status [0/1]",
36: "AGL [cm]",
37: "Rangefinder [cm]",
+ 38: "Active MixerProfile",
+ 39: "MixerTransition Active",
+ 40: "Yaw [deg]"
38: "FW Land State"
}
},
diff --git a/js/gui.js b/js/gui.js
index 3d20d07a..91856e75 100644
--- a/js/gui.js
+++ b/js/gui.js
@@ -41,7 +41,8 @@ var GUI_control = function () {
'advanced_tuning',
'mission_control',
'mixer',
- 'programming'
+ 'programming',
+ 'ez_tune'
];
this.allowedTabs = this.defaultAllowedTabsWhenDisconnected;
@@ -52,6 +53,17 @@ var GUI_control = function () {
else if (navigator.appVersion.indexOf("Linux") != -1) this.operating_system = "Linux";
else if (navigator.appVersion.indexOf("X11") != -1) this.operating_system = "UNIX";
else this.operating_system = "Unknown";
+
+ this.colorTable = [
+ "#8ecae6",
+ "#2a9d8f",
+ "#e9c46a",
+ "#f4a261",
+ "#e76f51",
+ "#ef476f",
+ "#ffc300"
+ ];
+
};
// message = string
@@ -248,9 +260,16 @@ GUI_control.prototype.updateStatusBar = function() {
$('span.arming-flags').text(activeArmFlags.length ? activeArmFlags.join(', ') : '-');
};
-GUI_control.prototype.updateProfileChange = function() {
+GUI_control.prototype.updateProfileChange = function(refresh) {
+ $('#mixerprofilechange').val(CONFIG.mixer_profile);
$('#profilechange').val(CONFIG.profile);
$('#batteryprofilechange').val(CONFIG.battery_profile);
+ if (refresh) {
+ GUI.log(chrome.i18n.getMessage('loadedMixerProfile', [CONFIG.mixer_profile + 1]));
+ GUI.log(chrome.i18n.getMessage('pidTuning_LoadedProfile', [CONFIG.profile + 1]));
+ GUI.log(chrome.i18n.getMessage('loadedBatteryProfile', [CONFIG.battery_profile + 1]));
+ updateActivatedTab();
+ }
};
GUI_control.prototype.fillSelect = function ($element, values, currentValue, unit) {
@@ -383,5 +402,91 @@ GUI_control.prototype.renderLogicConditionSelect = function ($container, logicCo
$select.val(current).change(onChange);
}
+GUI_control.prototype.sliderize = function ($input, value, min, max) {
+ let scaledMax;
+ let scaledMin;
+ let scalingThreshold;
+
+ if ($input.data('normal-max')) {
+ scaledMax = max * 2;
+ scalingThreshold = Math.round(scaledMax * 0.8);
+ scaledMin = min *2;
+ } else {
+ scaledMax = max;
+ scaledMin = min;
+ scalingThreshold = scaledMax;
+ }
+
+ let $range = $('');
+ if ($input.data('step')) {
+ $range.attr('step', $input.data('step'));
+ }
+ $range.css({
+ 'display': 'block',
+ 'flex-grow': 100,
+ 'margin-left': '1em',
+ 'margin-right': '1em',
+ });
+
+ $input.attr('min', min);
+ $input.attr('max', max);
+ $input.val(parseInt(value));
+ $input.css({
+ 'width': 'auto',
+ 'min-width': '75px',
+ });
+
+ $input.parent().css({
+ 'display': 'flex',
+ 'width': '100%'
+ });
+ $range.insertAfter($input);
+
+ $input.parent().find('.helpicon').css({
+ 'top': '5px',
+ 'left': '-10px'
+ });
+
+ /*
+ * Update slider to input
+ */
+ $range.on('input', function() {
+ let val = $(this).val();
+ let normalMax = parseInt($input.data('normal-max'));
+
+ if (normalMax) {
+ if (val <= scalingThreshold) {
+ val = scaleRangeInt(val, scaledMin, scalingThreshold, min, normalMax);
+ } else {
+ val = scaleRangeInt(val, scalingThreshold + 1, scaledMax, normalMax + 1, max);
+ }
+ }
+
+ $input.val(val);
+ $input.trigger('updated');
+ });
+
+ $input.on('change', function() {
+
+ let val = $(this).val();
+ let newVal;
+ let normalMax = parseInt($input.data('normal-max'));
+ if (normalMax) {
+ if (val <= normalMax) {
+ newVal = scaleRangeInt(val, min, normalMax, scaledMin, scalingThreshold);
+ } else {
+ newVal = scaleRangeInt(val, normalMax + 1, max, scalingThreshold + 1, scaledMax);
+ }
+ } else {
+ newVal = val;
+ }
+
+ $range.val(newVal);
+ $input.trigger('updated');
+ });
+
+ $input.trigger('change');
+};
+
// initialize object into GUI variable
var GUI = new GUI_control();
diff --git a/js/model.js b/js/model.js
index 806140b1..aaeafd7a 100644
--- a/js/model.js
+++ b/js/model.js
@@ -350,6 +350,7 @@ const mixerList = [
enabled: true,
legacy: true,
platform: PLATFORM_AIRPLANE,
+ motorStopOnLow: true,
motorMixer: [
new MotorMixRule(1.0, 0.0, 0.0, 0.0),
],
@@ -373,6 +374,7 @@ const mixerList = [
enabled: true,
legacy: false,
platform: PLATFORM_AIRPLANE,
+ motorStopOnLow: true,
motorMixer: [
new MotorMixRule(1.0, 0.0, 0.0, 0.1),
new MotorMixRule(1.0, 0.0, 0.0, -0.1)
@@ -399,6 +401,7 @@ const mixerList = [
enabled: true,
legacy: true,
platform: PLATFORM_AIRPLANE,
+ motorStopOnLow: true,
hasFlaps: true,
motorMixer: [
new MotorMixRule(1.0, 0.0, 0.0, 0.0),
@@ -427,6 +430,7 @@ const mixerList = [
enabled: true,
legacy: false,
platform: PLATFORM_AIRPLANE,
+ motorStopOnLow: true,
hasFlaps: true,
motorMixer: [
new MotorMixRule(1.0, 0.0, 0.0, 0.3),
@@ -456,6 +460,7 @@ const mixerList = [
enabled: true,
legacy: false,
platform: PLATFORM_AIRPLANE,
+ motorStopOnLow: true,
hasFlaps: true,
motorMixer: [
new MotorMixRule(1.0, 0.0, 0.0, 0.0),
@@ -486,6 +491,7 @@ const mixerList = [
enabled: true,
legacy: false,
platform: PLATFORM_AIRPLANE,
+ motorStopOnLow: true,
hasFlaps: true,
motorMixer: [
new MotorMixRule(1.0, 0.0, 0.0, 0.3),
@@ -516,6 +522,7 @@ const mixerList = [
enabled: true,
legacy: false,
platform: PLATFORM_AIRPLANE,
+ motorStopOnLow: true,
motorMixer: [
new MotorMixRule(1.0, 0.0, 0.0, 0.0),
],
@@ -542,6 +549,7 @@ const mixerList = [
legacy: false,
platform: PLATFORM_AIRPLANE,
hasFlaps: true,
+ motorStopOnLow: true,
motorMixer: [
new MotorMixRule(1.0, 0.0, 0.0, 0.0),
],
@@ -568,6 +576,7 @@ const mixerList = [
enabled: false,
legacy: true,
platform: PLATFORM_AIRPLANE,
+ motorStopOnLow: true,
motorMixer: [],
servoMixer: []
}, // 24
diff --git a/js/motorMixRule.js b/js/motorMixRule.js
index 16b241e1..06957821 100644
--- a/js/motorMixRule.js
+++ b/js/motorMixRule.js
@@ -6,7 +6,7 @@ var MotorMixRule = function (throttle, roll, pitch, yaw) {
var self = {};
self.fromMsp = function (mspThrottle, mspRoll, mspPitch, mspYaw) {
- throttle = mspThrottle / 1000;
+ throttle = Math.round(((mspThrottle / 1000) - 2) * 1000) / 1000;
roll = Math.round(((mspRoll / 1000) - 2) * 1000) / 1000;
pitch = Math.round(((mspPitch / 1000) - 2) * 1000) / 1000;
yaw = Math.round(((mspYaw / 1000) - 2) * 1000) / 1000;
@@ -17,11 +17,11 @@ var MotorMixRule = function (throttle, roll, pitch, yaw) {
};
self.getThrottle = function () {
- return constrain(parseFloat(throttle, 10), 0, 1);
+ return constrain(parseFloat(throttle, 10), -2, 2);
};
self.getThrottleForMsp = function () {
- return self.getThrottle() * 1000;
+ return (self.getThrottle()+2) * 1000;
};
self.setThrottle = function (data) {
diff --git a/js/motorMixerRuleCollection.js b/js/motorMixerRuleCollection.js
index 6a5a6c40..a995f867 100644
--- a/js/motorMixerRuleCollection.js
+++ b/js/motorMixerRuleCollection.js
@@ -5,6 +5,7 @@ var MotorMixerRuleCollection = function () {
let self = {},
data = [],
+ inactiveData = [],
maxMotorCount = 8;
self.setMotorCount = function (value) {
@@ -16,7 +17,11 @@ var MotorMixerRuleCollection = function () {
};
self.put = function (element) {
- data.push(element);
+ if (data.length < self.getMotorCount()){
+ data.push(element);
+ }else{
+ inactiveData.push(element); //store the data for mixer_profile 2
+ }
};
self.get = function () {
@@ -30,18 +35,25 @@ var MotorMixerRuleCollection = function () {
self.flush = function () {
data = [];
+ inactiveData = [];
};
self.cleanup = function () {
var tmpData = [];
+ var tmpInactiveData = [];
data.forEach(function (element) {
if (element.isUsed()) {
tmpData.push(element);
}
});
-
+ inactiveData.forEach(function (element) {
+ if (element.isUsed()) {
+ tmpInactiveData.push(element);
+ }
+ });
data = tmpData;
+ inactiveData = tmpInactiveData;
};
self.inflate = function () {
@@ -55,7 +67,7 @@ var MotorMixerRuleCollection = function () {
};
self.getNumberOfConfiguredMotors = function () {
- return data.length;
+ return data.length > inactiveData.length ? data.length : inactiveData.length;
};
return self;
diff --git a/js/msp/MSPCodes.js b/js/msp/MSPCodes.js
index fde2a7e2..32f977bf 100644
--- a/js/msp/MSPCodes.js
+++ b/js/msp/MSPCodes.js
@@ -180,6 +180,11 @@ var MSPCodes = {
MSPV2_INAV_SET_RATE_PROFILE: 0x2008,
MSPV2_INAV_AIR_SPEED: 0x2009,
MSPV2_INAV_OUTPUT_MAPPING: 0x200A,
+ MSP2_INAV_MC_BRAKING: 0x200B,
+ MSP2_INAV_SET_MC_BRAKING: 0x200C,
+ MSPV2_INAV_OUTPUT_MAPPING_EXT: 0x200D,
+ MSP2_INAV_TIMER_OUTPUT_MODE: 0x200E,
+ MSP2_INAV_SET_TIMER_OUTPUT_MODE: 0x200F,
MSP2_INAV_MIXER: 0x2010,
MSP2_INAV_SET_MIXER: 0x2011,
@@ -191,9 +196,6 @@ var MSPCodes = {
MSP2_INAV_OSD_PREFERENCES: 0x2016,
MSP2_INAV_OSD_SET_PREFERENCES: 0x2017,
- MSP2_INAV_MC_BRAKING: 0x200B,
- MSP2_INAV_SET_MC_BRAKING: 0x200C,
-
MSP2_INAV_SELECT_BATTERY_PROFILE: 0x2018,
MSP2_INAV_DEBUG: 0x2019,
@@ -217,6 +219,7 @@ var MSPCodes = {
MSP2_INAV_SET_PROGRAMMING_PID: 0x2029,
MSP2_INAV_PROGRAMMING_PID_STATUS: 0x202A,
+
MSP2_PID: 0x2030,
MSP2_SET_PID: 0x2031,
@@ -236,6 +239,15 @@ var MSPCodes = {
MSP2_INAV_LED_STRIP_CONFIG_EX: 0x2048,
MSP2_INAV_SET_LED_STRIP_CONFIG_EX: 0x2049,
+ MSP2_INAV_RATE_DYNAMICS: 0x2060,
+ MSP2_INAV_SET_RATE_DYNAMICS: 0x2061,
+
+ MSP2_INAV_EZ_TUNE: 0x2070,
+ MSP2_INAV_EZ_TUNE_SET: 0x2071,
+
+ MSP2_INAV_SELECT_MIXER_PROFILE: 0x2080
+ MSP2_INAV_SET_LED_STRIP_CONFIG_EX: 0x2049,
+
MSP2_INAV_FW_APPROACH: 0x204A,
MSP2_INAV_SET_FW_APPROACH: 0x204B
};
diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js
index f3ac987d..d3849fbe 100644
--- a/js/msp/MSPHelper.js
+++ b/js/msp/MSPHelper.js
@@ -68,6 +68,7 @@ var mspHelper = (function (gui) {
color;
if (!dataHandler.unsupported || dataHandler.unsupported) switch (dataHandler.code) {
case MSPCodes.MSPV2_INAV_STATUS:
+ let profile_changed = false;
CONFIG.cycleTime = data.getUint16(offset, true);
offset += 2;
CONFIG.i2cError = data.getUint16(offset, true);
@@ -76,13 +77,28 @@ var mspHelper = (function (gui) {
offset += 2;
CONFIG.cpuload = data.getUint16(offset, true);
offset += 2;
+
profile_byte = data.getUint8(offset++)
- CONFIG.profile = profile_byte & 0x0F;
- CONFIG.battery_profile = (profile_byte & 0xF0) >> 4;
+ let profile = profile_byte & 0x0F;
+ profile_changed |= (profile !== CONFIG.profile) && (CONFIG.profile !==-1);
+ CONFIG.profile = profile;
+
+ let battery_profile = (profile_byte & 0xF0) >> 4;
+ profile_changed |= (battery_profile !== CONFIG.battery_profile) && (CONFIG.battery_profile !==-1);
+ CONFIG.battery_profile = battery_profile;
+
CONFIG.armingFlags = data.getUint32(offset, true);
offset += 4;
+
+ //As there are 8 bytes for mspBoxModeFlags (number of bytes is actually variable)
+ //read mixer profile as the last byte in the the message
+ profile_byte = data.getUint8(dataHandler.message_length_expected - 1);
+ let mixer_profile = profile_byte & 0x0F;
+ profile_changed |= (mixer_profile !== CONFIG.mixer_profile) && (CONFIG.mixer_profile !==-1);
+ CONFIG.mixer_profile = mixer_profile;
+
gui.updateStatusBar();
- gui.updateProfileChange();
+ gui.updateProfileChange(profile_changed);
break;
case MSPCodes.MSP_ACTIVEBOXES:
@@ -1453,7 +1469,8 @@ var mspHelper = (function (gui) {
break;
case MSPCodes.MSP2_INAV_MIXER:
MIXER_CONFIG.yawMotorDirection = data.getInt8(0);
- MIXER_CONFIG.yawJumpPreventionLimit = data.getUint16(1, true);
+ MIXER_CONFIG.yawJumpPreventionLimit = data.getUint8(1, true);
+ MIXER_CONFIG.motorStopOnLow = data.getUint8(2, true);
MIXER_CONFIG.platformType = data.getInt8(3);
MIXER_CONFIG.hasFlaps = data.getInt8(4);
MIXER_CONFIG.appliedMixerPreset = data.getInt16(5, true);
@@ -1482,7 +1499,32 @@ var mspHelper = (function (gui) {
case MSPCodes.MSPV2_INAV_OUTPUT_MAPPING:
OUTPUT_MAPPING.flush();
for (i = 0; i < data.byteLength; ++i)
- OUTPUT_MAPPING.put(data.getUint8(i));
+ OUTPUT_MAPPING.put({
+ 'timerId': i,
+ 'usageFlags': data.getUint8(i)});
+ break;
+ case MSPCodes.MSPV2_INAV_OUTPUT_MAPPING_EXT:
+ OUTPUT_MAPPING.flush();
+ for (i = 0; i < data.byteLength; i += 2) {
+ timerId = data.getUint8(i);
+ usageFlags = data.getUint8(i + 1);
+ OUTPUT_MAPPING.put(
+ {
+ 'timerId': timerId,
+ 'usageFlags': usageFlags
+ });
+ }
+ break;
+
+ case MSPCodes.MSP2_INAV_TIMER_OUTPUT_MODE:
+ if(data.byteLength > 2) {
+ OUTPUT_MAPPING.flushTimerOverrides();
+ }
+ for (i = 0; i < data.byteLength; i += 2) {
+ timerId = data.getUint8(i);
+ outputMode = data.getUint8(i + 1);
+ OUTPUT_MAPPING.setTimerOverride(timerId, outputMode);
+ }
break;
case MSPCodes.MSP2_INAV_MC_BRAKING:
@@ -1552,6 +1594,35 @@ var mspHelper = (function (gui) {
console.log('FW Approach saved');
break;
+ case MSPCodes.MSP2_INAV_RATE_DYNAMICS:
+ RATE_DYNAMICS.sensitivityCenter = data.getUint8(0);
+ RATE_DYNAMICS.sensitivityEnd = data.getUint8(1);
+ RATE_DYNAMICS.correctionCenter = data.getUint8(2);
+ RATE_DYNAMICS.correctionEnd = data.getUint8(3);
+ RATE_DYNAMICS.weightCenter = data.getUint8(4);
+ RATE_DYNAMICS.weightEnd = data.getUint8(5);
+ break;
+
+ case MSPCodes.MSP2_INAV_SET_RATE_DYNAMICS:
+ console.log('Rate dynamics saved');
+ break;
+
+ case MSPCodes.MSP2_INAV_EZ_TUNE:
+ EZ_TUNE.enabled = data.getUint8(0);
+ EZ_TUNE.filterHz = data.getUint16(1, true);
+ EZ_TUNE.axisRatio = data.getUint8(3);
+ EZ_TUNE.response = data.getUint8(4);
+ EZ_TUNE.damping = data.getUint8(5);
+ EZ_TUNE.stability = data.getUint8(6);
+ EZ_TUNE.aggressiveness = data.getUint8(7);
+ EZ_TUNE.rate = data.getUint8(8);
+ EZ_TUNE.expo = data.getUint8(9);
+ break;
+
+ case MSPCodes.MSP2_INAV_EZ_TUNE_SET:
+ console.log('EzTune settings saved');
+ break;
+
default:
console.log('Unknown code detected: ' + dataHandler.code);
} else {
@@ -2149,8 +2220,8 @@ var mspHelper = (function (gui) {
case MSPCodes.MSP2_INAV_SET_MIXER:
buffer.push(MIXER_CONFIG.yawMotorDirection);
- buffer.push(lowByte(MIXER_CONFIG.yawJumpPreventionLimit));
- buffer.push(highByte(MIXER_CONFIG.yawJumpPreventionLimit));
+ buffer.push(MIXER_CONFIG.yawJumpPreventionLimit);
+ buffer.push(MIXER_CONFIG.motorStopOnLow);
buffer.push(MIXER_CONFIG.platformType);
buffer.push(MIXER_CONFIG.hasFlaps);
buffer.push(lowByte(MIXER_CONFIG.appliedMixerPreset));
@@ -2179,6 +2250,31 @@ var mspHelper = (function (gui) {
buffer.push(BRAKING_CONFIG.bankAngle);
break;
+ case MSPCodes.MSP2_INAV_SET_RATE_DYNAMICS:
+ buffer.push(RATE_DYNAMICS.sensitivityCenter);
+ buffer.push(RATE_DYNAMICS.sensitivityEnd);
+ buffer.push(RATE_DYNAMICS.correctionCenter);
+ buffer.push(RATE_DYNAMICS.correctionEnd);
+ buffer.push(RATE_DYNAMICS.weightCenter);
+ buffer.push(RATE_DYNAMICS.weightEnd);
+ break;
+
+ case MSPCodes.MSP2_INAV_EZ_TUNE_SET:
+
+ buffer.push(EZ_TUNE.enabled);
+ buffer.push(lowByte(EZ_TUNE.filterHz));
+ buffer.push(highByte(EZ_TUNE.filterHz));
+ buffer.push(EZ_TUNE.axisRatio);
+ buffer.push(EZ_TUNE.response);
+ buffer.push(EZ_TUNE.damping);
+ buffer.push(EZ_TUNE.stability);
+ buffer.push(EZ_TUNE.aggressiveness);
+ buffer.push(EZ_TUNE.rate);
+ buffer.push(EZ_TUNE.expo);
+ console.log(buffer);
+ break;
+
+
default:
return false;
}
@@ -2840,6 +2936,47 @@ var mspHelper = (function (gui) {
MSP.send_message(MSPCodes.MSPV2_INAV_OUTPUT_MAPPING, false, false, callback);
};
+ self.loadOutputMappingExt = function (callback) {
+ MSP.send_message(MSPCodes.MSPV2_INAV_OUTPUT_MAPPING_EXT, false, false, callback);
+ };
+
+ self.loadTimerOutputModes = function(callback) {
+ MSP.send_message(MSPCodes.MSP2_INAV_TIMER_OUTPUT_MODE, false, false, callback);
+ }
+
+ self.sendTimerOutputModes = function(callback) {
+ var nextFunction = send_next_output_mode;
+ var idIndex = 0;
+
+ var overrideIds = OUTPUT_MAPPING.getUsedTimerIds();
+
+ if (overrideIds.length == 0) {
+ onCompleteCallback();
+ } else {
+ send_next_output_mode();
+ }
+
+ function send_next_output_mode() {
+
+ var timerId = overrideIds[idIndex];
+
+ var outputMode = OUTPUT_MAPPING.getTimerOverride(timerId);
+
+ var buffer = [];
+ buffer.push(timerId);
+ buffer.push(outputMode);
+
+ // prepare for next iteration
+ idIndex++;
+ if (idIndex == overrideIds.length) {
+ nextFunction = callback;
+
+ }
+ MSP.send_message(MSPCodes.MSP2_INAV_SET_TIMER_OUTPUT_MODE, buffer, false, nextFunction);
+ }
+
+ }
+
self.loadBatteryConfig = function (callback) {
MSP.send_message(MSPCodes.MSPV2_BATTERY_CONFIG, false, false, callback);
};
@@ -3023,7 +3160,7 @@ var mspHelper = (function (gui) {
if (waypointId < MISSION_PLANNER.getCountBusyPoints()) {
MSP.send_message(MSPCodes.MSP_WP, [waypointId], false, loadWaypoint);
} else {
- GUI.log('Receive time: ' + (new Date().getTime() - startTime) + 'ms');
+ GUI.log(chrome.i18n.getMessage('ReceiveTime') + (new Date().getTime() - startTime) + 'ms');
MSP.send_message(MSPCodes.MSP_WP, [waypointId], false, callback);
}
};
@@ -3045,7 +3182,7 @@ var mspHelper = (function (gui) {
};
function endMission() {
- GUI.log('Send time: ' + (new Date().getTime() - startTime) + 'ms');
+ GUI.log(chrome.i18n.getMessage('SendTime') + (new Date().getTime() - startTime) + 'ms');
MSP.send_message(MSPCodes.MSP_WP_GETINFO, false, false, callback);
}
};
@@ -3363,6 +3500,22 @@ var mspHelper = (function (gui) {
MSP.send_message(MSPCodes.MSP2_INAV_SET_MC_BRAKING, mspHelper.crunch(MSPCodes.MSP2_INAV_SET_MC_BRAKING), false, callback);
};
+ self.loadRateDynamics = function (callback) {
+ MSP.send_message(MSPCodes.MSP2_INAV_RATE_DYNAMICS, false, false, callback);
+ }
+
+ self.saveRateDynamics = function (callback) {
+ MSP.send_message(MSPCodes.MSP2_INAV_SET_RATE_DYNAMICS, mspHelper.crunch(MSPCodes.MSP2_INAV_SET_RATE_DYNAMICS), false, callback);
+ }
+
+ self.loadEzTune = function (callback) {
+ MSP.send_message(MSPCodes.MSP2_INAV_EZ_TUNE, false, false, callback);
+ }
+
+ self.saveEzTune = function (callback) {
+ MSP.send_message(MSPCodes.MSP2_INAV_EZ_TUNE_SET, mspHelper.crunch(MSPCodes.MSP2_INAV_EZ_TUNE_SET), false, callback);
+ }
+
self.loadParameterGroups = function (callback) {
MSP.send_message(MSPCodes.MSP2_COMMON_PG_LIST, false, false, function (resp) {
var groups = [];
diff --git a/js/outputMapping.js b/js/outputMapping.js
index 41b3f134..683fed09 100644
--- a/js/outputMapping.js
+++ b/js/outputMapping.js
@@ -3,22 +3,63 @@
let OutputMappingCollection = function () {
let self = {},
- data = [];
+ data = [],
+ timerOverrides = {};
const TIM_USE_ANY = 0;
const TIM_USE_PPM = 0;
const TIM_USE_PWM = 1;
- const TIM_USE_MC_MOTOR = 2; // Multicopter motor output
- const TIM_USE_MC_SERVO = 3; // Multicopter servo output (i.e. TRI)
- const TIM_USE_MC_CHNFW = 4; // Deprecated and not used after removal of CHANNEL_FORWARDING feature
- const TIM_USE_FW_MOTOR = 5;
- const TIM_USE_FW_SERVO = 6;
+ const TIM_USE_MOTOR = 2; // Motor output
+ const TIM_USE_SERVO = 3; // Servo output (i.e. TRI)
+ //const TIM_USE_MC_CHNFW = 4; // Deprecated and not used after removal of CHANNEL_FORWARDING feature
+ //const TIM_USE_FW_MOTOR = 5;
+ //const TIM_USE_FW_SERVO = 6;
const TIM_USE_LED = 24;
const TIM_USE_BEEPER = 25;
const OUTPUT_TYPE_MOTOR = 0;
const OUTPUT_TYPE_SERVO = 1;
+ self.TIMER_OUTPUT_MODE_AUTO = 0;
+ self.TIMER_OUTPUT_MODE_MOTORS = 1;
+ self.TIMER_OUTPUT_MODE_SERVOS = 2;
+
+ self.flushTimerOverrides = function() {
+ timerOverrides = {};
+ }
+
+ self.setTimerOverride = function (timer, outputMode) {
+ timerOverrides[timer] = outputMode;
+ }
+
+ self.getTimerOverride = function (timer) {
+ return timerOverrides[timer];
+ }
+
+ self.getTimerColor = function (timer) {
+ let timerIndex = OUTPUT_MAPPING.getUsedTimerIds().indexOf(String(timer));
+
+ return GUI.colorTable[timerIndex % GUI.colorTable.length];
+ }
+
+ self.getOutputTimerColor = function (output) {
+ let timerId = OUTPUT_MAPPING.getTimerId(output);
+
+ return self.getTimerColor(timerId);
+ }
+
+ self.getUsedTimerIds = function (timer) {
+ let used = {};
+ let outputCount = self.getOutputCount();
+
+ for (let i = 0; i < outputCount; ++i) {
+ let timerId = self.getTimerId(i);
+ used[timerId] = 1;
+ }
+
+ return Object.keys(used).sort((a, b) => a - b);
+ }
+
function getTimerMap(isMR, motors, servos) {
let timerMap = [],
motorsToGo = motors,
@@ -27,24 +68,13 @@ let OutputMappingCollection = function () {
for (let i = 0; i < data.length; i++) {
timerMap[i] = null;
- if (isMR) {
- if (servosToGo > 0 && bit_check(data[i], TIM_USE_MC_SERVO)) {
- servosToGo--;
- timerMap[i] = OUTPUT_TYPE_SERVO;
- } else if (motorsToGo > 0 && bit_check(data[i], TIM_USE_MC_MOTOR)) {
- motorsToGo--;
- timerMap[i] = OUTPUT_TYPE_MOTOR;
- }
- } else {
- if (servosToGo > 0 && bit_check(data[i], TIM_USE_FW_SERVO)) {
- servosToGo--;
- timerMap[i] = OUTPUT_TYPE_SERVO;
- } else if (motorsToGo > 0 && bit_check(data[i], TIM_USE_FW_MOTOR)) {
- motorsToGo--;
- timerMap[i] = OUTPUT_TYPE_MOTOR;
- }
+ if (servosToGo > 0 && bit_check(data[i]['usageFlags'], TIM_USE_SERVO)) {
+ servosToGo--;
+ timerMap[i] = OUTPUT_TYPE_SERVO;
+ } else if (motorsToGo > 0 && bit_check(data[i]['usageFlags'], TIM_USE_MOTOR)) {
+ motorsToGo--;
+ timerMap[i] = OUTPUT_TYPE_MOTOR;
}
-
}
return timerMap;
@@ -70,7 +100,6 @@ let OutputMappingCollection = function () {
outputMap[i] = "Servo " + servos[currentServoIndex];
currentServoIndex++;
}
-
}
return outputMap;
@@ -89,10 +118,8 @@ let OutputMappingCollection = function () {
for (let i = 0; i < data.length; i++) {
if (
- bit_check(data[i], TIM_USE_MC_MOTOR) ||
- bit_check(data[i], TIM_USE_MC_SERVO) ||
- bit_check(data[i], TIM_USE_FW_MOTOR) ||
- bit_check(data[i], TIM_USE_FW_SERVO)
+ bit_check(data[i]['usageFlags'], TIM_USE_MOTOR) ||
+ bit_check(data[i]['usageFlags'], TIM_USE_SERVO)
) {
retVal++;
};
@@ -104,10 +131,8 @@ let OutputMappingCollection = function () {
function getFirstOutputOffset() {
for (let i = 0; i < data.length; i++) {
if (
- bit_check(data[i], TIM_USE_MC_MOTOR) ||
- bit_check(data[i], TIM_USE_MC_SERVO) ||
- bit_check(data[i], TIM_USE_FW_MOTOR) ||
- bit_check(data[i], TIM_USE_FW_SERVO)
+ bit_check(data[i]['usageFlags'], TIM_USE_MOTOR) ||
+ bit_check(data[i]['usageFlags'], TIM_USE_SERVO)
) {
return i;
}
@@ -115,6 +140,10 @@ let OutputMappingCollection = function () {
return 0;
}
+ function getTimerId(outputIndex) {
+ return data[outputIndex]['timerId'];
+ }
+
function getOutput(servoIndex, bit) {
let offset = getFirstOutputOffset();
@@ -122,7 +151,7 @@ let OutputMappingCollection = function () {
let lastFound = 0;
for (let i = offset; i < data.length; i++) {
- if (bit_check(data[i], bit)) {
+ if (bit_check(data[i]['usageFlags'], bit)) {
if (lastFound == servoIndex) {
return i - offset + 1;
} else {
@@ -134,12 +163,16 @@ let OutputMappingCollection = function () {
return null;
}
+ self.getTimerId = function(outputIndex) {
+ return getTimerId(outputIndex)
+ }
+
self.getFwServoOutput = function (servoIndex) {
- return getOutput(servoIndex, TIM_USE_FW_SERVO);
+ return getOutput(servoIndex, TIM_USE_SERVO);
};
self.getMrServoOutput = function (index) {
- return getOutput(index, TIM_USE_MC_SERVO);
+ return getOutput(index, TIM_USE_SERVO);
};
return self;
diff --git a/js/protocols/stm32.js b/js/protocols/stm32.js
index eabce18a..45e74cd9 100644
--- a/js/protocols/stm32.js
+++ b/js/protocols/stm32.js
@@ -81,7 +81,7 @@ STM32_protocol.prototype.connect = function (port, baud, hex, options, callback)
self.initialize();
} else {
- GUI.log('Failed to open serial port');
+ GUI.log(chrome.i18n.getMessage('failedToOpenSerialPort'));
}
});
} else {
@@ -108,7 +108,7 @@ STM32_protocol.prototype.connect = function (port, baud, hex, options, callback)
retries++;
if (retries > maxRetries) {
clearInterval(interval);
- GUI.log('Failed to flash ' + port);
+ GUI.log(chrome.i18n.getMessage('failedToFlash') + port);
}
}
// Check for DFU devices
@@ -145,7 +145,7 @@ STM32_protocol.prototype.connect = function (port, baud, hex, options, callback)
});
});
} else {
- GUI.log('Failed to open serial port');
+ GUI.log(chrome.i18n.getMessage('failedToOpenSerialPort'));
}
});
}
diff --git a/js/serial_backend.js b/js/serial_backend.js
index ec813bf3..827169f6 100755
--- a/js/serial_backend.js
+++ b/js/serial_backend.js
@@ -257,6 +257,7 @@ function onValidFirmware()
$('#tabs ul.mode-connected .tab_setup a').click();
+ updateEzTuneTabVisibility(true);
updateFirmwareVersion();
});
});
diff --git a/js/servoMixerRuleCollection.js b/js/servoMixerRuleCollection.js
index 8c3399a2..6f2b701c 100644
--- a/js/servoMixerRuleCollection.js
+++ b/js/servoMixerRuleCollection.js
@@ -5,6 +5,7 @@ let ServoMixerRuleCollection = function () {
let self = {},
data = [],
+ inactiveData = [],
maxServoCount = 16;
self.setServoCount = function (value) {
@@ -20,7 +21,11 @@ let ServoMixerRuleCollection = function () {
}
self.put = function (element) {
- data.push(element);
+ if (data.length < self.getServoRulesCount()) {
+ data.push(element);
+ }else{
+ inactiveData.push(element); //store the data for mixer_profile 2
+ }
};
self.get = function () {
@@ -34,18 +39,24 @@ let ServoMixerRuleCollection = function () {
self.flush = function () {
data = [];
+ inactiveData = [];
};
self.cleanup = function () {
var tmpData = [];
-
+ var tmpInactiveData = [];
data.forEach(function (element) {
if (element.isUsed()) {
tmpData.push(element);
}
});
-
+ inactiveData.forEach(function (element) {
+ if (element.isUsed()) {
+ tmpInactiveData.push(element);
+ }
+ });
data = tmpData;
+ inactiveData = tmpInactiveData;
};
self.inflate = function () {
@@ -69,6 +80,15 @@ let ServoMixerRuleCollection = function () {
}
}
}
+ for (let ruleIndex in inactiveData) {
+ if (inactiveData.hasOwnProperty(ruleIndex)) {
+ let rule = inactiveData[ruleIndex];
+
+ if (rule.getTarget() == servoId && rule.isUsed()) {
+ return true;
+ }
+ }
+ }
return false;
};
@@ -106,12 +126,17 @@ let ServoMixerRuleCollection = function () {
out.push(rule.getTarget());
}
}
+ for (let ruleIndex in inactiveData) {
+ if (inactiveData.hasOwnProperty(ruleIndex)) {
+ let rule = inactiveData[ruleIndex];
+ out.push(rule.getTarget());
+ }
+ }
- let unique = [...new Set(out)];
- return unique.sort(function(a, b) {
- return a-b;
- });
+ let minIndex = Math.min(...out);
+ let maxIndex = Math.max(...out);
+ return Array.from({ length: maxIndex - minIndex + 1 }, (_, index) => minIndex + index);
}
self.getNextUnusedIndex = function() {
diff --git a/js/settings.js b/js/settings.js
index 5d1199d3..a2985235 100644
--- a/js/settings.js
+++ b/js/settings.js
@@ -85,88 +85,7 @@ var Settings = (function () {
input.attr('maxlength', s.setting.max);
} else if (input.data('presentation') == 'range') {
- let scaledMax;
- let scaledMin;
- let scalingThreshold;
-
- if (input.data('normal-max')) {
- scaledMax = s.setting.max * 2;
- scalingThreshold = Math.round(scaledMax * 0.8);
- scaledMin = s.setting.min *2;
- } else {
- scaledMax = s.setting.max;
- scaledMin = s.setting.min;
- scalingThreshold = scaledMax;
- }
-
-
- let $range = $('');
- if (input.data('step')) {
- $range.attr('step', input.data('step'));
- }
- $range.css({
- 'display': 'block',
- 'flex-grow': 100,
- 'margin-left': '1em',
- 'margin-right': '1em',
- });
-
- input.attr('min', s.setting.min);
- input.attr('max', s.setting.max);
- input.val(parseInt(s.value));
- input.css({
- 'width': 'auto',
- 'min-width': '75px',
- });
-
- input.parent().css({
- 'display': 'flex',
- 'width': '100%'
- });
- $range.insertAfter(input);
-
- input.parent().find('.helpicon').css({
- 'top': '5px',
- 'left': '-10px'
- });
-
- /*
- * Update slider to input
- */
- $range.on('input', function() {
- let val = $(this).val();
- let normalMax = parseInt(input.data('normal-max'));
-
- if (normalMax) {
- if (val <= scalingThreshold) {
- val = scaleRangeInt(val, scaledMin, scalingThreshold, s.setting.min, normalMax);
- } else {
- val = scaleRangeInt(val, scalingThreshold + 1, scaledMax, normalMax + 1, s.setting.max);
- }
- }
-
- input.val(val);
- });
-
- input.on('change', function() {
-
- let val = $(this).val();
- let newVal;
- let normalMax = parseInt(input.data('normal-max'));
- if (normalMax) {
- if (val <= normalMax) {
- newVal = scaleRangeInt(val, s.setting.min, normalMax, scaledMin, scalingThreshold);
- } else {
- newVal = scaleRangeInt(val, normalMax + 1, s.setting.max, scalingThreshold + 1, scaledMax);
- }
- } else {
- newVal = val;
- }
-
- $range.val(newVal);
- });
-
- input.trigger('change');
+ GUI.sliderize(input, s.value, s.setting.min, s.setting.max);
} else if (s.setting.type == 'float') {
input.attr('type', 'number');
diff --git a/main.css b/main.css
index f7b06f7c..01065766 100644
--- a/main.css
+++ b/main.css
@@ -60,6 +60,10 @@ a.disabled {
transition: none;
}
+.inputRequiredWarning {
+ border: 3px solid #d40000 !important;
+}
+
.cf_doc_version_bt a {
padding: 1px 9px 1px 9px;
margin-top: -45px;
@@ -1639,7 +1643,7 @@ dialog {
/* fixing padding for all Tabs*/
.tab-setup, .tab-landing, .tab-adjustments, .tab-auxiliary, .tab-cli, .tab-configuration, .tab-failsafe, .tab-onboard_logging,
.tab-firmware_flasher, .tab-gps, .tab-magnetometer, .tab-help, .tab-led-strip, .tab-logging, .tab-modes, .tab-motors, .tab-pid_tuning,
-.tab-ports, .tab-receiver, .tab-sensors, .tab-servos, .tab-osd, .tab-calibration {
+.tab-ports, .tab-receiver, .tab-sensors, .tab-servos, .tab-osd, .tab-calibration, .tab-ez_tune {
height: 100%;
position: relative;
}
@@ -1681,7 +1685,7 @@ dialog {
color: white;
font-size: 10px;
margin-top: 20px;
- width: 269px;
+ width: 410px;
float: right;
margin-right: 10px;
line-height: 12px;
@@ -1696,6 +1700,15 @@ dialog {
}
+#mixer_profile_change {
+ color: white;
+ margin-top: 16px;
+ width: 130px;
+ float: left;
+ margin-right: 10px;
+ line-height: 12px;
+}
+
#profile_change {
color: white;
margin-top: 16px;
@@ -2271,3 +2284,11 @@ ol li {
.controlProfileHighlightActive {
background-color: #d5ebfe !important ;
}
+
+.no-border {
+ border: none !important;
+}
+
+.bold {
+ font-weight: bold;
+}
\ No newline at end of file
diff --git a/main.html b/main.html
index b6cd569f..92c89a58 100755
--- a/main.html
+++ b/main.html
@@ -23,11 +23,11 @@