diff --git a/README.md b/README.md
index f1a4e601..906dbfab 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,18 @@ It runs as an app within Google Chrome and allows you to configure the INAV soft
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).
+
+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:
+
+* [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?
You have to remove `C:\Users%Your_UserNname%\AppData\Local\inav-configurator` folder and all its content.
@@ -42,11 +54,7 @@ Depending on target operating system, _INAV Configurator_ is distributed as _sta
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
-### ChromeOS
-
-**INAV Configurator** form ChromeOS is available in [Chrome Web Store](https://chrome.google.com/webstore/detail/inav-configurator/fmaidjmgkdkpafmbnmigkpdnpdhopgel)
-
-### Building and running INAV Configurator locally (for development or Linux users)
+## Building and running INAV Configurator locally (for development or Linux users)
For local development, **node.js** build system is used.
@@ -68,7 +76,13 @@ in the `./dist/` directory.
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.
- To build a specific release, use the command `release --platform="win64"` for example.
+To build a specific release, use the command `release --platform="win64"` for example.
+
+### Running with debug | Inspector
+
+To be able to open Inspector, you will need SDK flavours of NW.js
+
+`npm install nw@0.61.0 --nwjs_build_type=sdk`
## Different map providers
@@ -103,15 +117,6 @@ INAV Configurator is shipped **WITHOUT** API key for Bing Maps. That means: ever
1. Enter MapProxy service layer (inav_layer if configured from MAPPROXY.md)
1. Once completed, you can zoom in on area you will be flying in while connected to the internet in either GPS or Mission Control tab to save the cache for offline use
-## Authors
-
-Konstantin Sharlaimov/DigitalEntity - maintainer of the INAV firmware and configurator.
-
-INAV Configurator was originally a [fork](#credits) of Cleanflight Configurator with support for INAV instead of Cleanflight.
-
-This configurator is the only configurator with support for INAV specific features. It will likely require that you run the latest firmware on the flight controller.
-If you are experiencing any problems please make sure you are running the [latest firmware version](https://github.com/iNavFlight/inav/releases).
-
## Notes
### WebGL
@@ -123,14 +128,6 @@ Make sure Settings -> System -> "User hardware acceleration when available" is c
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
-## Support
-
-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:
-
-* [rcgroups main thread](https://www.rcgroups.com/forums/showthread.php?2495732-Cleanflight-iNav-(navigation-rewrite)-project)
-* [Telegram Group](https://t.me/INAVFlight)
-
## Issue trackers
For INAV configurator issues raise them here
@@ -144,8 +141,3 @@ https://github.com/iNavFlight/inav/issues
## Developers
We accept clean and reasonable patches, submit them!
-
-## Credits
-
-ctn - primary author and maintainer of Baseflight Configurator.
-Hydra - author and maintainer of Cleanflight Configurator from which this project was forked.
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 5133288c..964fcf2e 100755
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -871,79 +871,79 @@
"message": "Fixed Wing Auto Launch Settings"
},
"configurationLaunchVelocity": {
- "message": "Threshold Velocity [cm/s]"
+ "message": "Threshold Velocity"
},
"configurationLaunchVelocityHelp": {
"message": "Forward velocity threshold for swing-launch detection. Default: 300 [100-10000]"
},
"configurationLaunchAccel": {
- "message": "Threshold Acceleration [cm/s/s]"
+ "message": "Threshold Acceleration"
},
"configurationLaunchAccelHelp": {
"message": "Forward acceleration threshold for bungee launch or throw launch, 1G = 981 cm/s/s. Default: 1863 [1000-20000]"
},
"configurationLaunchMaxAngle": {
- "message": "Max Throw Angle [°]"
+ "message": "Max Throw Angle"
},
"configurationLaunchMaxAngleHelp": {
"message": "Max throw angle (pitch/roll combined) to consider launch successful. Set to 180 to disable completely. Default: 45 [5-180]"
},
"configurationLaunchDetectTime": {
- "message": "Detect Time [ms]"
+ "message": "Detect Time"
},
"configurationLaunchDetectTimeHelp": {
"message": "Time for which thresholds have to breached to consider launch happened. Default: 40 [10-1000]"
},
"configurationLaunchThr": {
- "message": "Launch Throttle [uS]"
+ "message": "Launch Throttle"
},
"configurationLaunchThrHelp": {
"message": "Launch throttle - throttle to be set during launch sequence. Default: 1700 [1000-2000]"
},
"configurationLaunchIdleThr": {
- "message": "Idle Throttle [uS]"
+ "message": "Idle Throttle"
},
"configurationLaunchIdleThrHelp": {
"message": "Idle throttle - throttle to be set before launch sequence is initiated. If set below minimum throttle it will force motor stop or at idle throttle (depending if the MOTOR_STOP is enabled). If set above minimum throttle it will force throttle to this value (if MOTOR_STOP is enabled it will be handled according to throttle stick position). Default: 1000 [1000-2000]"
},
"configurationLaunchMotorDelay": {
- "message": "Motor Delay [ms]"
+ "message": "Motor Delay"
},
"configurationLaunchMotorDelayHelp": {
"message": "Delay between detected launch and launch sequence start and throttling up. Default: 500 [0-5000]"
},
"configurationLaunchSpinupTime": {
- "message": "Motor Spinup Time [ms]"
+ "message": "Motor Spinup Time"
},
"configurationLaunchSpinupTimeHelp": {
"message": "Time to bring power from minimum throttle to nav_fw_launch_thr, to avoid big stress on ESC and large torque from propeller. Default: 100 [0-1000]"
},
"configurationLaunchMinTime": {
- "message": "Minimum Launch Time [ms]"
+ "message": "Minimum Launch Time"
},
"configurationLaunchMinTimeHelp": {
"message": "Allow launch mode to execute at least this time [ms] and ignore stick movements. Default: 0 [0-60000]"
},
"configurationLaunchTimeout": {
- "message": "Launch Timeout [ms]"
+ "message": "Launch Timeout"
},
"configurationLaunchTimeoutHelp": {
"message": "Maximum time for launch sequence to be executed. After this time LAUNCH mode will be turned off and regular flight mode will take over. Default: 5000 [0-60000]"
},
"configurationLaunchEndTime": {
- "message": "End Transition Time [ms]"
+ "message": "End Transition Time"
},
"configurationLaunchEndTimeHelp": {
"message": "Smooth transition time at the end of the launch (ms). This is added to the Launch Timeout. Default: 2000 [0-5000]"
},
"configurationLaunchMaxAltitude": {
- "message": "Maximum Altitude [cm]"
+ "message": "Maximum Altitude"
},
"configurationLaunchMaxAltitudeHelp": {
"message": "Altitude at which LAUNCH mode will be turned off and regular flight mode will take over. Default: 0 [0-60000]"
},
"configurationLaunchClimbAngle": {
- "message": "Climb Angle [°]"
+ "message": "Climb Angle"
},
"configurationLaunchClimbAngleHelp": {
"message": "Climb angle (attitude of model, not climb slope) for launch sequence (degrees), is also restrained by global max_angle_inclination_pit. Default: 18 [5-45]"
@@ -973,7 +973,7 @@
"message": "Cycles/Sec (Hz)"
},
"configurationGPS": {
- "message": "GPS"
+ "message": "Configuration"
},
"configurationGPSProtocol": {
"message": "Protocol"
@@ -1624,10 +1624,10 @@
"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": "GPS"
+ "message": "Position"
},
"gpsStatHead": {
- "message": "GPS Statistics"
+ "message": "Statistics"
},
"gpsMapHead": {
"message": "Current GPS location"
@@ -2126,7 +2126,7 @@
"message": "Note: When Stage 2 is DISABLED, the fallback setting Auto is used instead of the user settings for all flightchannels (Roll, Pitch, Yaw and Throttle)."
},
"failsafeDelayItem": {
- "message": "Guard time for activation after signal lost [1 = 0.1 sec.]"
+ "message": "Guard time for activation after signal lost [For deciseconds (ds): 1 = 0.1 sec.]"
},
"failsafeDelayHelp": {
"message": "Time for stage 1 to wait for recovery"
@@ -2135,7 +2135,7 @@
"message": "Throttle value used while landing"
},
"failsafeOffDelayItem": {
- "message": "Delay for turning off the Motors during Failsafe [1 = 0.1 sec.]"
+ "message": "Delay for turning off the Motors during Failsafe [For deciseconds (ds):1 = 0.1 sec.]"
},
"failsafeOffDelayHelp": {
"message": "Time to stay in landing mode untill the motors are turned off and the craft is disarmed"
@@ -2510,16 +2510,16 @@
"message": "User Control Mode"
},
"posholdDefaultSpeed": {
- "message": "Default navigation speed [cm/s]"
+ "message": "Default navigation speed"
},
"posholdDefaultSpeedHelp": {
"message": "Default speed during RTH, also used for WP navigation if no speed set for WP leg. Limited to Max. navigation speed"
},
"posholdMaxSpeed": {
- "message": "Max. navigation speed [cm/s]"
+ "message": "Max. navigation speed"
},
"posholdMaxManualSpeed": {
- "message": "Max. CRUISE speed [cm/s]"
+ "message": "Max. CRUISE speed"
},
"posholdMaxManualSpeedHelp": {
"message": "Maximum horizonal velocity allowed for pilot manual control during POSHOLD/CRUISE mode"
@@ -2531,7 +2531,7 @@
"message": "Max. ALTHOLD climb rate [cm/s]"
},
"posholdMaxBankAngle": {
- "message": "Multirotor max. banking angle [degrees]"
+ "message": "Multirotor max. banking angle"
},
"posholdMaxBankAngleHelp": {
"message": "Maximum banking angle in navigation modes. Constrained by maximum ROLL angle in PID tuning tab."
@@ -2588,7 +2588,7 @@
"message": "Automatic landing settings"
},
"minRthDistance": {
- "message": "Min. RTH distance [cm]"
+ "message": "Min. RTH distance"
},
"minRthDistanceHelp": {
"message": "If UAV is within this distance from the home point, it will land instead of RTH then land"
@@ -2618,19 +2618,19 @@
"message": "RTH altitude mode"
},
"rthAbortThreshold": {
- "message": "RTH abort threshold [cm]"
+ "message": "RTH abort threshold"
},
"rthAbortThresholdHelp": {
"message": "RTH sanity checking feature will notice if the distance to home is increasing during RTH and if it exceeds the threshold defined by this parameter, instead of continuing RTH the UAV will enter emergency landing. Default is 500m which is safe enough for both multirotors and airplanes."
},
"rthAltitude": {
- "message": "RTH altitude [cm]"
+ "message": "RTH altitude"
},
"rthAltitudeHelp": {
"message": "Used in Extra, Fixed and 'At Least' RTH altitude modes"
},
"rthHomeAltitudeLabel": {
- "message": "RTH Home altitude [cm]"
+ "message": "RTH Home altitude"
},
"rthHomeAltitudeHelp": {
"message": "Used when not landing at the home point. Upon arriving at home, the plane will loiter and change altitude to the RTH Home Altitude. Default is 0, which is feature disabled."
@@ -2657,7 +2657,7 @@
"message": "Final approach altitude. Altitude under which the aircraft will go down at Final landing speed until touchdown"
},
"emergencyDescentRate": {
- "message": "Emergency landing speed [cm/s]"
+ "message": "Emergency landing speed"
},
"cruiseThrottle": {
"message": "Cruise throttle"
@@ -2681,31 +2681,31 @@
"message": "Max. throttle"
},
"maxBankAngle": {
- "message": "Max. navigation bank angle [degrees]"
+ "message": "Max. navigation bank angle"
},
"maxBankAngleHelp": {
"message": "Maximum banking angle in navigation modes. Constrained by maximum ROLL angle in PID tuning tab."
},
"maxClimbAngle": {
- "message": "Max. navigation climb angle [degrees]"
+ "message": "Max. navigation climb angle"
},
"maxClimbAngleHelp": {
"message": "Maximum climb angle in navigation modes. Constrained by maximum PITCH angle in PID tuning tab."
},
"navManualClimbRate": {
- "message": "Max. Alt-hold climb rate [cm/s]"
+ "message": "Max. Alt-hold climb rate"
},
"navManualClimbRateHelp": {
"message": "Maximum climb/descent rate firmware is allowed when processing pilot input for ALTHOLD control mode [cm/s]"
},
"navAutoClimbRate": {
- "message": "Max. navigation climb rate [cm/s]"
+ "message": "Max. navigation climb rate"
},
"navAutoClimbRateHelp": {
"message": "Maximum climb/descent rate that UAV is allowed to reach during navigation modes. [cm/s]"
},
"maxDiveAngle": {
- "message": "Max. navigation dive angle [degrees]"
+ "message": "Max. navigation dive angle"
},
"maxDiveAngleHelp": {
"message": "Maximum dive angle in navigation modes. Constrained by maximum PITCH angle in PID tuning tab."
@@ -2723,13 +2723,13 @@
"message": "How smoothly the autopilot adjusts the throttle level in response to pitch angle changes [0-9]."
},
"pitchToThrottleThreshold": {
- "message": "Instantaneous throttle adjustment threshold [centidegrees]"
+ "message": "Instantaneous throttle adjustment threshold"
},
"pitchToThrottleThresholdHelp": {
"message": "The autopilot will instantly adjust the throttle level without smoothing according to pitch to throttle if the pitch angle is more this many centidegrees from the filtered value."
},
"loiterRadius": {
- "message": "Loiter radius [cm]"
+ "message": "Loiter radius"
},
"loiterDirectionLabel": {
"message": "Loiter direction"
@@ -2747,25 +2747,25 @@
"message": "Battery Estimation Settings"
},
"idlePower": {
- "message": "Idle power [cW]"
+ "message": "Idle power"
},
"idlePowerHelp": {
"message": "Power draw at zero throttle used for remaining flight time/distance estimation in 0.01W unit"
},
"cruisePower": {
- "message": "Cruise power [cW]"
+ "message": "Cruise power"
},
"cruisePowerHelp": {
"message": "Power draw at cruise throttle used for remaining flight time/distance estimation in 0.01W unit"
},
"cruiseSpeed": {
- "message": "Cruise speed [cm/s]"
+ "message": "Cruise speed"
},
"cruiseSpeedHelp": {
"message": "Speed for the plane/wing at cruise throttle used for remaining flight time/distance estimation in cm/s"
},
"rthEnergyMargin": {
- "message": "RTH energy margin [%]"
+ "message": "RTH energy margin"
},
"rthEnergyMarginHelp": {
"message": "Energy margin wanted after getting home (percent of battery energy capacity). Use for the remaining flight time/distance calculation."
@@ -2777,13 +2777,13 @@
"message": "Waypoint Navigation Settings"
},
"waypointRadius": {
- "message": "Waypoint radius [cm]"
+ "message": "Waypoint radius"
},
"waypointRadiusHelp": {
"message": "This sets the distance away from a waypoint that triggers the waypoint as reached."
},
"waypointSafeDistance": {
- "message": "Waypoint safe distance [cm]."
+ "message": "Waypoint safe distance"
},
"waypointSafeDistanceHelp": {
"message": "The maximum distance between the home point and the first waypoint."
@@ -2894,16 +2894,16 @@
"message": "Fly Time (minutes)"
},
"osd_alt_alarm": {
- "message": "Altitude (meters)"
+ "message": "Altitude"
},
"osd_dist_alarm": {
- "message": "Distance (meters)"
+ "message": "Distance"
},
"osdAlarmDIST_HELP": {
"message": "The distance to home indicator will flash when the distance is greater than this value. Zero disables this alarm."
},
"osd_neg_alt_alarm": {
- "message": "Negative Altitude (meters)"
+ "message": "Negative Altitude"
},
"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."
@@ -3710,49 +3710,49 @@
"message": "Distance to home"
},
"brakingSpeedThreshold": {
- "message": "Min. speed threshold [cm/s]"
+ "message": "Min. speed threshold"
},
"brakingSpeedThresholdTip": {
"message": "Braking will be enabled only if actual speed if higher than threshold"
},
"brakingDisengageSpeed": {
- "message": "Braking disengage speed [cm/s]"
+ "message": "Braking disengage speed"
},
"brakingDisengageSpeedTip": {
"message": "Braking will end when speed goes below this value"
},
"brakingTimeout": {
- "message": "Max. braking duration [ms]"
+ "message": "Max. braking duration"
},
"brakingTimeoutTip": {
"message": "Safety measure. This is the longest period of time braking can be active."
},
"brakingBoostFactor": {
- "message": "Boost factor [%]"
+ "message": "Boost factor"
},
"brakingBoostFactorTip": {
"message": "Defines how strong the braking boost will be. 100% means the navigation engine is allowed to double the banking speed and acceleration"
},
"brakingBoostTimeout": {
- "message": "Max. braking boost duration [ms]"
+ "message": "Max. braking boost duration"
},
"brakingBoostTimeoutTip": {
"message": "Safety measure. This is the longest period of time braking boost can be active."
},
"brakingBoostSpeedThreshold": {
- "message": "Boost min. speed threshold [cm/s]"
+ "message": "Boost min. speed threshold"
},
"brakingBoostSpeedThresholdTip": {
"message": "Braking boost will be enabled only if actual speed if higher than threshold"
},
"brakingBoostDisengageSpeed": {
- "message": "Braking boost disengage speed [cm/s]"
+ "message": "Braking boost disengage speed"
},
"brakingBoostDisengageSpeedTip": {
"message": "Braking boost will end when speed goes below this value"
},
"brakingBankAngle": {
- "message": "Max. bank angle [degrees]"
+ "message": "Max. bank angle"
},
"brakingBankAngleTip": {
"message": "Max bank angle allowed during braking phase"
diff --git a/js/defaults_dialog.js b/js/defaults_dialog.js
index b3a978c9..50a28108 100644
--- a/js/defaults_dialog.js
+++ b/js/defaults_dialog.js
@@ -1,4 +1,4 @@
-/*global mspHelper,$,GUI,MSP,BF_CONFIG,chrome*/
+/*global mspHelper,$,GUI,MSP,chrome*/
'use strict';
var helper = helper || {};
@@ -733,7 +733,7 @@ helper.defaultsDialog = (function () {
savingDefaultsModal.close();
}
- mspHelper.loadBfConfig(function () {
+ mspHelper.loadFeatures(function () {
privateScope.setFeaturesBits(selectedDefaultPreset)
});
} else {
diff --git a/js/fc.js b/js/fc.js
index 26a638d2..697f9398 100644
--- a/js/fc.js
+++ b/js/fc.js
@@ -2,7 +2,6 @@
// define all the global variables that are uses to hold FC state
var CONFIG,
- BF_CONFIG,
LED_STRIP,
LED_COLORS,
LED_MODE_COLORS,
@@ -63,7 +62,10 @@ var CONFIG,
OUTPUT_MAPPING,
SETTINGS,
BRAKING_CONFIG,
- SAFEHOMES;
+ SAFEHOMES,
+ BOARD_ALIGNMENT,
+ CURRENT_METER_CONFIG,
+ FEATURES;
var FC = {
MAX_SERVO_RATE: 125,
@@ -127,21 +129,25 @@ var FC = {
name: ''
};
- BF_CONFIG = {
- mixerConfiguration: 0,
- features: 0,
- serialrx_type: 0,
- board_align_roll: 0,
- board_align_pitch: 0,
- board_align_yaw: 0,
- currentscale: 0,
- currentoffset: 0
+ BOARD_ALIGNMENT = {
+ roll: 0,
+ pitch: 0,
+ yaw: 0
+ };
+
+ CURRENT_METER_CONFIG = {
+ scale: 0,
+ offset: 0,
+ type: 0,
+ capacity: 0
};
LED_STRIP = [];
LED_COLORS = [];
LED_MODE_COLORS = [];
+ FEATURES = 0;
+
PID = {
};
@@ -576,7 +582,7 @@ var FC = {
{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: 'gps', name: 'GPS', haveTip: true},
+ {bit: 7, group: 'other', name: 'GPS', haveTip: true},
{bit: 10, group: 'other', name: 'TELEMETRY', showNameInTip: true},
{bit: 11, group: 'batteryCurrent', name: 'CURRENT_METER'},
{bit: 12, group: 'other', name: 'REVERSIBLE_MOTORS', showNameInTip: true},
@@ -606,7 +612,7 @@ var FC = {
features = this.getFeatures();
}
for (var i = 0; i < features.length; i++) {
- if (features[i].name == featureName && bit_check(BF_CONFIG.features, features[i].bit)) {
+ if (features[i].name == featureName && bit_check(FEATURES, features[i].bit)) {
return true;
}
}
diff --git a/js/feature_framework.js b/js/feature_framework.js
index 87375d8b..6c6fe007 100644
--- a/js/feature_framework.js
+++ b/js/feature_framework.js
@@ -1,4 +1,4 @@
-/*global mspHelper,BF_CONFIG*/
+/*global mspHelper,FEATURES,bit_clear,bit_set*/
'use strict';
var helper = helper || {};
@@ -67,20 +67,20 @@ helper.features = (function() {
publicScope.execute = function(callback) {
exitPoint = callback;
- mspHelper.loadBfConfig(privateScope.setBits);
+ mspHelper.loadFeatures(privateScope.setBits);
};
privateScope.setBits = function () {
for (const bit of toSet) {
- BF_CONFIG.features = bit_set(BF_CONFIG.features, bit);
+ FEATURES = bit_set(FEATURES, bit);
}
for (const bit of toUnset) {
- BF_CONFIG.features = bit_clear(BF_CONFIG.features, bit);
+ FEATURES = bit_clear(FEATURES, bit);
}
- mspHelper.saveBfConfig(exitPoint);
+ mspHelper.saveFeatures(exitPoint);
}
return publicScope;
diff --git a/js/model.js b/js/model.js
index 273de731..c239acdf 100644
--- a/js/model.js
+++ b/js/model.js
@@ -44,6 +44,7 @@ const
// generate mixer
const mixerList = [
+ // ** Multirotor
{
id: 1,
name: 'Tricopter',
@@ -60,7 +61,7 @@ const mixerList = [
servoMixer: [
new ServoMixRule(SERVO_RUDDER, INPUT_STABILIZED_YAW, 100, 0),
]
- }, // 1
+ }, // 1
{
id: 3,
name: 'Quad X',
@@ -76,7 +77,7 @@ const mixerList = [
new MotorMixRule(1.0, 1.0, -1.0, -1.0), // FRONT_L
],
servoMixer: []
- }, // 3
+ }, // 3
{
id: 2,
name: 'Quad +',
@@ -92,7 +93,7 @@ const mixerList = [
new MotorMixRule(1.0, 0.0, -1.0, -1.0), // FRONT
],
servoMixer: []
- }, // 2
+ }, // 2
{
id: 4,
name: 'Bicopter',
@@ -103,18 +104,7 @@ const mixerList = [
platform: PLATFORM_MULTIROTOR,
motorMixer: [],
servoMixer: []
- }, // 4
- {
- id: 5,
- name: 'Gimbal',
- model: 'custom',
- image: 'custom',
- enabled: false,
- legacy: true,
- platform: PLATFORM_OTHER,
- motorMixer: [],
- servoMixer: []
- }, // 5
+ }, // 4
{
id: 6,
name: 'Y6',
@@ -132,7 +122,7 @@ const mixerList = [
new MotorMixRule(1.0, 1.0, -0.666667, 1.0), // UNDER_LEFT
],
servoMixer: []
- }, // 6
+ }, // 6
{
id: 7,
name: 'Hex +',
@@ -150,45 +140,7 @@ const mixerList = [
new MotorMixRule(1.0, 0.0, 1.0, -1.0), // REAR
],
servoMixer: []
- }, // 7
- {
- id: 8,
- name: 'Flying Wing',
- model: 'flying_wing',
- image: 'flying_wing',
- enabled: true,
- legacy: true,
- platform: PLATFORM_AIRPLANE,
- motorMixer: [
- new MotorMixRule(1.0, 0.0, 0.0, 0.0),
- new MotorMixRule(1.0, 0.0, 0.0, 0.0),
- ],
- servoMixer: [
- new ServoMixRule(SERVO_ELEVON_1, INPUT_STABILIZED_ROLL, 50, 0),
- new ServoMixRule(SERVO_ELEVON_1, INPUT_STABILIZED_PITCH, 50, 0),
- new ServoMixRule(SERVO_ELEVON_2, INPUT_STABILIZED_ROLL, -50, 0),
- new ServoMixRule(SERVO_ELEVON_2, INPUT_STABILIZED_PITCH, 50, 0),
- ]
- }, // 8
- {
- id: 27,
- name: 'Flying Wing with differential thrust',
- model: 'flying_wing',
- image: 'flying_wing',
- enabled: true,
- legacy: false,
- platform: PLATFORM_AIRPLANE,
- motorMixer: [
- new MotorMixRule(1.0, 0.0, 0.0, 0.1),
- new MotorMixRule(1.0, 0.0, 0.0, -0.1)
- ],
- servoMixer: [
- new ServoMixRule(SERVO_ELEVON_1, INPUT_STABILIZED_ROLL, 50, 0),
- new ServoMixRule(SERVO_ELEVON_1, INPUT_STABILIZED_PITCH, 50, 0),
- new ServoMixRule(SERVO_ELEVON_2, INPUT_STABILIZED_ROLL, -50, 0),
- new ServoMixRule(SERVO_ELEVON_2, INPUT_STABILIZED_PITCH, 50, 0),
- ]
- }, // 27
+ }, // 7
{
id: 9,
name: 'Y4',
@@ -204,7 +156,7 @@ const mixerList = [
new MotorMixRule(1.0, 1.0, -1.0, 0.0), // FRONT_L CW
],
servoMixer: []
- }, // 9
+ }, // 9
{
id: 10,
name: 'Hex X',
@@ -222,7 +174,7 @@ const mixerList = [
new MotorMixRule(1.0, 1.0, 0.0, 1.0), // LEFT
],
servoMixer: []
- }, // 10
+ }, // 10
{
id: 11,
name: 'Octo X8',
@@ -242,7 +194,7 @@ const mixerList = [
new MotorMixRule(1.0, 1.0, -1.0, 1.0), // UNDER_FRONT_L
],
servoMixer: []
- }, // 11
+ }, // 11
{
id: 12,
name: 'Octo Flat +',
@@ -262,7 +214,7 @@ const mixerList = [
new MotorMixRule(1.0, 1.0, 0.0, -1.0), // LEFT
],
servoMixer: []
- }, // 12
+ }, // 12
{
id: 13,
name: 'Octo Flat X',
@@ -282,51 +234,7 @@ const mixerList = [
new MotorMixRule(1.0, 1.0, 0.414178, -1.0), // MIDREAR_L
],
servoMixer: []
- }, // 13
- {
- id: 14,
- name: 'Airplane',
- model: 'twin_plane',
- image: 'airplane',
- enabled: true,
- legacy: true,
- platform: PLATFORM_AIRPLANE,
- hasFlaps: true,
- motorMixer: [
- new MotorMixRule(1.0, 0.0, 0.0, 0.0),
- new MotorMixRule(1.0, 0.0, 0.0, 0.0),
- ],
- servoMixer: [
- new ServoMixRule(SERVO_ELEVATOR, INPUT_STABILIZED_PITCH, 100, 0),
- new ServoMixRule(SERVO_FLAPPERON_1, INPUT_STABILIZED_ROLL, 100, 0),
- /*new ServoMixRule(SERVO_FLAPPERON_1, INPUT_FEATURE_FLAPS, 100, 0),*/
- new ServoMixRule(SERVO_FLAPPERON_2, INPUT_STABILIZED_ROLL, 100, 0),
- /*new ServoMixRule(SERVO_FLAPPERON_2, INPUT_FEATURE_FLAPS, -100, 0),*/
- new ServoMixRule(SERVO_RUDDER, INPUT_STABILIZED_YAW, 100, 0),
- ]
- }, // 14
- {
- id: 15,
- name: 'Heli 120',
- model: 'custom',
- image: 'custom',
- enabled: false,
- legacy: true,
- platform: PLATFORM_HELICOPTER,
- motorMixer: [],
- servoMixer: []
- }, // 15
- {
- id: 16,
- name: 'Heli 90',
- model: 'custom',
- image: 'custom',
- enabled: false,
- legacy: true,
- platform: PLATFORM_HELICOPTER,
- motorMixer: [],
- servoMixer: []
- }, // 16
+ }, // 13
{
id: 17,
name: 'V-tail Quad',
@@ -360,18 +268,7 @@ const mixerList = [
new MotorMixRule(1.0, 0.0, 0.0, 0.0), // LEFT
],
servoMixer: []
- }, // 18
- {
- id: 19,
- name: 'PPM to SERVO',
- model: 'custom',
- image: 'custom',
- enabled: false,
- legacy: true,
- platform: PLATFORM_OTHER,
- motorMixer: [],
- servoMixer: []
- }, // 19
+ }, // 18
{
id: 20,
name: 'Dualcopter',
@@ -382,7 +279,7 @@ const mixerList = [
platform: PLATFORM_MULTIROTOR,
motorMixer: [],
servoMixer: []
- }, // 20
+ }, // 20
{
id: 21,
name: 'Singlecopter',
@@ -393,7 +290,7 @@ const mixerList = [
platform: PLATFORM_MULTIROTOR,
motorMixer: [],
servoMixer: []
- }, // 21
+ }, // 21
{
id: 22,
name: 'A-tail Quad',
@@ -420,18 +317,7 @@ const mixerList = [
platform: PLATFORM_MULTIROTOR,
motorMixer: [],
servoMixer: []
- }, // 23
- {
- id: 24,
- name: 'Custom Airplane',
- model: 'twin_plane',
- image: 'airplane',
- enabled: false,
- legacy: true,
- platform: PLATFORM_AIRPLANE,
- motorMixer: [],
- servoMixer: []
- }, // 24
+ }, // 23
{
id: 25,
name: 'Custom Tricopter',
@@ -442,7 +328,67 @@ const mixerList = [
platform: PLATFORM_TRICOPTER,
motorMixer: [],
servoMixer: []
- }, // 25
+ }, // 25
+
+ // ** Fixed Wing **
+ {
+ id: 8,
+ name: 'Flying Wing',
+ model: 'flying_wing',
+ image: 'flying_wing',
+ enabled: true,
+ legacy: true,
+ platform: PLATFORM_AIRPLANE,
+ motorMixer: [
+ new MotorMixRule(1.0, 0.0, 0.0, 0.0),
+ ],
+ servoMixer: [
+ new ServoMixRule(SERVO_ELEVON_1, INPUT_STABILIZED_ROLL, 50, 0),
+ new ServoMixRule(SERVO_ELEVON_1, INPUT_STABILIZED_PITCH, 50, 0),
+ new ServoMixRule(SERVO_ELEVON_2, INPUT_STABILIZED_ROLL, -50, 0),
+ new ServoMixRule(SERVO_ELEVON_2, INPUT_STABILIZED_PITCH, 50, 0),
+ ]
+ }, // 8
+ {
+ id: 27,
+ name: 'Flying Wing with differential thrust',
+ model: 'flying_wing',
+ image: 'flying_wing',
+ enabled: true,
+ legacy: false,
+ platform: PLATFORM_AIRPLANE,
+ motorMixer: [
+ new MotorMixRule(1.0, 0.0, 0.0, 0.1),
+ new MotorMixRule(1.0, 0.0, 0.0, -0.1)
+ ],
+ servoMixer: [
+ new ServoMixRule(SERVO_ELEVON_1, INPUT_STABILIZED_ROLL, 50, 0),
+ new ServoMixRule(SERVO_ELEVON_1, INPUT_STABILIZED_PITCH, 50, 0),
+ new ServoMixRule(SERVO_ELEVON_2, INPUT_STABILIZED_ROLL, -50, 0),
+ new ServoMixRule(SERVO_ELEVON_2, INPUT_STABILIZED_PITCH, 50, 0),
+ ]
+ }, // 27
+ {
+ id: 14,
+ name: 'Airplane',
+ model: 'twin_plane',
+ image: 'airplane',
+ enabled: true,
+ legacy: true,
+ platform: PLATFORM_AIRPLANE,
+ hasFlaps: true,
+ motorMixer: [
+ new MotorMixRule(1.0, 0.0, 0.0, 0.0),
+ ],
+ servoMixer: [
+ new ServoMixRule(SERVO_ELEVATOR, INPUT_STABILIZED_PITCH, 100, 0),
+ new ServoMixRule(SERVO_FLAPPERON_1, INPUT_STABILIZED_ROLL, 100, 0),
+ /*new ServoMixRule(SERVO_FLAPPERON_1, INPUT_FEATURE_FLAPS, 100, 0),*/
+ new ServoMixRule(SERVO_FLAPPERON_2, INPUT_STABILIZED_ROLL, 100, 0),
+ /*new ServoMixRule(SERVO_FLAPPERON_2, INPUT_FEATURE_FLAPS, -100, 0),*/
+ new ServoMixRule(SERVO_RUDDER, INPUT_STABILIZED_YAW, 100, 0),
+ ]
+ }, // 14
{
id: 26,
name: 'Airplane with differential thrust',
@@ -464,10 +410,10 @@ const mixerList = [
/*new ServoMixRule(SERVO_FLAPPERON_2, INPUT_FEATURE_FLAPS, -100, 0),*/
new ServoMixRule(SERVO_RUDDER, INPUT_STABILIZED_YAW, 100, 0),
]
- },
+ }, // 26
{
id: 28,
- name: 'Airplane V-tail (individual aileron servos)',
+ name: 'Airplane V-tail',
model: 'vtail_plane',
image: 'airplane_vtail',
enabled: true,
@@ -487,7 +433,31 @@ const mixerList = [
new ServoMixRule(4, INPUT_STABILIZED_PITCH, -50, 0),
new ServoMixRule(4, INPUT_STABILIZED_YAW, -50, 0)
]
- },
+ }, // 28
+ {
+ id: 34,
+ name: 'Airplane V-tail with differential thrust',
+ model: 'vtail_plane',
+ image: 'airplane_vtail',
+ enabled: true,
+ legacy: false,
+ platform: PLATFORM_AIRPLANE,
+ hasFlaps: true,
+ motorMixer: [
+ new MotorMixRule(1.0, 0.0, 0.0, 0.3),
+ new MotorMixRule(1.0, 0.0, 0.0, -0.3)
+ ],
+ servoMixer: [
+ new ServoMixRule(1, INPUT_STABILIZED_ROLL, 100, 0),
+ /*new ServoMixRule(1, INPUT_FEATURE_FLAPS, 100, 0),*/
+ new ServoMixRule(2, INPUT_STABILIZED_ROLL, 100, 0),
+ /*new ServoMixRule(2, INPUT_FEATURE_FLAPS, 100, 0),*/
+ new ServoMixRule(3, INPUT_STABILIZED_PITCH, 50, 0),
+ new ServoMixRule(3, INPUT_STABILIZED_YAW, -50, 0),
+ new ServoMixRule(4, INPUT_STABILIZED_PITCH, -50, 0),
+ new ServoMixRule(4, INPUT_STABILIZED_YAW, -50, 0)
+ ]
+ }, // 34
{
id: 29,
name: 'Airplane V-tail (single aileron servo)',
@@ -506,7 +476,7 @@ const mixerList = [
new ServoMixRule(3, INPUT_STABILIZED_PITCH, -50, 0),
new ServoMixRule(3, INPUT_STABILIZED_YAW, -50, 0),
]
- },
+ }, //29
{
id: 30,
name: 'Airplane without rudder',
@@ -526,7 +496,44 @@ const mixerList = [
new ServoMixRule(SERVO_FLAPPERON_2, INPUT_STABILIZED_ROLL, 100, 0),
/*new ServoMixRule(SERVO_FLAPPERON_2, INPUT_FEATURE_FLAPS, 100, 0),*/
]
- },
+ }, // 30
+ {
+ id: 24,
+ name: 'Custom Airplane',
+ model: 'twin_plane',
+ image: 'airplane',
+ enabled: false,
+ legacy: true,
+ platform: PLATFORM_AIRPLANE,
+ motorMixer: [],
+ servoMixer: []
+ }, // 24
+
+ // ** Helicopter **
+ {
+ id: 15,
+ name: 'Heli 120',
+ model: 'custom',
+ image: 'custom',
+ enabled: false,
+ legacy: true,
+ platform: PLATFORM_HELICOPTER,
+ motorMixer: [],
+ servoMixer: []
+ }, // 15
+ {
+ id: 16,
+ name: 'Heli 90',
+ model: 'custom',
+ image: 'custom',
+ enabled: false,
+ legacy: true,
+ platform: PLATFORM_HELICOPTER,
+ motorMixer: [],
+ servoMixer: []
+ }, // 16
+
+ // ** Other platforms **
{
id: 31,
name: 'Rover',
@@ -556,8 +563,8 @@ const mixerList = [
servoMixer: [
new ServoMixRule(3, INPUT_STABILIZED_YAW, 100, 0),
]
- }
- ,
+ },
+ // ** Misc **
{
id: 33,
name: 'Other',
@@ -572,7 +579,29 @@ const mixerList = [
servoMixer: [
new ServoMixRule(3, INPUT_STABILIZED_YAW, 100, 0),
]
- }
+ },
+ {
+ id: 5,
+ name: 'Gimbal',
+ model: 'custom',
+ image: 'custom',
+ enabled: false,
+ legacy: true,
+ platform: PLATFORM_OTHER,
+ motorMixer: [],
+ servoMixer: []
+ }, // 5
+ {
+ id: 19,
+ name: 'PPM to SERVO',
+ model: 'custom',
+ image: 'custom',
+ enabled: false,
+ legacy: true,
+ platform: PLATFORM_OTHER,
+ motorMixer: [],
+ servoMixer: []
+ }, // 19
];
const platformList = [
diff --git a/js/motorMixRule.js b/js/motorMixRule.js
index 7be8e8d3..16b241e1 100644
--- a/js/motorMixRule.js
+++ b/js/motorMixRule.js
@@ -7,9 +7,9 @@ var MotorMixRule = function (throttle, roll, pitch, yaw) {
self.fromMsp = function (mspThrottle, mspRoll, mspPitch, mspYaw) {
throttle = mspThrottle / 1000;
- roll = (mspRoll / 1000) - 2;
- pitch = (mspPitch / 1000) - 2;
- yaw = (mspYaw / 1000) - 2;
+ roll = Math.round(((mspRoll / 1000) - 2) * 1000) / 1000;
+ pitch = Math.round(((mspPitch / 1000) - 2) * 1000) / 1000;
+ yaw = Math.round(((mspYaw / 1000) - 2) * 1000) / 1000;
};
self.isUsed = function () {
diff --git a/js/msp.js b/js/msp.js
index e98cd4fd..727f9fa0 100644
--- a/js/msp.js
+++ b/js/msp.js
@@ -72,7 +72,7 @@ var MSP = {
ledDirectionLetters: ['n', 'e', 's', 'w', 'u', 'd'], // in LSB bit order
ledFunctionLetters: ['i', 'w', 'f', 'a', 't', 'r', 'c', 'g', 's', 'b', 'l'], // in LSB bit order
- ledBaseFunctionLetters: ['c', 'f', 'a', 'l', 's', 'g', 'r'], // in LSB bit
+ ledBaseFunctionLetters: ['c', 'f', 'a', 'l', 's', 'g', 'r', 'h'], // in LSB bit
ledOverlayLetters: ['t', 'o', 'b', 'n', 'i', 'w'], // in LSB bit
last_received_timestamp: null,
diff --git a/js/msp/MSPCodes.js b/js/msp/MSPCodes.js
index c939b2cb..6e39f7f0 100644
--- a/js/msp/MSPCodes.js
+++ b/js/msp/MSPCodes.js
@@ -33,6 +33,12 @@ var MSPCodes = {
MSP_SET_CHANNEL_FORWARDING: 33,
MSP_MODE_RANGES: 34,
MSP_SET_MODE_RANGE: 35,
+ MSP_FEATURE: 36,
+ MSP_SET_FEATURE: 37,
+ MSP_BOARD_ALIGNMENT: 38,
+ MSP_SET_BOARD_ALIGNMENT: 39,
+ MSP_CURRENT_METER_CONFIG: 40,
+ MSP_SET_CURRENT_METER_CONFIG: 41,
MSP_RX_CONFIG: 44,
MSP_SET_RX_CONFIG: 45,
MSP_LED_COLORS: 46,
@@ -44,8 +50,6 @@ var MSPCodes = {
MSP_CF_SERIAL_CONFIG: 54,
MSP_SET_CF_SERIAL_CONFIG: 55,
MSP_SONAR: 58,
- MSP_PID_CONTROLLER: 59,
- MSP_SET_PID_CONTROLLER: 60,
MSP_ARMING_CONFIG: 61,
MSP_SET_ARMING_CONFIG: 62,
MSP_DATAFLASH_SUMMARY: 70,
@@ -149,10 +153,10 @@ var MSPCodes = {
// Additional private MSP for baseflight configurator (yes thats us \o/)
MSP_RX_MAP: 64, // get channel map (also returns number of channels total)
MSP_SET_RX_MAP: 65, // set rc map, numchannels to set comes from MSP_RX_MAP
- MSP_BF_CONFIG: 66, // baseflight-specific settings that aren't covered elsewhere
- MSP_SET_BF_CONFIG: 67, // baseflight-specific settings save
+ MSP_BF_CONFIG: 66, // Depreciated
+ MSP_SET_BF_CONFIG: 67, // Depreciated
MSP_SET_REBOOT: 68, // reboot settings
- MSP_BF_BUILD_INFO: 69, // build date as well as some space for future expansion
+ MSP_BF_BUILD_INFO: 69, // Depreciated
// INAV specific codes
MSPV2_SETTING: 0x1003,
diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js
index c1a11975..f96b4374 100644
--- a/js/msp/MSPHelper.js
+++ b/js/msp/MSPHelper.js
@@ -68,15 +68,6 @@ var mspHelper = (function (gui) {
colorCount,
color;
if (!dataHandler.unsupported || dataHandler.unsupported) switch (dataHandler.code) {
- case MSPCodes.MSP_IDENT:
- //FIXME remove this frame when proven not needed
- console.log('Using deprecated msp command: MSP_IDENT');
- // Deprecated
- CONFIG.version = parseFloat((data.getUint8(0) / 100).toFixed(2));
- CONFIG.multiType = data.getUint8(1);
- CONFIG.msp_version = data.getUint8(2);
- CONFIG.capability = data.getUint32(3, true);
- break;
case MSPCodes.MSP_STATUS:
console.log('Using deprecated msp command: MSP_STATUS');
CONFIG.cycleTime = data.getUint16(0, true);
@@ -293,14 +284,6 @@ var mspHelper = (function (gui) {
RC_tuning.manual_pitch_rate = data.getUint8(offset++);
RC_tuning.manual_yaw_rate = data.getUint8(offset++);
break;
- case MSPCodes.MSP_PID:
- // PID data arrived, we need to scale it and save to appropriate bank / array
- for (i = 0, needle = 0; i < (dataHandler.message_length_expected / 3); i++, needle += 3) {
- PIDs[i][0] = data.getUint8(needle);
- PIDs[i][1] = data.getUint8(needle + 1);
- PIDs[i][2] = data.getUint8(needle + 2);
- }
- break;
case MSPCodes.MSP2_PID:
// PID data arrived, we need to scale it and save to appropriate bank / array
for (i = 0, needle = 0; i < (dataHandler.message_length_expected / 4); i++, needle += 4) {
@@ -640,9 +623,6 @@ var mspHelper = (function (gui) {
break;
case MSPCodes.MSP_SET_RAW_GPS:
break;
- case MSPCodes.MSP_SET_PID:
- console.log('PID settings saved');
- break;
case MSPCodes.MSP2_SET_PID:
console.log('PID settings saved');
break;
@@ -734,19 +714,36 @@ var mspHelper = (function (gui) {
case MSPCodes.MSP_SET_RX_MAP:
console.log('RCMAP saved');
break;
- case MSPCodes.MSP_BF_CONFIG:
- BF_CONFIG.mixerConfiguration = data.getUint8(0);
- BF_CONFIG.features = data.getUint32(1, true);
- BF_CONFIG.serialrx_type = data.getUint8(5);
- BF_CONFIG.board_align_roll = data.getInt16(6, true); // -180 - 360
- BF_CONFIG.board_align_pitch = data.getInt16(8, true); // -180 - 360
- BF_CONFIG.board_align_yaw = data.getInt16(10, true); // -180 - 360
- BF_CONFIG.currentscale = data.getInt16(12, true);
- BF_CONFIG.currentoffset = data.getInt16(14, true);
+
+ case MSPCodes.MSP_BOARD_ALIGNMENT:
+ BOARD_ALIGNMENT.roll = data.getInt16(0, true); // -180 - 360
+ BOARD_ALIGNMENT.pitch = data.getInt16(2, true); // -180 - 360
+ BOARD_ALIGNMENT.yaw = data.getInt16(4, true); // -180 - 360
break;
- case MSPCodes.MSP_SET_BF_CONFIG:
- console.log('BF_CONFIG saved');
+
+ case MSPCodes.MSP_SET_BOARD_ALIGNMENT:
+ console.log('MSP_SET_BOARD_ALIGNMENT saved');
break;
+
+ case MSPCodes.MSP_CURRENT_METER_CONFIG:
+ CURRENT_METER_CONFIG.scale = data.getInt16(0, true);
+ CURRENT_METER_CONFIG.offset = data.getInt16(2, true);
+ CURRENT_METER_CONFIG.type = data.getUint8(4);
+ CURRENT_METER_CONFIG.capacity = data.getInt16(5, true);
+ break;
+
+ case MSPCodes.MSP_SET_CURRENT_METER_CONFIG:
+ console.log('MSP_SET_CURRENT_METER_CONFIG saved');
+ break;
+
+ case MSPCodes.MSP_FEATURE:
+ FEATURES = data.getUint32(0, true);
+ break;
+
+ case MSPCodes.MSP_SET_FEATURE:
+ console.log('MSP_SET_FEATURE saved');
+ break;
+
case MSPCodes.MSP_SET_REBOOT:
console.log('Reboot request accepted');
break;
@@ -800,28 +797,6 @@ var mspHelper = (function (gui) {
console.log('Channel forwarding saved');
break;
- case MSPCodes.MSP_CF_SERIAL_CONFIG:
- SERIAL_CONFIG.ports = [];
- var bytesPerPort = 1 + 2 + 4;
- var serialPortCount = data.byteLength / bytesPerPort;
-
- for (i = 0; i < serialPortCount; i++) {
- var BAUD_RATES = mspHelper.BAUD_RATES_post1_6_3;
-
- var serialPort = {
- identifier: data.getUint8(offset),
- functions: mspHelper.serialPortFunctionMaskToFunctions(data.getUint16(offset + 1, true)),
- msp_baudrate: BAUD_RATES[data.getUint8(offset + 3)],
- sensors_baudrate: BAUD_RATES[data.getUint8(offset + 4)],
- telemetry_baudrate: BAUD_RATES[data.getUint8(offset + 5)],
- blackbox_baudrate: BAUD_RATES[data.getUint8(offset + 6)]
- };
-
- offset += bytesPerPort;
- SERIAL_CONFIG.ports.push(serialPort);
- }
- break;
-
case MSPCodes.MSP2_CF_SERIAL_CONFIG:
SERIAL_CONFIG.ports = [];
var bytesPerPort = 1 + 4 + 4;
@@ -844,7 +819,6 @@ var mspHelper = (function (gui) {
}
break;
- case MSPCodes.MSP_SET_CF_SERIAL_CONFIG:
case MSPCodes.MSP2_SET_CF_SERIAL_CONFIG:
console.log('Serial config saved');
break;
@@ -1559,24 +1533,33 @@ var mspHelper = (function (gui) {
i;
switch (code) {
- case MSPCodes.MSP_SET_BF_CONFIG:
- buffer.push(BF_CONFIG.mixerConfiguration);
- buffer.push(specificByte(BF_CONFIG.features, 0));
- buffer.push(specificByte(BF_CONFIG.features, 1));
- buffer.push(specificByte(BF_CONFIG.features, 2));
- buffer.push(specificByte(BF_CONFIG.features, 3));
- buffer.push(BF_CONFIG.serialrx_type);
- buffer.push(specificByte(BF_CONFIG.board_align_roll, 0));
- buffer.push(specificByte(BF_CONFIG.board_align_roll, 1));
- buffer.push(specificByte(BF_CONFIG.board_align_pitch, 0));
- buffer.push(specificByte(BF_CONFIG.board_align_pitch, 1));
- buffer.push(specificByte(BF_CONFIG.board_align_yaw, 0));
- buffer.push(specificByte(BF_CONFIG.board_align_yaw, 1));
- buffer.push(lowByte(BF_CONFIG.currentscale));
- buffer.push(highByte(BF_CONFIG.currentscale));
- buffer.push(lowByte(BF_CONFIG.currentoffset));
- buffer.push(highByte(BF_CONFIG.currentoffset));
+
+ case MSPCodes.MSP_SET_FEATURE:
+ buffer.push(specificByte(FEATURES, 0));
+ buffer.push(specificByte(FEATURES, 1));
+ buffer.push(specificByte(FEATURES, 2));
+ buffer.push(specificByte(FEATURES, 3));
break;
+
+ case MSPCodes.MSP_SET_BOARD_ALIGNMENT:
+ buffer.push(specificByte(BOARD_ALIGNMENT.roll, 0));
+ buffer.push(specificByte(BOARD_ALIGNMENT.roll, 1));
+ buffer.push(specificByte(BOARD_ALIGNMENT.pitch, 0));
+ buffer.push(specificByte(BOARD_ALIGNMENT.pitch, 1));
+ buffer.push(specificByte(BOARD_ALIGNMENT.yaw, 0));
+ buffer.push(specificByte(BOARD_ALIGNMENT.yaw, 1));
+ break;
+
+ case MSPCodes.MSP_SET_CURRENT_METER_CONFIG:
+ buffer.push(specificByte(CURRENT_METER_CONFIG.scale, 0));
+ buffer.push(specificByte(CURRENT_METER_CONFIG.scale, 1));
+ buffer.push(specificByte(CURRENT_METER_CONFIG.offset, 0));
+ buffer.push(specificByte(CURRENT_METER_CONFIG.offset, 1));
+ buffer.push(CURRENT_METER_CONFIG.type);
+ buffer.push(specificByte(CURRENT_METER_CONFIG.capacity, 0));
+ buffer.push(specificByte(CURRENT_METER_CONFIG.capacity, 1));
+ break;
+
case MSPCodes.MSP_SET_VTX_CONFIG:
if (VTX_CONFIG.band > 0) {
buffer.push16(((VTX_CONFIG.band - 1) * 8) + (VTX_CONFIG.channel - 1));
@@ -1589,13 +1572,6 @@ var mspHelper = (function (gui) {
buffer.push(0);
buffer.push(VTX_CONFIG.low_power_disarm);
break;
- case MSPCodes.MSP_SET_PID:
- for (i = 0; i < PIDs.length; i++) {
- buffer.push(parseInt(PIDs[i][0]));
- buffer.push(parseInt(PIDs[i][1]));
- buffer.push(parseInt(PIDs[i][2]));
- }
- break;
case MSPCodes.MSP2_SET_PID:
for (i = 0; i < PIDs.length; i++) {
buffer.push(parseInt(PIDs[i][0]));
@@ -1812,24 +1788,6 @@ var mspHelper = (function (gui) {
}
break;
- case MSPCodes.MSP_SET_CF_SERIAL_CONFIG:
- for (i = 0; i < SERIAL_CONFIG.ports.length; i++) {
- var serialPort = SERIAL_CONFIG.ports[i];
-
- buffer.push(serialPort.identifier);
-
- var functionMask = mspHelper.SERIAL_PORT_FUNCTIONSToMask(serialPort.functions);
- buffer.push(specificByte(functionMask, 0));
- buffer.push(specificByte(functionMask, 1));
-
- var BAUD_RATES = mspHelper.BAUD_RATES_post1_6_3;
- buffer.push(BAUD_RATES.indexOf(serialPort.msp_baudrate));
- buffer.push(BAUD_RATES.indexOf(serialPort.sensors_baudrate));
- buffer.push(BAUD_RATES.indexOf(serialPort.telemetry_baudrate));
- buffer.push(BAUD_RATES.indexOf(serialPort.blackbox_baudrate));
- }
- break;
-
case MSPCodes.MSP2_SET_CF_SERIAL_CONFIG:
for (i = 0; i < SERIAL_CONFIG.ports.length; i++) {
var serialPort = SERIAL_CONFIG.ports[i];
@@ -2665,7 +2623,7 @@ var mspHelper = (function (gui) {
/*
ledDirectionLetters: ['n', 'e', 's', 'w', 'u', 'd'], // in LSB bit order
ledFunctionLetters: ['i', 'w', 'f', 'a', 't', 'r', 'c', 'g', 's', 'b', 'l'], // in LSB bit order
- ledBaseFunctionLetters: ['c', 'f', 'a', 'l', 's', 'g', 'r'], // in LSB bit
+ ledBaseFunctionLetters: ['c', 'f', 'a', 'l', 's', 'g', 'r', 'h'], // in LSB bit
ledOverlayLetters: ['t', 'o', 'b', 'n', 'i', 'w'], // in LSB bit
*/
@@ -2752,14 +2710,6 @@ var mspHelper = (function (gui) {
* Basic sending methods used for chaining purposes
*/
- /**
- * @deprecated
- * @param callback
- */
- self.loadMspIdent = function (callback) {
- MSP.send_message(MSPCodes.MSP_IDENT, false, false, callback);
- };
-
self.loadINAVPidConfig = function (callback) {
MSP.send_message(MSPCodes.MSP_INAV_PID, false, false, callback);
};
@@ -2800,8 +2750,16 @@ var mspHelper = (function (gui) {
MSP.send_message(MSPCodes.MSP_STATUS, false, false, callback);
};
- self.loadBfConfig = function (callback) {
- MSP.send_message(MSPCodes.MSP_BF_CONFIG, false, false, callback);
+ self.loadFeatures = function (callback) {
+ MSP.send_message(MSPCodes.MSP_FEATURE, false, false, callback);
+ };
+
+ self.loadBoardAlignment = function (callback) {
+ MSP.send_message(MSPCodes.MSP_BOARD_ALIGNMENT, false, false, callback);
+ };
+
+ self.loadCurrentMeterConfig = function (callback) {
+ MSP.send_message(MSPCodes.MSP_CURRENT_METER_CONFIG, false, false, callback);
};
self.queryFcStatus = function (callback) {
@@ -2904,8 +2862,16 @@ var mspHelper = (function (gui) {
MSP.send_message(MSPCodes.MSP_SET_PID_ADVANCED, mspHelper.crunch(MSPCodes.MSP_SET_PID_ADVANCED), false, callback);
};
- self.saveBfConfig = function (callback) {
- MSP.send_message(MSPCodes.MSP_SET_BF_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_BF_CONFIG), false, callback);
+ self.saveFeatures = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_FEATURE, mspHelper.crunch(MSPCodes.MSP_SET_FEATURE), false, callback);
+ };
+
+ self.saveCurrentMeterConfig = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_CURRENT_METER_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_CURRENT_METER_CONFIG), false, callback);
+ };
+
+ self.saveBoardAlignment = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_BOARD_ALIGNMENT, mspHelper.crunch(MSPCodes.MSP_SET_BOARD_ALIGNMENT), false, callback);
};
self.saveMisc = function (callback) {
diff --git a/js/servoMixerRuleCollection.js b/js/servoMixerRuleCollection.js
index e23de9e5..2fa3e56f 100644
--- a/js/servoMixerRuleCollection.js
+++ b/js/servoMixerRuleCollection.js
@@ -99,5 +99,20 @@ let ServoMixerRuleCollection = function () {
});
}
+ self.getNextUnusedIndex = function() {
+ let nextTarget = 0;
+
+ for (let ruleIndex in data) {
+ if (data.hasOwnProperty(ruleIndex)) {
+ let target = data[ruleIndex].getTarget();
+ if (target > nextTarget) {
+ nextTarget = target;
+ }
+ }
+ }
+
+ return nextTarget+1;
+ }
+
return self;
};
\ No newline at end of file
diff --git a/js/settings.js b/js/settings.js
index 76049865..6f0d4a0e 100644
--- a/js/settings.js
+++ b/js/settings.js
@@ -28,6 +28,8 @@ var Settings = (function () {
}
parent.show();
+ input.prop('title', 'CLI: ' + input.data('setting'));
+
if (input.prop('tagName') == 'SELECT' || s.setting.table) {
if (input.attr('type') == 'checkbox') {
input.prop('checked', s.value > 0);
@@ -64,15 +66,15 @@ var Settings = (function () {
} else {
input.attr('step', "0.01");
}
-
+
input.attr('min', s.setting.min);
input.attr('max', s.setting.max);
input.val(s.value.toFixed(2));
} else {
var multiplier = parseFloat(input.data('setting-multiplier') || 1);
- input.attr('type', 'number');
- input.val((s.value / multiplier).toFixed(Math.log10(multiplier)));
+ input.val((s.value / multiplier).toFixed(Math.log10(multiplier)));
+ input.attr('type', 'number');
if (typeof s.setting.min !== 'undefined' && s.setting.min !== null) {
input.attr('min', (s.setting.min / multiplier).toFixed(Math.log10(multiplier)));
}
@@ -113,19 +115,19 @@ var Settings = (function () {
const getUnitDisplayTypeValue = () => {
// Try and match the values
switch (configUnitType) {
+ case UnitType.imperial:
+ return 0;
+ break;
+ case UnitType.metric:
+ return 1;
+ break;
case UnitType.OSD: // Match the OSD value on the UI
return globalSettings.osdUnits;
break;
- case UnitType.imperial:
- return 0; // Imperial OSD Value
- break;
- case UnitType.metric:
- return 1; // Metric + MPH OSD Value
- break;
case UnitType.none:
default:
- // Something went wrong
return -1;
+ break;
}
}
@@ -135,67 +137,199 @@ var Settings = (function () {
const oldValue = element.val();
+ //display names for the units
+ const unitDisplayDames = {
+ // Misc
+ 'us' : "uS",
+ 'cw' : 'cW',
+ 'percent' : '%',
+ 'cmss' : 'cm/s/s',
+ // Time
+ 'msec' : 'ms',
+ 'dsec' : 'ds',
+ 'sec' : 's',
+ // Angles
+ 'deg' : '°',
+ 'decideg' : 'deci°',
+ // Temperature
+ 'decidegc' : 'deci°C',
+ 'degc' : '°C',
+ 'degf' : '°F',
+ // Speed
+ 'cms' : 'cm/s',
+ 'v-cms' : 'cm/s',
+ 'ms' : 'm/s',
+ 'kmh' : 'Km/h',
+ 'mph' : 'mph',
+ 'hftmin' : 'x100 ft/min',
+ 'fts' : 'ft/s',
+ 'kt' : 'Kt',
+ // Distance
+ 'cm' : 'cm',
+ 'm' : 'm',
+ 'km' : 'Km',
+ 'm-lrg' : 'm', // Metres, but converted to larger units
+ 'ft' : 'ft',
+ 'mi' : 'mi',
+ 'nm' : 'NM'
+ }
+
+
// Ensure we can do conversions
- if (configUnitType === UnitType.none || uiUnitValue === -1 || !inputUnit || !oldValue || !element) {
+ if (!inputUnit || !oldValue || !element) {
return;
}
- // Used to convert between a value and a value matching the int
- // unit display value. Eg 1 = Metric
- // units. We use the OSD unit values here for easy
- const conversionTable = {
- 1: {
- 'cm': { multiplier: 100, unitName: 'm' },
- 'cms': { multiplier: 27.77777777777778, unitName: 'Km/h' }
+ //this is used to get the factor in which we multiply
+ //to get the correct conversion, the first index is the from
+ //unit and the second is the too unit
+ //unitConversionTable[toUnit][fromUnit] -> factor
+ const unitRatioTable = {
+ 'cm' : {
+ 'm' : 100,
+ 'ft' : 30.48
},
- 2: {
- 'cm': { multiplier: 100, unitName: 'm' },
- },
- 4: {
- 'cms': { multiplier: 51.44444444444457, unitName: 'Kt' }
+ 'm' : {
+ 'm' : 1,
+ 'ft' : 0.3048
},
- default: {
- 'cm': { multiplier: 30.48, unitName: 'ft' },
- 'cms': { multiplier: 44.704, unitName: 'mph' },
- 'ms': { multiplier: 1000, unitName: 'sec' }
+ 'm-lrg' : {
+ 'km' : 1000,
+ 'mi' : 1609.344,
+ 'nm' : 1852
},
- }
+ 'cms' : { // Horizontal speed
+ 'kmh' : 27.77777777777778,
+ 'kt': 51.44444444444457,
+ 'mph' : 44.704,
+ 'ms' : 100
+ },
+ 'v-cms' : { // Vertical speed
+ 'ms' : 100,
+ 'hftmin' : 50.8,
+ 'fts' : 30.48
+ },
+ 'msec' : {
+ 'sec' : 1000
+ },
+ 'dsec' : {
+ 'sec' : 10
+ },
+ 'decideg' : {
+ 'deg' : 10
+ },
+ 'decidegc' : {
+ 'degc' : 10,
+ 'degf' : 'FAHREN'
+ },
+ };
- // Small closure to try and get the multiplier
- // needed from the conversion table
+ //this holds which units get converted in which unit systems
+ const conversionTable = {
+ 0: { //imperial
+ 'cm' : 'ft',
+ 'm' : 'ft',
+ 'm-lrg' : 'mi',
+ 'cms' : 'mph',
+ 'v-cms' : 'fts',
+ 'msec' : 'sec',
+ 'dsec' : 'sec',
+ 'decideg' : 'deg',
+ 'decidegc' : 'degf',
+ },
+ 1: { //metric
+ 'cm': 'm',
+ 'm' : 'm',
+ 'm-lrg' : 'km',
+ 'cms' : 'kmh',
+ 'v-cms' : 'ms',
+ 'msec' : 'sec',
+ 'dsec' : 'sec',
+ 'decideg' : 'deg',
+ 'decidegc' : 'degc',
+ },
+ 2: { //metric with MPH
+ 'cm': 'm',
+ 'm' : 'm',
+ 'm-lrg' : 'km',
+ 'cms' : 'mph',
+ 'v-cms' : 'ms',
+ 'decideg' : 'deg',
+ 'msec' : 'sec',
+ 'dsec' : 'sec',
+ 'decidegc' : 'degc',
+ },
+ 3:{ //UK
+ 'cm' : 'ft',
+ 'm' : 'ft',
+ 'm-lrg' : 'mi',
+ 'cms' : 'mph',
+ 'v-cms' : 'fts',
+ 'decideg' : 'deg',
+ 'msec' : 'sec',
+ 'dsec' : 'sec',
+ 'decidegc' : 'degc',
+ },
+ 4: { //General aviation
+ 'cm' : 'ft',
+ 'm' : 'ft',
+ 'm-lrg' : 'nm',
+ 'cms': 'kt',
+ 'v-cms' : 'hftmin',
+ 'decideg' : 'deg',
+ 'msec' : 'sec',
+ 'dsec' : 'sec',
+ 'decidegc' : 'degc',
+ },
+ default:{}//show base units
+ };
+
+ //this returns the factor in which to multiply to convert a unit
const getUnitMultiplier = () => {
- if(conversionTable[uiUnitValue] && conversionTable[uiUnitValue][inputUnit]) {
- return conversionTable[uiUnitValue][inputUnit];
+ if (conversionTable[uiUnitValue]){
+ const fromUnits = conversionTable[uiUnitValue];
+ if (fromUnits[inputUnit]){
+ const multiplier = unitRatioTable[inputUnit][fromUnits[inputUnit]];
+ return {'multiplier':multiplier, 'unitName':fromUnits[inputUnit]};
+ }
}
-
- return conversionTable['default'][inputUnit];
+ return {multiplier:1, unitName:inputUnit};
}
// Get the default multi obj or the custom
const multiObj = getUnitMultiplier();
- if(!multiObj) {
- return;
- }
-
const multiplier = multiObj.multiplier;
const unitName = multiObj.unitName;
// Update the step, min, and max; as we have the multiplier here.
if (element.attr('type') == 'number') {
element.attr('step', ((multiplier != 1) ? '0.01' : '1'));
- element.attr('min', (element.attr('min') / multiplier).toFixed(2));
- element.attr('max', (element.attr('max') / multiplier).toFixed(2));
+ if (multiplier != 'FAHREN') {
+ element.attr('min', (element.attr('min') / multiplier).toFixed(2));
+ element.attr('max', (element.attr('max') / multiplier).toFixed(2));
+ }
}
// Update the input with a new formatted unit
- const convertedValue = Number((oldValue / multiplier).toFixed(2));
- const newValue = Number.isInteger(convertedValue) ? Math.round(convertedValue) : convertedValue;
+ let newValue = "";
+ if (multiplier == 'FAHREN') {
+ element.attr('min', toFahrenheit(element.attr('min')).toFixed(2));
+ element.attr('max', toFahrenheit(element.attr('max')).toFixed(2));
+ newValue = toFahrenheit(oldValue).toFixed(2);
+ } else {
+ const convertedValue = Number((oldValue / multiplier).toFixed(2));
+ newValue = Number.isInteger(convertedValue) ? Math.round(convertedValue) : convertedValue;
+ }
element.val(newValue);
element.data('setting-multiplier', multiplier);
// Now wrap the input in a display that shows the unit
- element.wrap(``);
+ element.wrap(``);
+
+ function toFahrenheit(decidegC) {
+ return (decidegC / 10) * 1.8 + 32;
+ };
}
self.saveInput = function(input) {
@@ -216,8 +350,13 @@ var Settings = (function () {
} else if(setting.type == 'string') {
value = input.val();
} else {
- var multiplier = parseFloat(input.data('setting-multiplier') || 1);
- value = parseFloat(input.val()) * multiplier;
+ var multiplier = input.data('setting-multiplier') || 1;
+ if (multiplier == 'FAHREN') {
+ value = Math.round(((parseFloat(input.val())-32) / 1.8) * 10);
+ } else {
+ multiplier = parseFloat(multiplier);
+ value = Math.round(parseFloat(input.val()) * multiplier);
+ }
}
return mspHelper.setSetting(settingName, value);
};
diff --git a/main.css b/main.css
index ff15d7c8..704f7fe6 100644
--- a/main.css
+++ b/main.css
@@ -2221,11 +2221,19 @@ ol li {
position: relative;
}
+.unit_wrapper input {
+ margin-right: 0 !important;
+}
+
+.unit_wrapper ~ label, select ~ label, input ~ label {
+ margin-left: 10px;
+}
+
/* Position the unit to the right of the wrapper */
.unit_wrapper::after {
position: absolute;
top: 2px;
- right: .7em;
+ right: .5em;
transition: all .05s ease-in-out;
}
@@ -2233,13 +2241,13 @@ ol li {
for arrow buttons will appear to the right of number inputs */
.unit_wrapper:hover::after,
.unit_wrapper:focus-within::after {
- right: 1.3em;
+ right: 1.0em;
}
/* Handle Firefox (arrows always shown) */
@supports (-moz-appearance:none) {
.unit_wrapper::after {
- right: 1.3em;
+ right: 1.0em;
}
}
diff --git a/package.json b/package.json
index 0d40f8b0..f458b46a 100755
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
"jquery-ui-npm": "1.12.0",
"marked": "^0.3.17",
"minimist": "^1.2.0",
- "nw": "^0.50.3-sdk",
+ "nw": "^0.61.0",
"nw-dialog": "^1.0.7",
"openlayers": "^4.6.5",
"plotly": "^1.0.6",
diff --git a/resources/osd/vision.mcm b/resources/osd/vision.mcm
index 0505b4b7..4f340f7e 100644
--- a/resources/osd/vision.mcm
+++ b/resources/osd/vision.mcm
@@ -6665,47 +6665,47 @@ MAX7456
01010101
01010101
01010101
-01010101
-01010101
-01010101
-01010101
-01010101
-01000101
-01010101
-01000101
-00100001
-01010101
-00100001
-00101000
-01010100
-10100001
-01001010
-00010010
-10000101
-01001010
-10001010
-10000101
-01010010
-10101010
-00010101
-01010010
-10101010
+00000000
00010101
01010100
-10101000
-01010101
+10101010
+10000101
01010100
-10101000
-01010101
-01010101
-00100001
-01010101
-01010101
-00100001
-01010101
-01010101
-01000101
+10000000
+10000101
+01010100
+10000000
+10000101
+01010100
+10000000
+10000101
+01010100
+10000000
+10000101
+01010100
+10000000
+10000101
+01010100
+10000000
+10000101
+01010100
+10000000
+10000101
+01010100
+10000000
+10000101
+01010100
+10000000
+10000101
+01010100
+10101010
+10000101
+01010100
+10101010
+10000101
01010101
+00000000
+00010101
01010101
01010101
01010101
diff --git a/resources/osd/vision.png b/resources/osd/vision.png
index 274c0779..c21f79f2 100644
Binary files a/resources/osd/vision.png and b/resources/osd/vision.png differ
diff --git a/resources/osd/vision/104.png b/resources/osd/vision/104.png
index e64fbcc1..63b314e9 100644
Binary files a/resources/osd/vision/104.png and b/resources/osd/vision/104.png differ
diff --git a/src/css/tabs/configuration.css b/src/css/tabs/configuration.css
index 9ef596ba..57e58712 100644
--- a/src/css/tabs/configuration.css
+++ b/src/css/tabs/configuration.css
@@ -28,12 +28,12 @@
text-align: left;
border: 1px solid silver;
border-radius: 3px;
- margin-right: 11px;
font-size: 12px;
font-weight: normal;
}
.config-section .number input,
+.config-section .checkbox input,
.tab-configuration .number input {
width: 106px;
}
@@ -221,7 +221,7 @@ hr {
.config-section label {
position: absolute;
- left: 118px;
+ left: 108px;
}
.config-section .radio label {
diff --git a/src/css/tabs/failsafe.css b/src/css/tabs/failsafe.css
index ea96ec14..cd0e83ce 100644
--- a/src/css/tabs/failsafe.css
+++ b/src/css/tabs/failsafe.css
@@ -26,7 +26,6 @@
text-align: left;
border: 1px solid silver;
border-radius: 3px;
- margin-right: 11px;
font-size: 12px;
font-weight: normal;
}
@@ -253,10 +252,12 @@
height: 90px;
}
-.tab-failsafe .minimumDistance {
- width: 100px !important;
- padding-left: 3px;
- margin-right: 11px;
+.tab-failsafe input {
+ width: 75px !important;
+}
+
+.tab-failsafe select {
+ width: 79px;
}
@media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) {
diff --git a/src/css/tabs/firmware_flasher.css b/src/css/tabs/firmware_flasher.css
index a9d6c98c..ec488163 100644
--- a/src/css/tabs/firmware_flasher.css
+++ b/src/css/tabs/firmware_flasher.css
@@ -271,7 +271,6 @@
text-align: left;
border: 1px solid silver;
border-radius: 3px;
- margin-right: 11px;
margin-bottom: 5px;
font-size: 12px;
font-weight: normal;
diff --git a/src/css/tabs/led_strip.css b/src/css/tabs/led_strip.css
index 5f1f4788..639251b2 100644
--- a/src/css/tabs/led_strip.css
+++ b/src/css/tabs/led_strip.css
@@ -74,6 +74,12 @@
border-color: rgb(52, 155, 255);
}
+.tab-led-strip .gPoint.function-h { /* Channel */
+ background: skyblue;
+ box-shadow: inset 0 0 30px rgba(0, 0, 0, .7);
+ border-color: black;
+}
+
.tab-led-strip .gPoint.function-c .overlay-color,
.tab-led-strip .gPoint.function-r .overlay-color {
float: left;
@@ -210,6 +216,7 @@
.tab-led-strip .select .function-g { background: green;}
/* .tab-led-strip .select .function-b { background: white; color:black;} */
.tab-led-strip .select .function-r { background: #acacac;}
+.tab-led-strip .select .function-h { background: skyblue;}
.tab-led-strip .select .functionSelect option {
background: white;
diff --git a/src/css/tabs/osd.css b/src/css/tabs/osd.css
index 225b4fb2..ff80f79a 100644
--- a/src/css/tabs/osd.css
+++ b/src/css/tabs/osd.css
@@ -477,21 +477,19 @@ button {
}
.tab-osd .settings input {
- width: 55px;
+ width: 75px;
padding-left: 3px;
height: 18px;
line-height: 20px;
text-align: left;
border: 1px solid silver;
border-radius: 3px;
- margin-right: 11px;
font-size: 11px;
font-weight: normal;
}
.tab-osd .settings select {
width: 75px;
- margin-right: 11px;
}
.tab-osd .settings .switchery {
diff --git a/src/css/tabs/pid_tuning.css b/src/css/tabs/pid_tuning.css
index 5674006a..98e9c937 100644
--- a/src/css/tabs/pid_tuning.css
+++ b/src/css/tabs/pid_tuning.css
@@ -302,7 +302,6 @@
text-align: left;
border: 1px solid silver;
border-radius: 3px;
- margin-right: 11px;
font-weight: normal;
}
diff --git a/src/css/tabs/transponder.css b/src/css/tabs/transponder.css
index 764c6874..b4e7381c 100644
--- a/src/css/tabs/transponder.css
+++ b/src/css/tabs/transponder.css
@@ -12,7 +12,6 @@
text-align: left;
border: 1px solid silver;
border-radius: 3px;
- margin-right: 11px;
font-size: 12px;
font-weight: normal;
}
diff --git a/tabs/advanced_tuning.html b/tabs/advanced_tuning.html
index f6034dc7..bc5ab18e 100644
--- a/tabs/advanced_tuning.html
+++ b/tabs/advanced_tuning.html
@@ -11,12 +11,12 @@