diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 070a2d137..2854f15cb 100755
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -87,6 +87,12 @@
"tabServos": {
"message": "Servos"
},
+ "tabFailsafe": {
+ "message": "Failsafe"
+ },
+ "tabTransponder": {
+ "message": "Race Transponder"
+ },
"tabGPS": {
"message": "GPS"
},
@@ -103,10 +109,10 @@
"message": "CLI"
},
"tabLogging": {
- "message": "Logging"
+ "message": "Tethered Logging"
},
- "tabDataflash": {
- "message": "Dataflash"
+ "tabOnboardLogging": {
+ "message": "Blackbox"
},
"tabAdjustments": {
"message": "Adjustments"
@@ -212,6 +218,12 @@
"dfu_erased_kilobytes": {
"message": "Erased $1 kB of flash successfully "
},
+ "dfu_device_flash_info": {
+ "message": "Detected device with total flash size $1 kiB"
+ },
+ "dfu_error_image_size": {
+ "message": "Error : Supplied image is larger then flash available on the chip! Image: $1 kiB, limit = $2 kiB"
+ },
"eeprom_saved_ok": {
"message": "EEPROM saved "
@@ -249,14 +261,42 @@
"message": "Documentation / Manual"
},
"defaultDocumentation": {
- "message": "Cleanflight documentation is available in Markdown and PDF formats. The PDF manual appropriate to the firmware can be downloaded from the github releases page, here . The Markdown latest online documentation is available here - you can switch to the appropriate version of the documentation by selecting the tag."
+ "message": "Cleanflight documentation is available in Markdown and PDF formats. "
+ },
+ "defaultDocumentation1": {
+ "message": "The PDF manual appropriate to the firmware can be downloaded from the github releases page, here ."
+ },
+ "defaultDocumentation2": {
+ "message": "The Markdown latest online documentation is available here - you can switch to the appropriate version of the documentation by selecting the tag."
},
"defaultSupportHead": {
"message": "Support"
},
+ "defaultSupportSubline1": {
+ "message": "Support Scources"
+ },
+ "defaultSupportSubline2": {
+ "message": "Developer"
+ },
"defaultSupport": {
- "message": "For support please search the forums first or contact your vendor. RC Groups thread is here . MultiWii forums thread is here . Developers and users hang out in IRC channel on freenodeirc://irc.freenode.net/#cleanflight or Join via web client ."
+ "message": "For support please search the forums first or contact your vendor. "
},
+ "defaultSupport1": {
+ "message": "RC Groups thread "
+ },
+ "defaultSupport2": {
+ "message": "MultiWii forums thread "
+ },
+ "defaultSupport3": {
+ "message": "GitHub "
+ },
+ "defaultSupport4": {
+ "message": "IRC channel on freenode "
+ },
+ "defaultSupport5": {
+ "message": "Join via WebClient "
+ },
+
"initialSetupBackupAndRestoreApiVersion": {
"message": "Backup and restore functionality disabled. You have firmware with API version $1 , backup and restore requires $2 . Please backup your settings via the CLI, see Cleanflight documentation for procedure."
},
@@ -405,6 +445,88 @@
"message": "EEPROM saved "
},
+ "featureRX_PPM": {
+ "message": "PPM RX input"
+ },
+ "featureVBAT": {
+ "message": "Battery voltage monitoring"
+ },
+ "featureINFLIGHT_ACC_CAL": {
+ "message": "In-flight level calibration"
+ },
+ "featureRX_SERIAL": {
+ "message": "Serial-based receiver (SPEKSAT, SBUS, SUMD)"
+ },
+ "featureMOTOR_STOP": {
+ "message": "Don't spin the motors when armed"
+ },
+ "featureSERVO_TILT": {
+ "message": "Servo gimbal"
+ },
+ "featureSOFTSERIAL": {
+ "message": "Enable CPU based serial ports"
+ },
+ "featureSOFTSERIALTip": {
+ "message": "Configure ports on the Ports tab after enabling."
+ },
+ "featureGPS": {
+ "message": "GPS for navigation and telemetry"
+ },
+ "featureGPSTip": {
+ "message": "Configure port scenario first"
+ },
+ "featureFAILSAFE": {
+ "message": "Apply failsafe settings on RX signal loss"
+ },
+ "featureSONAR": {
+ "message": "Sonar"
+ },
+ "featureTELEMETRY": {
+ "message": "Telemetry output"
+ },
+ "featureCURRENT_METER": {
+ "message": "Battery current monitoring"
+ },
+ "feature3D": {
+ "message": "3D mode (for use with reversible ESCs)"
+ },
+ "featureRX_PARALLEL_PWM": {
+ "message": "PWM RX input (one wire per channel)"
+ },
+ "featureRX_MSP": {
+ "message": "MSP RX input (control via MSP port)"
+ },
+ "featureRSSI_ADC": {
+ "message": "Analog RSSI input"
+ },
+ "featureLED_STRIP": {
+ "message": "Multi-color RGB LED strip support"
+ },
+ "featureDISPLAY": {
+ "message": "OLED Screen Display"
+ },
+ "featureONESHOT125": {
+ "message": "ONESHOT ESC support"
+ },
+ "featureONESHOT125Tip": {
+ "message": "Disconnect flight battery and remove props before enabling."
+ },
+ "featureBLACKBOX": {
+ "message": "Blackbox flight data recorder"
+ },
+ "featureBLACKBOXTip": {
+ "message": "Configure via the BlackBox tab after enabling."
+ },
+ "featureCHANNEL_FORWARDING": {
+ "message": "Forward aux channels to servo outputs"
+ },
+ "featureTRANSPONDER": {
+ "message": "Race Transponder"
+ },
+ "featureTRANSPONDERTip": {
+ "message": "Configure via the Race Transponder tab after enabling."
+ },
+
"configurationFeatureEnabled": {
"message": "Enabled"
},
@@ -414,8 +536,6 @@
"configurationFeatureDescription": {
"message": "Description"
},
-
-
"configurationMixer": {
"message": "Mixer"
},
@@ -425,34 +545,41 @@
"configurationReceiver": {
"message": "Receiver Mode"
},
- "configurationFailsafe": {
- "message": "Receiver failsafe"
- },
"configurationRSSI": {
"message": "RSSI (Signal Strength)"
},
+ "configurationRSSIHelp": {
+ "message": "RSSI is a measurement of signal strength and is very handy so you know when your aircraft is going out of range or if it is suffering RF interference."
+ },
"configurationEscFeatures": {
"message": "ESC/Motor Features"
},
"configurationFeaturesHelp": {
"message": "Note: Not all combinations of features are valid. When the flight controller firmware detects invalid feature combinations conflicting features will be disabled.Note: Configure serial ports before enabling the features that will use the ports."
},
-
"configurationSerialRXHelp": {
"message": "Note: Remember to configure a Serial Port (via Ports tab) and choose a Serial Receiver Provider when using RX_SERIAL feature."
},
-
"configurationBoardAlignment": {
- "message": "Board Alignment"
+ "message": "Board and Sensor Alignment"
},
"configurationBoardAlignmentRoll": {
- "message": "Roll Adjustment [deg]"
+ "message": "Roll Degrees"
},
"configurationBoardAlignmentPitch": {
- "message": "Pitch Adjustment [deg]"
+ "message": "Pitch Degrees"
},
"configurationBoardAlignmentYaw": {
- "message": "Yaw Adjustment [deg]"
+ "message": "Yaw Degrees"
+ },
+ "configurationSensorAlignmentGyro": {
+ "message": "GYRO Alignment"
+ },
+ "configurationSensorAlignmentAcc": {
+ "message": "ACCEL Alignment"
+ },
+ "configurationSensorAlignmentMag": {
+ "message": "MAG Alignment"
},
"configurationAccelTrims": {
"message": "Accelerometer Trim"
@@ -471,7 +598,7 @@
},
"configurationDisarmKillSwitch": {
"message": "Disarm motors regardless of throttle value (When arming via AUX channel)"
- },
+ },
"configurationThrottleMinimum": {
"message": "Minimum Throttle"
},
@@ -481,15 +608,15 @@
"configurationThrottleMaximum": {
"message": "Maximum Throttle"
},
- "configurationThrottleFailsafe": {
- "message": "Failsafe Throttle"
- },
"configurationThrottleMinimumCommand": {
"message": "Minimum Command"
},
"configurationBatteryVoltage": {
"message": "Battery Voltage"
},
+ "configurationBatteryCurrent": {
+ "message": "Battery Current"
+ },
"configurationBatteryMinimum": {
"message": "Minimum Cell Voltage"
},
@@ -514,7 +641,7 @@
"configurationBatteryMultiwiiCurrent": {
"message": "Enable support for legacy Multiwii MSP current output"
},
- "configuration3d": {
+ "configuration3d": {
"message": "3D"
},
"configuration3dDeadbandLow": {
@@ -556,7 +683,6 @@
"configurationGPSHelp": {
"message": "Note: Remember to configure a Serial Port (via Ports tab) when using GPS feature."
},
-
"configurationSerialRX": {
"message": "Serial Receiver Provider"
},
@@ -594,6 +720,9 @@
"portsFunction_TELEMETRY_HOTT": {
"message": "HoTT"
},
+ "portsFunction_TELEMETRY_LTM": {
+ "message": "LTM"
+ },
"portsFunction_TELEMETRY_MSP": {
"message": "MSP"
},
@@ -674,6 +803,18 @@
"receiverRcRate": {
"message": "RC Rate"
},
+ "receiverDeadband": {
+ "message": "RC Deadband"
+ },
+ "receiverHelpDeadband": {
+ "message": "These are values (in us) by how much RC input can be different before it's considered valid. For transmitters with jitter on outputs, this value can be increased if rc inputs twitch while idle."
+ },
+ "receiverHelpYawDeadband": {
+ "message": "These are values (in us) by how much RC input can be different before it's considered valid. For transmitters with jitter on outputs, this value can be increased if rc inputs twitch while idle. This setting is for Yaw only. "
+ },
+ "receiverYawDeadband": {
+ "message": "Yaw Deadband"
+ },
"receiverRcExpo": {
"message": "RC Expo"
},
@@ -838,6 +979,60 @@
"adjustmentsFunction20": {
"message": "Roll D Adjustment"
},
+ "adjustmentsFunction21": {
+ "message": "Alt P Adjustment"
+ },
+ "adjustmentsFunction22": {
+ "message": "Alt I Adjustment"
+ },
+ "adjustmentsFunction23": {
+ "message": "Alt D Adjustment"
+ },
+ "adjustmentsFunction24": {
+ "message": "Vel P Adjustment"
+ },
+ "adjustmentsFunction25": {
+ "message": "Vel I Adjustment"
+ },
+ "adjustmentsFunction26": {
+ "message": "Vel D Adjustment"
+ },
+ "adjustmentsFunction27": {
+ "message": "MAG P Adjustment"
+ },
+ "adjustmentsFunction28": {
+ "message": "Pos P Adjustment"
+ },
+ "adjustmentsFunction29": {
+ "message": "Pos I Adjustment"
+ },
+ "adjustmentsFunction30": {
+ "message": "PosR P Adjustment"
+ },
+ "adjustmentsFunction31": {
+ "message": "PosR I Adjustment"
+ },
+ "adjustmentsFunction32": {
+ "message": "PosR D Adjustment"
+ },
+ "adjustmentsFunction33": {
+ "message": "NavR P Adjustment"
+ },
+ "adjustmentsFunction34": {
+ "message": "NavR I Adjustment"
+ },
+ "adjustmentsFunction35": {
+ "message": "NavR D Adjustment"
+ },
+ "adjustmentsFunction36": {
+ "message": "Level P Adjustment"
+ },
+ "adjustmentsFunction37": {
+ "message": "Level I Adjustment"
+ },
+ "adjustmentsFunction38": {
+ "message": "Level D Adjustment"
+ },
"adjustmentsSave": {
"message": "Save"
},
@@ -845,11 +1040,37 @@
"message": "EEPROM saved "
},
+ "transponderNotSupported": {
+ "message": "Your flight controller's firmware does not support transponder functionality."
+ },
+ "transponderHelp": {
+ "message": "Configure your transponder code here. Note: Only valid codes will be recognised by race timing systems. Valid transponder codes can be obtained from Seriously Pro ."
+ },
+ "transponderInformation": {
+ "message": "Transponders systems allow race organizers to time your laps. The transponder is fitted to your aircraft and when your aircraft passes the timing gate the track-side receiver registers your code and records your laptime. When fitting an IR based transponder your should ensure that it points outward from your aircraft towards the track-side receivers and that the light beam is not obstructed by your airframe, battery-straps, cables, propellers, etc."
+ },
+ "transponderConfiguration": {
+ "message": "Configuration"
+ },
+ "transponderData": {
+ "message": "Data"
+ },
+ "transponderDataHelp": {
+ "message": "Hexadecimal digits only, 0-9, A-F"
+ },
+ "transponderButtonSave": {
+ "message": "Save"
+ },
+ "transponderDataInvalid": {
+ "message": "Transponder data is invalid "
+ },
+ "transponderEepromSaved": {
+ "message": "EEPROM saved "
+ },
"servosFirmwareUpgradeRequired": {
- "message": "Servos requires firmware >= 1.10.0."
+ "message": "Servos requires firmware >= 1.10.0. and target support."
},
-
"servosChangeDirection": {
"message": "Change Direction in TX To Match"
},
@@ -893,6 +1114,15 @@
"gpsHead": {
"message": "GPS"
},
+ "gpsMapHead": {
+ "message": "Current GPS location"
+ },
+ "gpsMapMessage1": {
+ "message": "Please check your internet connection"
+ },
+ "gpsMapMessage2": {
+ "message": "Waiting for GPS 3D fix…"
+ },
"gps3dFix": {
"message": "3D Fix:"
},
@@ -934,7 +1164,7 @@
"message": "Motor Test Mode Notice: Moving the sliders will cause the motors to spin up . In order to prevent injury remove ALL propellers before using this feature. "
},
"motorsEnableControl": {
- "message": "I understand the risks, propellors are removed - Enable motor control."
+ "message": "I understand the risks, propellers are removed - Enable motor control."
},
"sensorsInfo": {
@@ -953,6 +1183,12 @@
"cliInputPlaceholder": {
"message": "Write your command here"
},
+ "cliEnter": {
+ "message": "CLI mode detected"
+ },
+ "cliReboot": {
+ "message": "CLI reboot detected"
+ },
"loggingNote": {
"message": "Data will be logged in this tab only , leaving the tab will cancel logging and application will return to its normal \"configurator\" state. You are free to select the global update period, data will be written into the log file every 1 second for performance reasons."
@@ -988,10 +1224,30 @@
"message": "Automatically loaded previous log file: $1 "
},
+ "blackboxNotSupported": {
+ "message": "Your flight controller's firmware does not support Blackbox logging."
+ },
+ "blackboxMaybeSupported": {
+ "message": "Your flight controller's firmware is too old to support this tab, or the Blackbox feature is disabled on the Configuration tab."
+ },
+ "blackboxConfiguration": {
+ "message": "Blackbox configuration"
+ },
+ "blackboxButtonSave": {
+ "message": "Save and reboot"
+ },
+
+ "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."
+ },
+ "sdcardNote": {
+ "message": "Flight logs can be recorded to your flight controller's onboard SD card slot."
+ },
+
"dataflashNote": {
- "message": "Blackbox flight logs can be recorded to your flight controller's onboard dataflash chip."
+ "message": "Flight logs can be recorded to your flight controller's onboard dataflash chip."
},
- "dataflashNotSupportedNote": {
+ "dataflashNotPresentNote": {
"message": "Your flight controller does not have a compatible dataflash chip available."
},
"dataflashFirmwareUpgradeRequired": {
@@ -1033,6 +1289,7 @@
"dataflashFileWriteFailed": {
"message": "Failed to write to the file you selected, are the permissions on that folder okay?"
},
+
"firmwareFlasherReleaseSummaryHead": {
"message": "Release info"
},
@@ -1089,25 +1346,25 @@
"message": "Available online firmware releases - Select the correct firmware appropriate for your board."
},
"firmwareFlasherNoRebootDescription": {
- "message": "Enable if you are flashing board with bootloader pins shorted"
+ "message": "Enable if you powered your FC while the bootloader pins are jumpered or have your FC's BOOT button pressed."
},
"firmwareFlasherFlashOnConnect": {
"message": "Flash on connect"
},
"firmwareFlasherFlashOnConnectDescription": {
- "message": "Attempt to flash the board automatically (triggered by newly detected serial port)"
+ "message": "Attempt to flash the board automatically (triggered by newly detected serial port)."
},
"firmwareFlasherFullChipErase": {
"message": "Full chip erase"
},
"firmwareFlasherFullChipEraseDescription": {
- "message": "Wipes all configuration data currently stored on the board"
+ "message": "Wipes all configuration data currently stored on the board."
},
"firmwareFlasherFlashDevelopmentFirmware": {
"message": "Use Development Firmware"
},
"firmwareFlasherFlashDevelopmentFirmwareDescription": {
- "message": "Flash most recent (untested) development firmware"
+ "message": "Flash most recent (untested) development firmware."
},
"firmwareFlasherManualBaud": {
"message": "Manual baud rate"
@@ -1116,10 +1373,10 @@
"message": "Manual selection of baud rate for boards that don't support the default speed or for flashing via bluetooth."
},
"firmwareFlasherShowDevelopmentReleases":{
- "message": "Show unstable releases"
+ "message": "Show unstable releases"
},
"firmwareFlasherShowDevelopmentReleasesDescription":{
- "message": "Show Release-Candidates and Development Releases"
+ "message": "Show Release-Candidates and Development Releases."
},
"firmwareFlasherOptionLabelSelectFirmware": {
"message": "Choose a Firmware / Board"
@@ -1151,11 +1408,17 @@
"firmwareFlasherMessage": {
"message": "Message:"
},
- "firmwareFlasherWarninghead": {
+ "firmwareFlasherWarningHead": {
"message": "Warning"
},
"firmwareFlasherWarningText": {
- "message": "Please do not try to flash non-cleanflight hardware with this firmware flasher. Do not disconnect the board or turn off your computer while flashing.Note: STM32 bootloader is stored in ROM, it cannot be bricked.Note: Auto-Connect is always disabled while you are inside firmware flasher.Note: Make sure you have a backup; some upgrades/downgrades will wipe your configuration.Note: If you have problems flashing try disconnecting all cables from your FC.Note: If you have lost comminication with your board then power off the board, jumper the bootloader pins, power on, enable 'No reboot sequence', enable 'Full chip erase', re-flash, then power off, remove bootloader jumper, power on and connect (For all firmware except OPBL firmware)."
+ "message": "Please do not try to flash non-cleanflight hardware with this firmware flasher. Do not disconnect the board or turn off your computer while flashing.Note: STM32 bootloader is stored in ROM, it cannot be bricked.Note: Auto-Connect is always disabled while you are inside firmware flasher.Note: Make sure you have a backup; some upgrades/downgrades will wipe your configuration.Note: If you have problems flashing try disconnecting all cables from your FC first, try rebooting, upgrade chrome, upgrade drivers. "
+ },
+ "firmwareFlasherRecoveryHead": {
+ "message": "Recovery / Lost communication"
+ },
+ "firmwareFlasherRecoveryText": {
+ "message": "If you have lost communication with your board follow these steps to restore communication: Power off Enable 'No reboot sequence', enable 'Full chip erase'. Jumper the BOOT pins or hold BOOT button. Power on (activity LED will NOT flash if done correctly). Release BOOT button if your FC has one. Flash with correct firmware (using manual baud rate if specified in your FC's manual). Power off. Remove BOOT jumper. Power on (activity LED should flash). Connect normally. "
},
"firmwareFlasherButtonLeave": {
"message": "Leave Firmware Flasher"
@@ -1182,6 +1445,7 @@
"ledStripEepromSaved": {
"message": "EEPROM saved "
},
+
"controlAxisRoll": {
"message": "Roll"
},
@@ -1242,6 +1506,7 @@
"controlAxisAux16": {
"message": "AUX 16"
},
+
"pidTuningBasic": {
"message": "Basic/Acro"
},
@@ -1265,11 +1530,95 @@
},
"pidTuningLevelD": {
"message": "Transition (Horizon)"
- },
- "pidHelp1": {
+ },
+ "pidTuningLevelHelp": {
"message": "The values below change the behaviour of the ANGLE and HORIZON flight modes. Different PID controllers handle the LEVEL values differently. Please check the documentation."
},
- "configHelp1": {
- "message": "RSSI is a measurement of signal strength and is very handy so you know when your aircraft isw going out of range or if it is suffering RF interference."
+ "configHelp2": {
+ "message": "Arbitrary board rotation in degrees, to allow mounting it sideways / upside down / rotated etc. When running external sensors, use the sensor alignments (Gyro, Acc, Mag) to define sensor position independent from board orientation. "
+ },
+ "failsafeFeaturesHelpOld": {
+ "message": "Failsafe configuration has changed considerably. Use Cleanflight v1.12.0+ to enable the improved configuration panel."
+ },
+ "failsafePaneTitleOld": {
+ "message": "Receiver failsafe"
+ },
+ "failsafeFeatureItemOld": {
+ "message": "Failsafe settings on RX signal loss"
+ },
+ "failsafeThrottleItemOld": {
+ "message": "Failsafe Throttle"
+ },
+ "failsafeFeaturesHelpNew": {
+ "message": "Failsafe has two stages. Stage 1 is entered when a flightchannel has an invalid pulse length, the receiver reports failsafe mode or there is no signal from the receiver at all, the channel fallback settings are applied to all channels and a short amount of time is provided to allow for recovery. Stage 2 is entered when the error condition takes longer than the configured guard time while the craft is armed , all channels will remain at the applied channel fallback setting unless overruled by the chosen procedure. Note: Prior to entering stage 1, channel fallback settings are also applied to individual AUX channels that have invalid pulses."
+ },
+ "failsafePulsrangeTitle": {
+ "message": "Valid Pulse Range Settings"
+ },
+ "failsafePulsrangeHelp": {
+ "message": "Pulses shorter than minimum or longer than maximum are invalid and will trigger application of individual channel fallback settings for AUX channels or entering stage 1 for flightchannels"
+ },
+ "failsafeRxMinUsecItem": {
+ "message": "Minimum length"
+ },
+ "failsafeRxMaxUsecItem": {
+ "message": "Maximum length"
+ },
+ "failsafeChannelFallbackSettingsTitle": {
+ "message": "Channel Fallback Settings"
+ },
+ "failsafeChannelFallbackSettingsHelp": {
+ "message": "These settings are applied to invalid individual AUX channels or to all channels when entering stage 1. Note: values are saved in steps of 25usec, so small changes disappear"
+ },
+ "failsafeChannelFallbackSettingsAuto": {
+ "message": "Auto means Roll, Pitch and Yaw to center and Throttle low. Hold means maintain the last good value received"
+ },
+ "failsafeChannelFallbackSettingsHold": {
+ "message": "Hold means maintain the last good value received. Set means the value given here will be used"
+ },
+ "failsafeStageTwoSettingsTitle": {
+ "message": "Stage 2 - Settings"
+ },
+ "failsafeFeatureItem": {
+ "message": "Failsafe Stage 2 enabled"
+ },
+ "failsafeFeatureHelp": {
+ "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 stage 2 activation after signal lost [1 = 0.1 sec.]"
+ },
+ "failsafeDelayHelp": {
+ "message": "Time for stage 1 to wait for recovery"
+ },
+ "failsafeThrottleLowItem": {
+ "message": "Failsafe Throttle Low Delay [1 = 0.1 sec.]"
+ },
+ "failsafeThrottleLowHelp": {
+ "message": "Just disarm the craft instead of executing the selected failsafe procedure when the throttle was low for this amount of time"
+ },
+ "failsafeThrottleItem": {
+ "message": "Throttle value used while landing"
+ },
+ "failsafeOffDelayItem": {
+ "message": "Delay for turning off the Motors during Failsafe [1 = 0.1 sec.]"
+ },
+ "failsafeOffDelayHelp": {
+ "message": "Time to stay in landing mode untill the motors are turned off and the craft is disarmed"
+ },
+ "failsafeSubTitle1": {
+ "message": "Stage 2 - Failsafe Procedure"
+ },
+ "failsafeProcedureItemSelect1": {
+ "message": "Land"
+ },
+ "failsafeProcedureItemSelect2": {
+ "message": "Drop"
+ },
+ "failsafeKillSwitchItem": {
+ "message": "Failsafe Kill Switch (setup Failsafe in Modes Tab)"
+ },
+ "failsafeKillSwitchHelp": {
+ "message": "Set this option to make the failsafe switch, configured in the modes tab, act as a direct kill switch, bypassing the selected failsafe procedure. Note: Arming is blocked with the failsafe kill switch in the ON position"
}
-}
\ No newline at end of file
+}
diff --git a/changelog.html b/changelog.html
index 84dbb40a3..608495e4d 100644
--- a/changelog.html
+++ b/changelog.html
@@ -1,3 +1,9 @@
+2015.12.15 - 1.2.0 - cleanflight
+
+ Support Cleanflight API 1.15.0.
+ Add new failsafe configuration.
+ Support IBUS Serial RX.
+
2015.11.28 - 1.1.0 - cleanflight
Support Cleanflight API 1.14.0.
diff --git a/css/dropdown-lists/css/style_lists.css b/css/dropdown-lists/css/style_lists.css
index e70485e37..772b808e7 100644
--- a/css/dropdown-lists/css/style_lists.css
+++ b/css/dropdown-lists/css/style_lists.css
@@ -111,13 +111,6 @@
z-index: 3;
}
-/* Dirty fix for Firefox adding padding where it shouldn't. */
-@-moz-document url-prefix() {
- .dropdown-select {
- padding-left: 6px;
- }
-}
-
.dropdown-dark {
background: #636363; /* NEW2 */
background: #3e403f; /* NEW */
diff --git a/css/opensans_webfontkit/fonts.css b/css/opensans_webfontkit/fonts.css
index 9cfc70c79..c8c9ba5da 100644
--- a/css/opensans_webfontkit/fonts.css
+++ b/css/opensans_webfontkit/fonts.css
@@ -24,7 +24,6 @@
font-style: normal;
}
-
@font-face {
font-family: 'open_sanslight';
src: url('opensans-light-webfont.eot');
@@ -37,7 +36,6 @@
font-style: normal;
}
-
@font-face {
font-family: 'open_sansitalic';
src: url('opensans-italic-webfont.eot');
@@ -50,7 +48,6 @@
font-style: normal;
}
-
@font-face {
font-family: 'open_sansbold_italic';
src: url('opensans-bolditalic-webfont.eot');
@@ -63,7 +60,6 @@
font-style: normal;
}
-
@font-face {
font-family: 'open_sansbold';
src: url('opensans-bold-webfont.eot');
@@ -76,45 +72,42 @@
font-style: normal;
}
-
/* Fonts shouldn't be transformed by browser.
Using specific fonts for bold, italic and bold_italic instead.*/
-i {
- font-family: 'open_sansitalic';
+i {
+ font-family: 'open_sansitalic';
font-weight: normal;
font-style: normal;
}
em {
- font-family: 'open_sansitalic';
- font-style:normal;
- font-weight: normal;
+ font-family: 'open_sansitalic';
+ font-style:normal;
+ font-weight: normal;
}
em strong {
- font-family: 'open_sansbold_italic';
- font-style:normal;
- font-weight: normal;
+ font-family: 'open_sansbold_italic';
+ font-style:normal;
+ font-weight: normal;
}
strong em {
- font-family: 'open_sansbold_italic';
- font-style:normal;
- font-weight: normal;
+ font-family: 'open_sansbold_italic';
+ font-style:normal;
+ font-weight: normal;
}
-
strong {
- font-family: 'open_sansbold';
- font-weight: normal;
+ font-family: 'open_sansbold';
+ font-weight: normal;
font-style: normal;
}
-
-b {
- font-family: 'open_sansbold';
- font-weight: normal;
- font-style: normal;
+b {
+ font-family: 'open_sansbold';
+ font-weight: normal;
+ font-style: normal;
}
\ No newline at end of file
diff --git a/css/opensans_webfontkit/specimen_files/grid_12-825-55-15.css b/css/opensans_webfontkit/specimen_files/grid_12-825-55-15.css
deleted file mode 100644
index 3d6aef783..000000000
--- a/css/opensans_webfontkit/specimen_files/grid_12-825-55-15.css
+++ /dev/null
@@ -1,129 +0,0 @@
-/*Notes about grid:
-Columns: 12
-Grid Width: 825px
-Column Width: 55px
-Gutter Width: 15px
--------------------------------*/
-
-
-
-.section {margin-bottom: 18px;
-}
-.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}
-.section {*zoom: 1;}
-
-.section .firstcolumn,
-.section .firstcol {margin-left: 0;}
-
-
-/* Border on left hand side of a column. */
-.border {
- padding-left: 7px;
- margin-left: 7px;
- border-left: 1px solid #eee;
-}
-
-/* Border with more whitespace, spans one column. */
-.colborder {
- padding-left: 42px;
- margin-left: 42px;
- border-left: 1px solid #eee;
-}
-
-
-
-/* The Grid Classes */
-.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12
-{margin-left: 15px;float: left;display: inline; overflow: hidden;}
-
-
-.width1, .grid1, .span-1 {width: 55px;}
-.width1_2cols,.grid1_2cols {width: 20px;}
-.width1_3cols,.grid1_3cols {width: 8px;}
-.width1_4cols,.grid1_4cols {width: 2px;}
-.input_width1 {width: 49px;}
-
-.width2, .grid2, .span-2 {width: 125px;}
-.width2_3cols,.grid2_3cols {width: 31px;}
-.width2_4cols,.grid2_4cols {width: 20px;}
-.input_width2 {width: 119px;}
-
-.width3, .grid3, .span-3 {width: 195px;}
-.width3_2cols,.grid3_2cols {width: 90px;}
-.width3_4cols,.grid3_4cols {width: 37px;}
-.input_width3 {width: 189px;}
-
-.width4, .grid4, .span-4 {width: 265px;}
-.width4_3cols,.grid4_3cols {width: 78px;}
-.input_width4 {width: 259px;}
-
-.width5, .grid5, .span-5 {width: 335px;}
-.width5_2cols,.grid5_2cols {width: 160px;}
-.width5_3cols,.grid5_3cols {width: 101px;}
-.width5_4cols,.grid5_4cols {width: 72px;}
-.input_width5 {width: 329px;}
-
-.width6, .grid6, .span-6 {width: 405px;}
-.width6_4cols,.grid6_4cols {width: 90px;}
-.input_width6 {width: 399px;}
-
-.width7, .grid7, .span-7 {width: 475px;}
-.width7_2cols,.grid7_2cols {width: 230px;}
-.width7_3cols,.grid7_3cols {width: 148px;}
-.width7_4cols,.grid7_4cols {width: 107px;}
-.input_width7 {width: 469px;}
-
-.width8, .grid8, .span-8 {width: 545px;}
-.width8_3cols,.grid8_3cols {width: 171px;}
-.input_width8 {width: 539px;}
-
-.width9, .grid9, .span-9 {width: 615px;}
-.width9_2cols,.grid9_2cols {width: 300px;}
-.width9_4cols,.grid9_4cols {width: 142px;}
-.input_width9 {width: 609px;}
-
-.width10, .grid10, .span-10 {width: 685px;}
-.width10_3cols,.grid10_3cols {width: 218px;}
-.width10_4cols,.grid10_4cols {width: 160px;}
-.input_width10 {width: 679px;}
-
-.width11, .grid11, .span-11 {width: 755px;}
-.width11_2cols,.grid11_2cols {width: 370px;}
-.width11_3cols,.grid11_3cols {width: 241px;}
-.width11_4cols,.grid11_4cols {width: 177px;}
-.input_width11 {width: 749px;}
-
-.width12, .grid12, .span-12 {width: 825px;}
-.input_width12 {width: 819px;}
-
-/* Subdivided grid spaces */
-.emptycols_left1, .prepend-1 {padding-left: 70px;}
-.emptycols_right1, .append-1 {padding-right: 70px;}
-.emptycols_left2, .prepend-2 {padding-left: 140px;}
-.emptycols_right2, .append-2 {padding-right: 140px;}
-.emptycols_left3, .prepend-3 {padding-left: 210px;}
-.emptycols_right3, .append-3 {padding-right: 210px;}
-.emptycols_left4, .prepend-4 {padding-left: 280px;}
-.emptycols_right4, .append-4 {padding-right: 280px;}
-.emptycols_left5, .prepend-5 {padding-left: 350px;}
-.emptycols_right5, .append-5 {padding-right: 350px;}
-.emptycols_left6, .prepend-6 {padding-left: 420px;}
-.emptycols_right6, .append-6 {padding-right: 420px;}
-.emptycols_left7, .prepend-7 {padding-left: 490px;}
-.emptycols_right7, .append-7 {padding-right: 490px;}
-.emptycols_left8, .prepend-8 {padding-left: 560px;}
-.emptycols_right8, .append-8 {padding-right: 560px;}
-.emptycols_left9, .prepend-9 {padding-left: 630px;}
-.emptycols_right9, .append-9 {padding-right: 630px;}
-.emptycols_left10, .prepend-10 {padding-left: 700px;}
-.emptycols_right10, .append-10 {padding-right: 700px;}
-.emptycols_left11, .prepend-11 {padding-left: 770px;}
-.emptycols_right11, .append-11 {padding-right: 770px;}
-.pull-1 {margin-left: -70px;}
-.push-1 {margin-right: -70px;margin-left: 18px;float: right;}
-.pull-2 {margin-left: -140px;}
-.push-2 {margin-right: -140px;margin-left: 18px;float: right;}
-.pull-3 {margin-left: -210px;}
-.push-3 {margin-right: -210px;margin-left: 18px;float: right;}
-.pull-4 {margin-left: -280px;}
-.push-4 {margin-right: -280px;margin-left: 18px;float: right;}
\ No newline at end of file
diff --git a/css/opensans_webfontkit/specimen_files/specimen_stylesheet.css b/css/opensans_webfontkit/specimen_files/specimen_stylesheet.css
deleted file mode 100644
index aecc43c32..000000000
--- a/css/opensans_webfontkit/specimen_files/specimen_stylesheet.css
+++ /dev/null
@@ -1,396 +0,0 @@
-@import url('grid_12-825-55-15.css');
-
-/*
- CSS Reset by Eric Meyer - Released under Public Domain
- http://meyerweb.com/eric/tools/css/reset/
-*/
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, font, img, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-b, u, i, center, dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend, table,
-caption, tbody, tfoot, thead, tr, th, td
- {margin: 0;padding: 0;border: 0;outline: 0;
- font-size: 100%;vertical-align: baseline;
- background: transparent;}
-body {line-height: 1;}
-ol, ul {list-style: none;}
-blockquote, q {quotes: none;}
-blockquote:before, blockquote:after,
-q:before, q:after {content: ''; content: none;}
-:focus {outline: 0;}
-ins {text-decoration: none;}
-del {text-decoration: line-through;}
-table {border-collapse: collapse;border-spacing: 0;}
-
-
-
-
-body {
- color: #000;
- background-color: #dcdcdc;
-}
-
-a {
- text-decoration: none;
- color: #1883ba;
-}
-
-h1{
- font-size: 32px;
- font-weight: normal;
- font-style: normal;
- margin-bottom: 18px;
-}
-
-h2{
- font-size: 18px;
-}
-
-#container {
- width: 865px;
- margin: 0px auto;
-}
-
-
-#header {
- padding: 20px;
- font-size: 36px;
- background-color: #000;
- color: #fff;
-}
-
-#header span {
- color: #666;
-}
-#main_content {
- background-color: #fff;
- padding: 60px 20px 20px;
-}
-
-
-#footer p {
- margin: 0;
- padding-top: 10px;
- padding-bottom: 50px;
- color: #333;
- font: 10px Arial, sans-serif;
-}
-
-.tabs {
- width: 100%;
- height: 31px;
- background-color: #444;
-}
-.tabs li {
- float: left;
- margin: 0;
- overflow: hidden;
- background-color: #444;
-}
-.tabs li a {
- display: block;
- color: #fff;
- text-decoration: none;
- font: bold 11px/11px 'Arial';
- text-transform: uppercase;
- padding: 10px 15px;
- border-right: 1px solid #fff;
-}
-
-.tabs li a:hover {
- background-color: #00b3ff;
-
-}
-
-.tabs li.active a {
- color: #000;
- background-color: #fff;
-}
-
-
-
-div.huge {
-
- font-size: 300px;
- line-height: 1em;
- padding: 0;
- letter-spacing: -.02em;
- overflow: hidden;
-}
-div.glyph_range {
- font-size: 72px;
- line-height: 1.1em;
-}
-
-.size10{ font-size: 10px; }
-.size11{ font-size: 11px; }
-.size12{ font-size: 12px; }
-.size13{ font-size: 13px; }
-.size14{ font-size: 14px; }
-.size16{ font-size: 16px; }
-.size18{ font-size: 18px; }
-.size20{ font-size: 20px; }
-.size24{ font-size: 24px; }
-.size30{ font-size: 30px; }
-.size36{ font-size: 36px; }
-.size48{ font-size: 48px; }
-.size60{ font-size: 60px; }
-.size72{ font-size: 72px; }
-.size90{ font-size: 90px; }
-
-
-.psample_row1 { height: 120px;}
-.psample_row1 { height: 120px;}
-.psample_row2 { height: 160px;}
-.psample_row3 { height: 160px;}
-.psample_row4 { height: 160px;}
-
-.psample {
- overflow: hidden;
- position: relative;
-}
-.psample p {
- line-height: 1.3em;
- display: block;
- overflow: hidden;
- margin: 0;
-}
-
-.psample span {
- margin-right: .5em;
-}
-
-.white_blend {
- width: 100%;
- height: 61px;
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);
- position: absolute;
- bottom: 0;
-}
-.black_blend {
- width: 100%;
- height: 61px;
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);
- position: absolute;
- bottom: 0;
-}
-.fullreverse {
- background: #000 !important;
- color: #fff !important;
- margin-left: -20px;
- padding-left: 20px;
- margin-right: -20px;
- padding-right: 20px;
- padding: 20px;
- margin-bottom:0;
-}
-
-
-.sample_table td {
- padding-top: 3px;
- padding-bottom:5px;
- padding-left: 5px;
- vertical-align: middle;
- line-height: 1.2em;
-}
-
-.sample_table td:first-child {
- background-color: #eee;
- text-align: right;
- padding-right: 5px;
- padding-left: 0;
- padding: 5px;
- font: 11px/12px "Courier New", Courier, mono;
-}
-
-code {
- white-space: pre;
- background-color: #eee;
- display: block;
- padding: 10px;
- margin-bottom: 18px;
- overflow: auto;
-}
-
-
-.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;}
-
-.box {
- padding: 18px;
- margin-bottom: 18px;
- background: #eee;
-}
-
-.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;}
-
-#bodycomparison {
- position: relative;
- overflow: hidden;
- font-size: 72px;
- height: 90px;
- white-space: nowrap;
-}
-
-#bodycomparison div{
- font-size: 72px;
- line-height: 90px;
- display: inline;
- margin: 0 15px 0 0;
- padding: 0;
-}
-
-#bodycomparison div span{
- font: 10px Arial;
- position: absolute;
- left: 0;
-}
-#xheight {
- float: none;
- position: absolute;
- color: #d9f3ff;
- font-size: 72px;
- line-height: 90px;
-}
-
-.fontbody {
- position: relative;
-}
-.arialbody{
- font-family: Arial;
- position: relative;
-}
-.verdanabody{
- font-family: Verdana;
- position: relative;
-}
-.georgiabody{
- font-family: Georgia;
- position: relative;
-}
-
-/* @group Layout page
- */
-
-#layout h1 {
- font-size: 36px;
- line-height: 42px;
- font-weight: normal;
- font-style: normal;
-}
-
-#layout h2 {
- font-size: 24px;
- line-height: 23px;
- font-weight: normal;
- font-style: normal;
-}
-
-#layout h3 {
- font-size: 22px;
- line-height: 1.4em;
- margin-top: 1em;
- font-weight: normal;
- font-style: normal;
-}
-
-
-#layout p.byline {
- font-size: 12px;
- margin-top: 18px;
- line-height: 12px;
- margin-bottom: 0;
-}
-#layout p {
- font-size: 14px;
- line-height: 21px;
- margin-bottom: .5em;
-}
-
-#layout p.large{
- font-size: 18px;
- line-height: 26px;
-}
-
-#layout .sidebar p{
- font-size: 12px;
- line-height: 1.4em;
-}
-
-#layout p.caption {
- font-size: 10px;
- margin-top: -16px;
- margin-bottom: 18px;
-}
-
-/* @end */
-
-/* @group Glyphs */
-
-#glyph_chart div{
- background-color: #d9f3ff;
- color: black;
- float: left;
- font-size: 36px;
- height: 1.2em;
- line-height: 1.2em;
- margin-bottom: 1px;
- margin-right: 1px;
- text-align: center;
- width: 1.2em;
- position: relative;
- padding: .6em .2em .2em;
-}
-
-#glyph_chart div p {
- position: absolute;
- left: 0;
- top: 0;
- display: block;
- text-align: center;
- font: bold 9px Arial, sans-serif;
- background-color: #3a768f;
- width: 100%;
- color: #fff;
- padding: 2px 0;
-}
-
-
-#glyphs h1 {
- font-family: Arial, sans-serif;
-}
-/* @end */
-
-/* @group Installing */
-
-#installing {
- font: 13px Arial, sans-serif;
-}
-
-#installing p,
-#glyphs p{
- line-height: 1.2em;
- margin-bottom: 18px;
- font: 13px Arial, sans-serif;
-}
-
-
-
-#installing h3{
- font-size: 15px;
- margin-top: 18px;
-}
-
-/* @end */
-
-#rendering h1 {
- font-family: Arial, sans-serif;
-}
-.render_table td {
- font: 11px "Courier New", Courier, mono;
- vertical-align: middle;
-}
-
-
diff --git a/images/icons/cf_failsafe_procedure1.svg b/images/icons/cf_failsafe_procedure1.svg
new file mode 100644
index 000000000..3b7f5c5d2
--- /dev/null
+++ b/images/icons/cf_failsafe_procedure1.svg
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/images/icons/cf_failsafe_procedure2.svg b/images/icons/cf_failsafe_procedure2.svg
new file mode 100644
index 000000000..fd80bd069
--- /dev/null
+++ b/images/icons/cf_failsafe_procedure2.svg
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/images/icons/cf_failsafe_procedure3.svg b/images/icons/cf_failsafe_procedure3.svg
new file mode 100644
index 000000000..c649e1fd5
--- /dev/null
+++ b/images/icons/cf_failsafe_procedure3.svg
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/images/icons/cf_failsafe_procedure4.svg b/images/icons/cf_failsafe_procedure4.svg
new file mode 100644
index 000000000..db707e4b9
--- /dev/null
+++ b/images/icons/cf_failsafe_procedure4.svg
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/images/icons/cf_icon_failsafe_grey.svg b/images/icons/cf_icon_failsafe_grey.svg
new file mode 100644
index 000000000..dd586e1f2
--- /dev/null
+++ b/images/icons/cf_icon_failsafe_grey.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/images/icons/cf_icon_failsafe_white.svg b/images/icons/cf_icon_failsafe_white.svg
new file mode 100644
index 000000000..59b5b9f7a
--- /dev/null
+++ b/images/icons/cf_icon_failsafe_white.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/images/icons/cf_icon_pitch.svg b/images/icons/cf_icon_pitch.svg
new file mode 100644
index 000000000..c037ba834
--- /dev/null
+++ b/images/icons/cf_icon_pitch.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/images/icons/cf_icon_position.png b/images/icons/cf_icon_position.png
new file mode 100644
index 000000000..48f8c9da1
Binary files /dev/null and b/images/icons/cf_icon_position.png differ
diff --git a/images/icons/cf_icon_roll.svg b/images/icons/cf_icon_roll.svg
new file mode 100644
index 000000000..17901652e
--- /dev/null
+++ b/images/icons/cf_icon_roll.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/images/icons/cf_icon_sdcard.svg b/images/icons/cf_icon_sdcard.svg
new file mode 100644
index 000000000..c429edd82
--- /dev/null
+++ b/images/icons/cf_icon_sdcard.svg
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
diff --git a/images/icons/cf_icon_transponder_grey.svg b/images/icons/cf_icon_transponder_grey.svg
new file mode 100644
index 000000000..2ca2c8499
--- /dev/null
+++ b/images/icons/cf_icon_transponder_grey.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/images/icons/cf_icon_transponder_white.svg b/images/icons/cf_icon_transponder_white.svg
new file mode 100644
index 000000000..a58f74b19
--- /dev/null
+++ b/images/icons/cf_icon_transponder_white.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/images/icons/cf_icon_yaw.svg b/images/icons/cf_icon_yaw.svg
new file mode 100644
index 000000000..c8e7d8fbb
--- /dev/null
+++ b/images/icons/cf_icon_yaw.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/js/backup_restore.js b/js/backup_restore.js
index 6cf002b8e..fb0cd6c44 100644
--- a/js/backup_restore.js
+++ b/js/backup_restore.js
@@ -11,20 +11,7 @@ function configuration_backup(callback) {
'apiVersion': CONFIG.apiVersion,
'profiles': [],
};
-
- MSP.send_message(MSP_codes.MSP_STATUS, false, false, function () {
- activeProfile = CONFIG.profile;
- select_profile();
- });
-
- function select_profile() {
- if (activeProfile > 0) {
- MSP.send_message(MSP_codes.MSP_SELECT_SETTING, [0], false, fetch_specific_data);
- } else {
- fetch_specific_data();
- }
- }
-
+
var profileSpecificData = [
MSP_codes.MSP_PID_CONTROLLER,
MSP_codes.MSP_PID,
@@ -38,13 +25,29 @@ function configuration_backup(callback) {
function update_profile_specific_data_list() {
if (semver.lt(CONFIG.apiVersion, "1.12.0")) {
profileSpecificData.push(MSP_codes.MSP_CHANNEL_FORWARDING);
- } else {
+ } else {
profileSpecificData.push(MSP_codes.MSP_SERVO_MIX_RULES);
}
+ if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
+ profileSpecificData.push(MSP_codes.MSP_RC_DEADBAND);
+ }
}
update_profile_specific_data_list();
+ MSP.send_message(MSP_codes.MSP_STATUS, false, false, function () {
+ activeProfile = CONFIG.profile;
+ select_profile();
+ });
+
+ function select_profile() {
+ if (activeProfile > 0) {
+ MSP.send_message(MSP_codes.MSP_SELECT_SETTING, [0], false, fetch_specific_data);
+ } else {
+ fetch_specific_data();
+ }
+ }
+
function fetch_specific_data() {
var fetchingProfile = 0,
codeKey = 0;
@@ -68,6 +71,9 @@ function configuration_backup(callback) {
'AdjustmentRanges': jQuery.extend(true, [], ADJUSTMENT_RANGES)
});
+ if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
+ configuration.profiles[fetchingProfile].RCdeadband = jQuery.extend(true, {}, RC_deadband);
+ }
codeKey = 0;
fetchingProfile++;
@@ -99,6 +105,12 @@ function configuration_backup(callback) {
if (semver.gte(CONFIG.apiVersion, "1.14.0")) {
uniqueData.push(MSP_codes.MSP_3D);
}
+ if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
+ uniqueData.push(MSP_codes.MSP_SENSOR_ALIGNMENT);
+ uniqueData.push(MSP_codes.MSP_RX_CONFIG);
+ uniqueData.push(MSP_codes.MSP_FAILSAFE_CONFIG);
+ uniqueData.push(MSP_codes.MSP_RXFAIL_CONFIG);
+ }
}
update_unique_data_list();
@@ -126,6 +138,12 @@ function configuration_backup(callback) {
if (semver.gte(CONFIG.apiVersion, "1.14.0")) {
configuration._3D = jQuery.extend(true, {}, _3D);
}
+ if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
+ configuration.SENSOR_ALIGNMENT = jQuery.extend(true, {}, SENSOR_ALIGNMENT);
+ configuration.RX_CONFIG = jQuery.extend(true, {}, RX_CONFIG);
+ configuration.FAILSAFE_CONFIG = jQuery.extend(true, {}, FAILSAFE_CONFIG);
+ configuration.RXFAIL_CONFIG = jQuery.extend(true, [], RXFAIL_CONFIG);
+ }
save();
}
@@ -207,8 +225,9 @@ function configuration_backup(callback) {
});
});
}
-}
+}
+
function configuration_restore(callback) {
var chosenFileEntry = null;
@@ -288,6 +307,7 @@ function configuration_restore(callback) {
}
return semver.gte(generated, required);
}
+
function migrate(configuration) {
var appliedMigrationsCount = 0;
@@ -458,8 +478,8 @@ function configuration_restore(callback) {
for (var i = 0; i < configuration.profiles[profileIndex].ServoConfig.length; i++) {
var servoConfig = profiles[profileIndex].ServoConfig;
- servoConfig[i].angleAtMin = 90;
- servoConfig[i].angleAtMax = 90;
+ servoConfig[i].angleAtMin = 45;
+ servoConfig[i].angleAtMax = 45;
servoConfig[i].reversedInputSources = 0;
// set the rate to 0 if an invalid value is detected.
@@ -507,10 +527,86 @@ function configuration_restore(callback) {
appliedMigrationsCount++;
}
+
+ if (compareVersions(migratedVersion, '0.66.0') && !compareVersions(configuration.apiVersion, '1.15.0')) {
+ // api 1.15 exposes RCdeadband and sensor alignment
+
+
+ for (var profileIndex = 0; profileIndex < configuration.profiles.length; profileIndex++) {
+ if (configuration.profiles[profileIndex].RCdeadband == undefined) {
+ configuration.profiles[profileIndex].RCdeadband = {
+ deadband: 0,
+ yaw_deadband: 0,
+ alt_hold_deadband: 40,
+ };
+ }
+ }
+ if (configuration.SENSOR_ALIGNMENT == undefined) {
+ configuration.SENSOR_ALIGNMENT = {
+ align_gyro: 0,
+ align_acc: 0,
+ align_mag: 0
+ };
+ }
+
+ // api 1.15 exposes RX_CONFIG, FAILSAFE_CONFIG and RXFAIL_CONFIG configuration
+
+ if (configuration.RX_CONFIG == undefined) {
+ configuration.RX_CONFIG = {
+ serialrx_provider: 0,
+ spektrum_sat_bind: 0,
+ midrc: 1500,
+ mincheck: 1100,
+ maxcheck: 1900,
+ rx_min_usec: 885,
+ rx_max_usec: 2115
+ };
+ }
+
+ if (configuration.FAILSAFE_CONFIG == undefined) {
+ configuration.FAILSAFE_CONFIG = {
+ failsafe_delay: 10,
+ failsafe_off_delay: 200,
+ failsafe_throttle: 1000,
+ failsafe_kill_switch: 0,
+ failsafe_throttle_low_delay: 100,
+ failsafe_procedure: 0
+ };
+ }
+
+ if (configuration.RXFAIL_CONFIG == undefined) {
+ configuration.RXFAIL_CONFIG = [
+ {mode: 0, value: 1500},
+ {mode: 0, value: 1500},
+ {mode: 0, value: 1500},
+ {mode: 0, value: 875}
+ ];
+
+ for (var i = 0; i < 14; i++) {
+ var rxfailChannel = {
+ mode: 1,
+ value: 1500
+ };
+ configuration.RXFAIL_CONFIG.push(rxfailChannel);
+ }
+ }
+
+ appliedMigrationsCount++;
+ }
+
+ if (compareVersions(migratedVersion, '1.2.0')) {
+ // old version of the configurator incorrectly had a 'disabled' option for GPS SBAS mode.
+ if (MISC.gps_ubx_sbas < 0) {
+ MISC.gps_ubx_sbas = 0;
+ }
+ migratedVersion = '1.2.0';
+
+ appliedMigrationsCount++;
+ }
+
if (appliedMigrationsCount > 0) {
GUI.log(chrome.i18n.getMessage('configMigrationSuccessful', [appliedMigrationsCount]));
- }
-
+ }
return true;
}
@@ -526,6 +622,10 @@ function configuration_restore(callback) {
MSP_codes.MSP_SET_ACC_TRIM
];
+ if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
+ profileSpecificData.push(MSP_codes.MSP_SET_RC_DEADBAND);
+ }
+
MSP.send_message(MSP_codes.MSP_STATUS, false, false, function () {
activeProfile = CONFIG.profile;
select_profile();
@@ -552,6 +652,7 @@ function configuration_restore(callback) {
SERVO_RULES = configuration.profiles[profile].ServoRules;
MODE_RANGES = configuration.profiles[profile].ModeRanges;
ADJUSTMENT_RANGES = configuration.profiles[profile].AdjustmentRanges;
+ RC_deadband = configuration.profiles[profile].RCdeadband;
}
function upload_using_specific_commands() {
@@ -617,6 +718,11 @@ function configuration_restore(callback) {
if (semver.gte(CONFIG.apiVersion, "1.14.0")) {
uniqueData.push(MSP_codes.MSP_SET_3D);
}
+ if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
+ uniqueData.push(MSP_codes.MSP_SET_SENSOR_ALIGNMENT);
+ uniqueData.push(MSP_codes.MSP_SET_RX_CONFIG);
+ uniqueData.push(MSP_codes.MSP_SET_FAILSAFE_CONFIG);
+ }
}
function load_objects() {
@@ -628,6 +734,10 @@ function configuration_restore(callback) {
ARMING_CONFIG = configuration.ARMING_CONFIG;
FC_CONFIG = configuration.FC_CONFIG;
_3D = configuration._3D;
+ SENSOR_ALIGNMENT = configuration.SENSOR_ALIGNMENT;
+ RX_CONFIG = configuration.RX_CONFIG;
+ FAILSAFE_CONFIG = configuration.FAILSAFE_CONFIG;
+ RXFAIL_CONFIG = configuration.RXFAIL_CONFIG;
}
function send_unique_data_item() {
@@ -637,7 +747,7 @@ function configuration_restore(callback) {
send_unique_data_item();
});
} else {
- MSP.send_message(MSP_codes.MSP_EEPROM_WRITE, false, false, send_led_strip_config);
+ send_led_strip_config();
}
}
@@ -650,9 +760,21 @@ function configuration_restore(callback) {
}
function send_led_strip_config() {
- MSP.sendLedStripConfig(reboot);
+ MSP.sendLedStripConfig(send_rxfail_config);
}
+ function send_rxfail_config() {
+ if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
+ MSP.sendRxFailConfig(save_to_eeprom);
+ } else {
+ save_to_eeprom();
+ }
+ }
+
+ function save_to_eeprom() {
+ MSP.send_message(MSP_codes.MSP_EEPROM_WRITE, false, false, reboot);
+ }
+
function reboot() {
GUI.log(chrome.i18n.getMessage('eeprom_saved_ok'));
@@ -676,4 +798,4 @@ function configuration_restore(callback) {
upload();
}
-}
\ No newline at end of file
+}
diff --git a/js/boards.js b/js/boards.js
index 7163e96b1..05e1d8fdb 100644
--- a/js/boards.js
+++ b/js/boards.js
@@ -48,6 +48,10 @@ var BOARD_DEFINITIONS = [
name: "SP Racing F3",
identifier: "SRF3",
vcp: false
+ }, {
+ name: "SP Racing F3 Mini",
+ identifier: "SRFM",
+ vcp: true
}, {
name: "MotoLab",
identifier: "MOTO",
diff --git a/js/data_storage.js b/js/data_storage.js
index 02aa21ea5..3c56846f3 100755
--- a/js/data_storage.js
+++ b/js/data_storage.js
@@ -1,7 +1,7 @@
'use strict';
var CONFIGURATOR = {
- 'releaseDate': 1448724175378, // new Date().getTime() - Sat Nov 28 2015 15:22:51 GMT+0000 (GMT Standard Time)
+ 'releaseDate': 1454638198085, // new Date().getTime() - Fri Feb 05 2016 03:09:53 GMT+0100
// all versions are specified and compared using semantic versioning http://semver.org/
'apiVersionAccepted': '1.2.0',
@@ -14,167 +14,3 @@ var CONFIGURATOR = {
'cliActive': false,
'cliValid': false
};
-
-var CONFIG = {
- apiVersion: "0.0.0",
- flightControllerIdentifier: '',
- flightControllerVersion: '',
- version: 0,
- buildInfo: '',
- multiType: 0,
- msp_version: 0, // not specified using semantic versioning
- capability: 0,
- cycleTime: 0,
- i2cError: 0,
- activeSensors: 0,
- mode: 0,
- profile: 0,
- uid: [0, 0, 0],
- accelerometerTrims: [0, 0]
-};
-
-var 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
-};
-
-var LED_STRIP = [];
-
-var PID = {
- controller: 0
-};
-
-var PID_names = [];
-var PIDs = new Array(10);
-for (var i = 0; i < 10; i++) {
- PIDs[i] = new Array(3);
-}
-
-var RC_MAP = [];
-
-// defaults
-// roll, pitch, yaw, throttle, aux 1, ... aux n
-var RC = {
- active_channels: 0,
- channels: new Array(32)
-};
-
-var RC_tuning = {
- RC_RATE: 0,
- RC_EXPO: 0,
- roll_pitch_rate: 0, // pre 1.7 api only
- roll_rate: 0,
- pitch_rate: 0,
- yaw_rate: 0,
- dynamic_THR_PID: 0,
- throttle_MID: 0,
- throttle_EXPO: 0,
- dynamic_THR_breakpoint: 0,
- RC_YAW_EXPO: 0
-};
-
-var AUX_CONFIG = [];
-var AUX_CONFIG_IDS = [];
-
-var MODE_RANGES = [];
-var ADJUSTMENT_RANGES = [];
-
-var SERVO_CONFIG = [];
-var SERVO_RULES = [];
-
-var SERIAL_CONFIG = {
- ports: [],
-
- // pre 1.6 settings
- mspBaudRate: 0,
- gpsBaudRate: 0,
- gpsPassthroughBaudRate: 0,
- cliBaudRate: 0,
-};
-
-var SENSOR_DATA = {
- gyroscope: [0, 0, 0],
- accelerometer: [0, 0, 0],
- magnetometer: [0, 0, 0],
- altitude: 0,
- sonar: 0,
- kinematics: [0.0, 0.0, 0.0],
- debug: [0, 0, 0, 0]
-};
-
-var MOTOR_DATA = new Array(8);
-var SERVO_DATA = new Array(8);
-
-var GPS_DATA = {
- fix: 0,
- numSat: 0,
- lat: 0,
- lon: 0,
- alt: 0,
- speed: 0,
- ground_course: 0,
- distanceToHome: 0,
- ditectionToHome: 0,
- update: 0,
-
- // baseflight specific gps stuff
- chn: [],
- svid: [],
- quality: [],
- cno: []
-};
-
-var ANALOG = {
- voltage: 0,
- mAhdrawn: 0,
- rssi: 0,
- amperage: 0
-};
-
-var ARMING_CONFIG = {
- auto_disarm_delay: 0,
- disarm_kill_switch: 0
-};
-
-var FC_CONFIG = {
- loopTime: 0
-};
-
-var MISC = {
- midrc: 0,
- minthrottle: 0,
- maxthrottle: 0,
- mincommand: 0,
- failsafe_throttle: 0,
- gps_type: 0,
- gps_baudrate: 0,
- gps_ubx_sbas: 0,
- multiwiicurrentoutput: 0,
- rssi_channel: 0,
- placeholder2: 0,
- mag_declination: 0, // not checked
- vbatscale: 0,
- vbatmincellvoltage: 0,
- vbatmaxcellvoltage: 0,
- vbatwarningcellvoltage: 0
-};
-
-var _3D = {
- deadband3d_low: 0,
- deadband3d_high: 0,
- neutral3d: 0,
- deadband3d_throttle: 0
-};
-
-var DATAFLASH = {
- ready: false,
- sectors: 0,
- totalSize: 0,
- usedSize: 0
-};
diff --git a/js/fc.js b/js/fc.js
new file mode 100644
index 000000000..089403be7
--- /dev/null
+++ b/js/fc.js
@@ -0,0 +1,259 @@
+'use strict';
+
+// define all the global variables that are uses to hold FC state
+var CONFIG;
+var BF_CONFIG;
+var LED_STRIP;
+var PID;
+var PID_names;
+var PIDs;
+var RC_MAP;
+var RC;
+var RC_tuning;
+var AUX_CONFIG;
+var AUX_CONFIG_IDS;
+var MODE_RANGES;
+var ADJUSTMENT_RANGES;
+var SERVO_CONFIG;
+var SERVO_RULES;
+var SERIAL_CONFIG;
+var SENSOR_DATA;
+var MOTOR_DATA;
+var SERVO_DATA;
+var GPS_DATA;
+var ANALOG;
+var ARMING_CONFIG;
+var FC_CONFIG;
+var MISC;
+var _3D;
+var DATAFLASH;
+var SDCARD;
+var BLACKBOX;
+var TRANSPONDER;
+var RC_deadband;
+var SENSOR_ALIGNMENT;
+var RX_CONFIG;
+var FAILSAFE_CONFIG;
+var RXFAIL_CONFIG;
+
+var FC = {
+ resetState: function() {
+ CONFIG = {
+ apiVersion: "0.0.0",
+ flightControllerIdentifier: '',
+ flightControllerVersion: '',
+ version: 0,
+ buildInfo: '',
+ multiType: 0,
+ msp_version: 0, // not specified using semantic versioning
+ capability: 0,
+ cycleTime: 0,
+ i2cError: 0,
+ activeSensors: 0,
+ mode: 0,
+ profile: 0,
+ uid: [0, 0, 0],
+ accelerometerTrims: [0, 0]
+ };
+
+ 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
+ };
+
+ LED_STRIP = [];
+
+ PID = {
+ controller: 0
+ };
+
+ PID_names = [];
+ PIDs = new Array(10);
+ for (var i = 0; i < 10; i++) {
+ PIDs[i] = new Array(3);
+ }
+
+ RC_MAP = [];
+
+ // defaults
+ // roll, pitch, yaw, throttle, aux 1, ... aux n
+ RC = {
+ active_channels: 0,
+ channels: new Array(32)
+ };
+
+ RC_tuning = {
+ RC_RATE: 0,
+ RC_EXPO: 0,
+ roll_pitch_rate: 0, // pre 1.7 api only
+ roll_rate: 0,
+ pitch_rate: 0,
+ yaw_rate: 0,
+ dynamic_THR_PID: 0,
+ throttle_MID: 0,
+ throttle_EXPO: 0,
+ dynamic_THR_breakpoint: 0,
+ RC_YAW_EXPO: 0
+ };
+
+ AUX_CONFIG = [];
+ AUX_CONFIG_IDS = [];
+
+ MODE_RANGES = [];
+ ADJUSTMENT_RANGES = [];
+
+ SERVO_CONFIG = [];
+ SERVO_RULES = [];
+
+ SERIAL_CONFIG = {
+ ports: [],
+
+ // pre 1.6 settings
+ mspBaudRate: 0,
+ gpsBaudRate: 0,
+ gpsPassthroughBaudRate: 0,
+ cliBaudRate: 0,
+ };
+
+ SENSOR_DATA = {
+ gyroscope: [0, 0, 0],
+ accelerometer: [0, 0, 0],
+ magnetometer: [0, 0, 0],
+ altitude: 0,
+ sonar: 0,
+ kinematics: [0.0, 0.0, 0.0],
+ debug: [0, 0, 0, 0]
+ };
+
+ MOTOR_DATA = new Array(8);
+ SERVO_DATA = new Array(8);
+
+ GPS_DATA = {
+ fix: 0,
+ numSat: 0,
+ lat: 0,
+ lon: 0,
+ alt: 0,
+ speed: 0,
+ ground_course: 0,
+ distanceToHome: 0,
+ ditectionToHome: 0,
+ update: 0,
+
+ // baseflight specific gps stuff
+ chn: [],
+ svid: [],
+ quality: [],
+ cno: []
+ };
+
+ ANALOG = {
+ voltage: 0,
+ mAhdrawn: 0,
+ rssi: 0,
+ amperage: 0
+ };
+
+ ARMING_CONFIG = {
+ auto_disarm_delay: 0,
+ disarm_kill_switch: 0
+ };
+
+ FC_CONFIG = {
+ loopTime: 0
+ };
+
+ MISC = {
+ midrc: 0,
+ minthrottle: 0,
+ maxthrottle: 0,
+ mincommand: 0,
+ failsafe_throttle: 0,
+ gps_type: 0,
+ gps_baudrate: 0,
+ gps_ubx_sbas: 0,
+ multiwiicurrentoutput: 0,
+ rssi_channel: 0,
+ placeholder2: 0,
+ mag_declination: 0, // not checked
+ vbatscale: 0,
+ vbatmincellvoltage: 0,
+ vbatmaxcellvoltage: 0,
+ vbatwarningcellvoltage: 0
+ };
+
+ _3D = {
+ deadband3d_low: 0,
+ deadband3d_high: 0,
+ neutral3d: 0,
+ deadband3d_throttle: 0
+ };
+
+ DATAFLASH = {
+ ready: false,
+ supported: false,
+ sectors: 0,
+ totalSize: 0,
+ usedSize: 0
+ };
+
+ SDCARD = {
+ supported: false,
+ state: 0,
+ filesystemLastError: 0,
+ freeSizeKB: 0,
+ totalSizeKB: 0,
+ };
+
+ BLACKBOX = {
+ supported: false,
+ blackboxDevice: 0,
+ blackboxRateNum: 1,
+ blackboxRateDenom: 1
+ };
+
+ TRANSPONDER = {
+ supported: false,
+ data: []
+ };
+
+ RC_deadband = {
+ deadband: 0,
+ yaw_deadband: 0,
+ alt_hold_deadband: 0
+ };
+
+ SENSOR_ALIGNMENT = {
+ align_gyro: 0,
+ align_acc: 0,
+ align_mag: 0
+ };
+
+ RX_CONFIG = {
+ serialrx_provider: 0,
+ maxcheck: 0,
+ midrc: 0,
+ mincheck: 0,
+ spektrum_sat_bind: 0,
+ rx_min_usec: 0,
+ rx_max_usec: 0
+ };
+
+ FAILSAFE_CONFIG = {
+ failsafe_delay: 0,
+ failsafe_off_delay: 0,
+ failsafe_throttle: 0,
+ failsafe_kill_switch: 0,
+ failsafe_throttle_low_delay: 0,
+ failsafe_procedure: 0
+ };
+
+ RXFAIL_CONFIG = [];
+ }
+};
\ No newline at end of file
diff --git a/js/gui.js b/js/gui.js
index 57ba81007..84972d4a5 100644
--- a/js/gui.js
+++ b/js/gui.js
@@ -18,6 +18,8 @@ var GUI_control = function () {
'help'
];
this.defaultAllowedTabsWhenConnected = [
+ 'failsafe',
+ 'transponder',
'adjustments',
'auxiliary',
'cli',
@@ -25,7 +27,7 @@ var GUI_control = function () {
'gps',
'led_strip',
'logging',
- 'dataflash',
+ 'onboard_logging',
'modes',
'motors',
'pid_tuning',
@@ -274,10 +276,12 @@ GUI_control.prototype.content_ready = function (callback) {
$(elem).removeClass('togglemedium');
});
- // Build link to in-use CF version documentation
- var documentationButton = $('div#content #button-documentation');
- documentationButton.html("Documentation for "+CONFIG.flightControllerVersion);
- documentationButton.attr("href","https://github.com/cleanflight/cleanflight/tree/v{0}/docs".format(CONFIG.flightControllerVersion));
+ if (CONFIGURATOR.connectionValid) {
+ // Build link to in-use CF version documentation
+ var documentationButton = $('div#content #button-documentation');
+ documentationButton.html("Documentation for " + CONFIG.flightControllerVersion);
+ documentationButton.attr("href","https://github.com/cleanflight/cleanflight/tree/v{0}/docs".format(CONFIG.flightControllerVersion));
+ }
// loading tooltip
jQuery(document).ready(function($) {
@@ -286,8 +290,7 @@ GUI_control.prototype.content_ready = function (callback) {
});
$('.cf_tip').each(function() {
- $(this).jBox('Tooltip', {
- content: $(this).children('.cf_tooltiptext'),
+ $(this).jBox('Tooltip', {
delayOpen: 100,
delayClose: 100,
position: {
diff --git a/js/msp.js b/js/msp.js
index cfde7dc0f..266280928 100644
--- a/js/msp.js
+++ b/js/msp.js
@@ -13,6 +13,8 @@ var MSP_codes = {
MSP_SET_CHANNEL_FORWARDING: 33,
MSP_MODE_RANGES: 34,
MSP_SET_MODE_RANGE: 35,
+ MSP_RX_CONFIG: 44,
+ MSP_SET_RX_CONFIG: 45,
MSP_LED_STRIP_CONFIG: 48,
MSP_SET_LED_STRIP_CONFIG: 49,
MSP_ADJUSTMENT_RANGES: 52,
@@ -29,6 +31,15 @@ var MSP_codes = {
MSP_DATAFLASH_ERASE: 72,
MSP_LOOP_TIME: 73,
MSP_SET_LOOP_TIME: 74,
+ MSP_FAILSAFE_CONFIG: 75,
+ MSP_SET_FAILSAFE_CONFIG: 76,
+ MSP_RXFAIL_CONFIG: 77,
+ MSP_SET_RXFAIL_CONFIG: 78,
+ MSP_SDCARD_SUMMARY: 79,
+ MSP_BLACKBOX_CONFIG: 80,
+ MSP_SET_BLACKBOX_CONFIG: 81,
+ MSP_TRANSPONDER_CONFIG: 82,
+ MSP_SET_TRANSPONDER_CONFIG: 83,
// Multiwii MSP commands
MSP_IDENT: 100,
@@ -53,6 +64,8 @@ var MSP_codes = {
MSP_BOXIDS: 119,
MSP_SERVO_CONFIGURATIONS: 120,
MSP_3D: 124,
+ MSP_RC_DEADBAND: 125,
+ MSP_SENSOR_ALIGNMENT: 126,
MSP_SET_RAW_RC: 200,
MSP_SET_RAW_GPS: 201,
@@ -69,6 +82,9 @@ var MSP_codes = {
MSP_SET_SERVO_CONFIGURATION: 212,
MSP_SET_MOTOR: 214,
MSP_SET_3D: 217,
+ MSP_SET_RC_DEADBAND: 218,
+ MSP_SET_RESET_CURR_PID: 219,
+ MSP_SET_SENSOR_ALIGNMENT: 220,
// MSP_BIND: 240,
@@ -227,6 +243,7 @@ var MSP = {
CONFIG.activeSensors = data.getUint16(4, 1);
CONFIG.mode = data.getUint32(6, 1);
CONFIG.profile = data.getUint8(10);
+ $('select[name="profilechange"]').val(CONFIG.profile);
sensor_status(CONFIG.activeSensors);
$('span.i2c-error').text(CONFIG.i2cError);
@@ -495,8 +512,8 @@ var MSP = {
'max': data.getInt16(i + 2, 1),
'middle': data.getInt16(i + 4, 1),
'rate': data.getInt8(i + 6),
- 'angleAtMin': 90,
- 'angleAtMax': 90,
+ 'angleAtMin': 45,
+ 'angleAtMax': 45,
'indexOfChannelToForward': undefined,
'reversedInputSources': 0
};
@@ -513,6 +530,18 @@ var MSP = {
}
}
break;
+ case MSP_codes.MSP_RC_DEADBAND:
+ var offset = 0;
+ RC_deadband.deadband = data.getUint8(offset++, 1);
+ RC_deadband.yaw_deadband = data.getUint8(offset++, 1);
+ RC_deadband.alt_hold_deadband = data.getUint8(offset++, 1);
+ break;
+ case MSP_codes.MSP_SENSOR_ALIGNMENT:
+ var offset = 0;
+ SENSOR_ALIGNMENT.align_gyro = data.getUint8(offset++, 1);
+ SENSOR_ALIGNMENT.align_acc = data.getUint8(offset++, 1);
+ SENSOR_ALIGNMENT.align_mag = data.getUint8(offset++, 1);
+ break;
case MSP_codes.MSP_SET_RAW_RC:
break;
case MSP_codes.MSP_SET_RAW_GPS:
@@ -755,6 +784,7 @@ var MSP = {
ADJUSTMENT_RANGES.push(adjustmentRange);
}
break;
+
case MSP_codes.MSP_CHANNEL_FORWARDING:
for (var i = 0; i < data.byteLength && i < SERVO_CONFIG.length; i ++) {
var channelIndex = data.getUint8(i);
@@ -766,6 +796,58 @@ var MSP = {
}
break;
+ case MSP_codes.MSP_RX_CONFIG:
+ var offset = 0;
+ RX_CONFIG.serialrx_provider = data.getUint8(offset, 1);
+ offset++;
+ RX_CONFIG.maxcheck = data.getUint16(offset, 1);
+ offset += 2;
+ RX_CONFIG.midrc = data.getUint16(offset, 1);
+ offset += 2;
+ RX_CONFIG.mincheck = data.getUint16(offset, 1);
+ offset += 2;
+ RX_CONFIG.spektrum_sat_bind = data.getUint8(offset, 1);
+ offset++;
+ RX_CONFIG.rx_min_usec = data.getUint16(offset, 1);
+ offset += 2;
+ RX_CONFIG.rx_max_usec = data.getUint16(offset, 1);
+ offset += 2;
+ break;
+
+ case MSP_codes.MSP_FAILSAFE_CONFIG:
+ var offset = 0;
+ FAILSAFE_CONFIG.failsafe_delay = data.getUint8(offset, 1);
+ offset++;
+ FAILSAFE_CONFIG.failsafe_off_delay = data.getUint8(offset, 1);
+ offset++;
+ FAILSAFE_CONFIG.failsafe_throttle = data.getUint16(offset, 1);
+ offset += 2;
+ if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
+ FAILSAFE_CONFIG.failsafe_kill_switch = data.getUint8(offset, 1);
+ offset++;
+ FAILSAFE_CONFIG.failsafe_throttle_low_delay = data.getUint16(offset, 1);
+ offset += 2;
+ FAILSAFE_CONFIG.failsafe_procedure = data.getUint8(offset, 1);
+ offset++;
+ }
+ break;
+
+ case MSP_codes.MSP_RXFAIL_CONFIG:
+ RXFAIL_CONFIG = []; // empty the array as new data is coming in
+
+ var channelCount = data.byteLength / 3;
+
+ var offset = 0;
+ for (var i = 0; offset < data.byteLength && i < channelCount; i++, offset++) {
+ var rxfailChannel = {
+ mode: data.getUint8(offset++, 1),
+ value: data.getUint16(offset++, 1)
+ };
+ RXFAIL_CONFIG.push(rxfailChannel);
+ }
+ break;
+
+
case MSP_codes.MSP_LED_STRIP_CONFIG:
LED_STRIP = [];
@@ -811,17 +893,22 @@ var MSP = {
break;
case MSP_codes.MSP_DATAFLASH_SUMMARY:
if (data.byteLength >= 13) {
- DATAFLASH.ready = (data.getUint8(0) & 1) != 0;
+ var
+ flags = data.getUint8(0);
+ DATAFLASH.ready = (flags & 1) != 0;
+ DATAFLASH.supported = (flags & 2) != 0 || DATAFLASH.ready;
DATAFLASH.sectors = data.getUint32(1, 1);
DATAFLASH.totalSize = data.getUint32(5, 1);
DATAFLASH.usedSize = data.getUint32(9, 1);
} else {
// Firmware version too old to support MSP_DATAFLASH_SUMMARY
DATAFLASH.ready = false;
+ DATAFLASH.supported = false;
DATAFLASH.sectors = 0;
DATAFLASH.totalSize = 0;
DATAFLASH.usedSize = 0;
}
+ update_dataflash_global();
break;
case MSP_codes.MSP_DATAFLASH_READ:
// No-op, let callback handle it
@@ -829,6 +916,36 @@ var MSP = {
case MSP_codes.MSP_DATAFLASH_ERASE:
console.log("Data flash erase begun...");
break;
+ case MSP_codes.MSP_SDCARD_SUMMARY:
+ var flags = data.getUint8(0);
+
+ SDCARD.supported = (flags & 0x01) != 0;
+ SDCARD.state = data.getUint8(1);
+ SDCARD.filesystemLastError = data.getUint8(2);
+ SDCARD.freeSizeKB = data.getUint32(3, 1);
+ SDCARD.totalSizeKB = data.getUint32(7, 1);
+ break;
+ case MSP_codes.MSP_BLACKBOX_CONFIG:
+ BLACKBOX.supported = (data.getUint8(0) & 1) != 0;
+ BLACKBOX.blackboxDevice = data.getUint8(1);
+ BLACKBOX.blackboxRateNum = data.getUint8(2);
+ BLACKBOX.blackboxRateDenom = data.getUint8(3);
+ break;
+ case MSP_codes.MSP_SET_BLACKBOX_CONFIG:
+ console.log("Blackbox config saved");
+ break;
+ case MSP_codes.MSP_TRANSPONDER_CONFIG:
+ var offset = 0;
+ TRANSPONDER.supported = (data.getUint8(offset++) & 1) != 0;
+ TRANSPONDER.data = [];
+ var bytesRemaining = data.byteLength - offset;
+ for (var i = 0; i < bytesRemaining; i++) {
+ TRANSPONDER.data.push(data.getUint8(offset++));
+ }
+ break;
+ case MSP_codes.MSP_SET_TRANSPONDER_CONFIG:
+ console.log("Transponder config saved");
+ break;
case MSP_codes.MSP_SET_MODE_RANGE:
console.log('Mode range saved');
break;
@@ -848,7 +965,27 @@ var MSP = {
case MSP_codes.MSP_SET_ARMING_CONFIG:
console.log('Arming config saved');
break;
-
+ case MSP_codes.MSP_SET_RESET_CURR_PID:
+ console.log('Current PID profile reset');
+ break;
+ case MSP_codes.MSP_SET_3D:
+ console.log('3D settings saved');
+ break;
+ case MSP_codes.MSP_SET_RC_DEADBAND:
+ console.log('Rc controls settings saved');
+ break;
+ case MSP_codes.MSP_SET_SENSOR_ALIGNMENT:
+ console.log('Sensor alignment saved');
+ break;
+ case MSP_codes.MSP_SET_RX_CONFIG:
+ console.log('Rx config saved');
+ break;
+ case MSP_codes.MSP_SET_RXFAIL_CONFIG:
+ console.log('Rxfail config saved');
+ break;
+ case MSP_codes.MSP_SET_FAILSAFE_CONFIG:
+ console.log('Failsafe config saved');
+ break;
default:
console.log('Unknown code detected: ' + code);
} else {
@@ -1034,7 +1171,7 @@ MSP.crunch = function (code) {
buffer.push(lowByte(RC_tuning.dynamic_THR_breakpoint));
buffer.push(highByte(RC_tuning.dynamic_THR_breakpoint));
}
- if (semver.gte(CONFIG.apiVersion, "1.10.0")) {
+ if (semver.gte(CONFIG.apiVersion, "1.10.0")) {
buffer.push(Math.round(RC_tuning.RC_YAW_EXPO * 100));
}
break;
@@ -1090,6 +1227,41 @@ MSP.crunch = function (code) {
buffer.push(Math.round(MISC.vbatmaxcellvoltage * 10));
buffer.push(Math.round(MISC.vbatwarningcellvoltage * 10));
break;
+
+ case MSP_codes.MSP_SET_RX_CONFIG:
+ buffer.push(RX_CONFIG.serialrx_provider);
+ buffer.push(lowByte(RX_CONFIG.maxcheck));
+ buffer.push(highByte(RX_CONFIG.maxcheck));
+ buffer.push(lowByte(RX_CONFIG.midrc));
+ buffer.push(highByte(RX_CONFIG.midrc));
+ buffer.push(lowByte(RX_CONFIG.mincheck));
+ buffer.push(highByte(RX_CONFIG.mincheck));
+ buffer.push(RX_CONFIG.spektrum_sat_bind);
+ buffer.push(lowByte(RX_CONFIG.rx_min_usec));
+ buffer.push(highByte(RX_CONFIG.rx_min_usec));
+ buffer.push(lowByte(RX_CONFIG.rx_max_usec));
+ buffer.push(highByte(RX_CONFIG.rx_max_usec));
+ break;
+
+ case MSP_codes.MSP_SET_FAILSAFE_CONFIG:
+ buffer.push(FAILSAFE_CONFIG.failsafe_delay);
+ buffer.push(FAILSAFE_CONFIG.failsafe_off_delay);
+ buffer.push(lowByte(FAILSAFE_CONFIG.failsafe_throttle));
+ buffer.push(highByte(FAILSAFE_CONFIG.failsafe_throttle));
+ if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
+ buffer.push(FAILSAFE_CONFIG.failsafe_kill_switch);
+ buffer.push(lowByte(FAILSAFE_CONFIG.failsafe_throttle_low_delay));
+ buffer.push(highByte(FAILSAFE_CONFIG.failsafe_throttle_low_delay));
+ buffer.push(FAILSAFE_CONFIG.failsafe_procedure);
+ }
+ break;
+
+ case MSP_codes.MSP_SET_TRANSPONDER_CONFIG:
+ for (var i = 0; i < TRANSPONDER.data.length; i++) {
+ buffer.push(TRANSPONDER.data[i]);
+ }
+ break;
+
case MSP_codes.MSP_SET_CHANNEL_FORWARDING:
for (var i = 0; i < SERVO_CONFIG.length; i++) {
var out = SERVO_CONFIG[i].indexOfChannelToForward;
@@ -1151,8 +1323,20 @@ MSP.crunch = function (code) {
buffer.push(highByte(_3D.neutral3d));
buffer.push(lowByte(_3D.deadband3d_throttle));
buffer.push(highByte(_3D.deadband3d_throttle));
+ break;
+
+ case MSP_codes.MSP_SET_RC_DEADBAND:
+ buffer.push(RC_deadband.deadband);
+ buffer.push(RC_deadband.yaw_deadband);
+ buffer.push(RC_deadband.alt_hold_deadband);
break;
-
+
+ case MSP_codes.MSP_SET_SENSOR_ALIGNMENT:
+ buffer.push(SENSOR_ALIGNMENT.align_gyro);
+ buffer.push(SENSOR_ALIGNMENT.align_acc);
+ buffer.push(SENSOR_ALIGNMENT.align_mag);
+ break
+
default:
return false;
}
@@ -1176,6 +1360,19 @@ MSP.setRawRx = function(channels) {
MSP.send_message(MSP_codes.MSP_SET_RAW_RC, buffer, false);
}
+MSP.sendBlackboxConfiguration = function(onDataCallback) {
+ var
+ message = [
+ BLACKBOX.blackboxDevice & 0xFF,
+ BLACKBOX.blackboxRateNum & 0xFF,
+ BLACKBOX.blackboxRateDenom & 0xFF
+ ];
+
+ MSP.send_message(MSP_codes.MSP_SET_BLACKBOX_CONFIG, message, false, function(response) {
+ onDataCallback();
+ });
+}
+
/**
* Send a request to read a block of data from the dataflash at the given address and pass that address and a dataview
* of the returned data to the given callback (or null for the data if an error occured).
@@ -1210,10 +1407,11 @@ MSP.sendServoConfigurations = function(onCompleteCallback) {
if (SERVO_CONFIG.length == 0) {
onCompleteCallback();
+ } else {
+ nextFunction();
}
-
- nextFunction();
-
+
+
function send_next_servo_configuration() {
var buffer = [];
@@ -1300,11 +1498,10 @@ MSP.sendModeRanges = function(onCompleteCallback) {
if (MODE_RANGES.length == 0) {
onCompleteCallback();
+ } else {
+ send_next_mode_range();
}
-
- send_next_mode_range();
-
function send_next_mode_range() {
var modeRange = MODE_RANGES[modeRangeIndex];
@@ -1333,11 +1530,11 @@ MSP.sendAdjustmentRanges = function(onCompleteCallback) {
if (ADJUSTMENT_RANGES.length == 0) {
onCompleteCallback();
+ } else {
+ send_next_adjustment_range();
}
-
- send_next_adjustment_range();
-
+
function send_next_adjustment_range() {
var adjustmentRange = ADJUSTMENT_RANGES[adjustmentRangeIndex];
@@ -1369,9 +1566,9 @@ MSP.sendLedStripConfig = function(onCompleteCallback) {
if (LED_STRIP.length == 0) {
onCompleteCallback();
+ } else {
+ send_next_led_strip_config();
}
-
- send_next_led_strip_config();
function send_next_led_strip_config() {
@@ -1438,3 +1635,42 @@ MSP.serialPortFunctionsToMask = function(functions) {
}
return mask;
}
+
+MSP.sendRxFailConfig = function(onCompleteCallback) {
+ var nextFunction = send_next_rxfail_config;
+
+ var rxFailIndex = 0;
+
+ if (RXFAIL_CONFIG.length == 0) {
+ onCompleteCallback();
+ } else {
+ send_next_rxfail_config();
+ }
+
+ function send_next_rxfail_config() {
+
+ var rxFail = RXFAIL_CONFIG[rxFailIndex];
+
+ var buffer = [];
+ buffer.push(rxFailIndex);
+ buffer.push(rxFail.mode);
+ buffer.push(lowByte(rxFail.value));
+ buffer.push(highByte(rxFail.value));
+
+ // prepare for next iteration
+ rxFailIndex++;
+ if (rxFailIndex == RXFAIL_CONFIG.length) {
+ nextFunction = onCompleteCallback;
+
+ }
+ MSP.send_message(MSP_codes.MSP_SET_RXFAIL_CONFIG, buffer, false, nextFunction);
+ }
+};
+
+MSP.SDCARD_STATE_NOT_PRESENT = 0;
+MSP.SDCARD_STATE_FATAL = 1;
+MSP.SDCARD_STATE_CARD_INIT = 2;
+MSP.SDCARD_STATE_FS_INIT = 3;
+MSP.SDCARD_STATE_READY = 4;
+
+
diff --git a/js/protocols/stm32usbdfu.js b/js/protocols/stm32usbdfu.js
index 604394bca..2fcb872d3 100644
--- a/js/protocols/stm32usbdfu.js
+++ b/js/protocols/stm32usbdfu.js
@@ -62,10 +62,7 @@ var STM32DFU_protocol = function () {
dfuERROR: 10 // An error has occurred. Awaiting the DFU_CLRSTATUS request.
};
- // Assume 2 kB page size (STM32F303)
- // Cannot read chip ID using DFU protocol and Chrome doesn't provide the interface
- // description string with flash page size information (at least on Linux anyway)
- this.page_size = 2048;
+ this.flash_layout = { 'start_address': 0, 'total_size': 0, 'sectors': []};
};
STM32DFU_protocol.prototype.connect = function (device, hex, options, callback) {
@@ -180,6 +177,150 @@ STM32DFU_protocol.prototype.resetDevice = function (callback) {
});
};
+STM32DFU_protocol.prototype.getString = function (index, callback) {
+ var self = this;
+
+ chrome.usb.controlTransfer(self.handle, {
+ 'direction': 'in',
+ 'recipient': 'device',
+ 'requestType': 'standard',
+ 'request': 6,
+ 'value': 0x300 | index,
+ 'index': 0, // specifies language
+ 'length': 255 // max length to retreive
+ }, function (result) {
+ if(self.checkChromeError()) {
+ console.log('USB transfer failed! ' + result.resultCode);
+ callback("", result.resultCode);
+ return;
+ }
+ var view = new DataView(result.data);
+ var length = view.getUint8(0);
+ var descriptor = "";
+ for (var i = 2; i < length; i += 2) {
+ var charCode = view.getUint16(i, true);
+ descriptor += String.fromCharCode(charCode);
+ }
+ callback(descriptor, result.resultCode);
+ });
+}
+
+STM32DFU_protocol.prototype.getInterfaceDescriptor = function (_interface, callback) {
+ var self = this;
+
+ chrome.usb.controlTransfer(this.handle, {
+ 'direction': 'in',
+ 'recipient': 'device',
+ 'requestType': 'standard',
+ 'request': 6,
+ 'value': 0x200,
+ 'index': 0,
+ 'length': 18 + _interface * 9
+ }, function (result) {
+ if(self.checkChromeError()) {
+ console.log('USB transfer failed! ' + result.resultCode);
+ callback({}, result.resultCode);
+ return;
+ }
+
+ var buf = new Uint8Array(result.data, 9 + _interface * 9);
+ var descriptor = {
+ 'bLength': buf[0],
+ 'bDescriptorType': buf[1],
+ 'bInterfaceNumber': buf[2],
+ 'bAlternateSetting': buf[3],
+ 'bNumEndpoints': buf[4],
+ 'bInterfaceClass': buf[5],
+ 'bInterfaceSubclass': buf[6],
+ 'bInterfaceProtocol': buf[7],
+ 'iInterface': buf[8]
+ };
+
+ callback(descriptor, result.resultCode);
+ });
+}
+
+STM32DFU_protocol.prototype.getFlashInfo = function (_interface, callback) {
+ var self = this;
+
+ self.getInterfaceDescriptor(0, function (descriptor, resultCode) {
+ if (resultCode) {
+ callback({}, resultCode);
+ return;
+ }
+
+ self.getString(descriptor.iInterface, function (str, resultCode) {
+ if (resultCode) {
+ callback({}, resultCode);
+ return;
+ }
+
+ // F303: "@Internal Flash /0x08000000/128*0002Kg"
+ // F407: "@Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg"
+ // split main into [location, start_addr, sectors]
+ var tmp1 = str.split('/');
+ if (tmp1.length != 3 || !tmp1[0].startsWith("@Internal Flash")) {
+ callback({}, -1);
+ return;
+ }
+ var type = tmp1[0].trim().replace('@', '');
+ var start_address = parseInt(tmp1[1]);
+
+ // split sectors into array
+ var sectors = [];
+ var total_size = 0;
+ var tmp2 = tmp1[2].split(',');
+ if (tmp2.length < 1) {
+ callback({}, -2);
+ return;
+ }
+ for (var i = 0; i < tmp2.length; i++) {
+ // split into [num_pages, page_size]
+ var tmp3 = tmp2[i].split('*');
+ if (tmp3.length != 2) {
+ callback({}, -3);
+ return;
+ }
+ var num_pages = parseInt(tmp3[0]);
+ var page_size = parseInt(tmp3[1]);
+ if (!page_size) {
+ callback({}, -4);
+ return;
+ }
+ var unit = tmp3[1].slice(-2, -1);
+ switch (unit) {
+ case 'M':
+ page_size *= 1024; // fall through to K as well
+ case 'K':
+ page_size *= 1024;
+ break;
+ default:
+ callback({}, -4);
+ return;
+ }
+
+ sectors.push({
+ 'num_pages' : num_pages,
+ 'start_address': start_address + total_size,
+ 'page_size' : page_size,
+ 'total_size' : num_pages * page_size
+ });
+
+ total_size += num_pages * page_size;
+ }
+
+ var flash = {
+ 'type' : type,
+ 'start_address': start_address,
+ 'sectors' : sectors,
+ 'total_size' : total_size
+ }
+
+ callback(flash, resultCode);
+ });
+ });
+}
+
STM32DFU_protocol.prototype.controlTransfer = function (direction, request, value, _interface, length, data, callback) {
var self = this;
@@ -301,8 +442,27 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
switch (step) {
case 1:
- self.clearStatus(function () {
- self.upload_procedure(2);
+ self.getFlashInfo(0, function (flash, resultCode) {
+ if (resultCode != 0) {
+ console.log('Failed to detect chip flash info, resultCode: ' + resultCode);
+ self.upload_procedure(99);
+ } else {
+ self.flash_layout = flash;
+ self.available_flash_size = flash.total_size - (self.hex.start_linear_address - flash.start_address);
+
+ GUI.log(chrome.i18n.getMessage('dfu_device_flash_info', (flash.total_size / 1024).toString()));
+
+ if (self.hex.bytes_total > self.available_flash_size) {
+ GUI.log(chrome.i18n.getMessage('dfu_error_image_size',
+ [(self.hex.bytes_total / 1024.0).toFixed(1),
+ (self.available_flash_size / 1024.0).toFixed(1)]));
+ self.upload_procedure(99);
+ } else {
+ self.clearStatus(function () {
+ self.upload_procedure(2);
+ });
+ }
+ }
});
break;
case 2:
@@ -336,17 +496,41 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
} else {
// local erase
- var max_address = self.hex.data[self.hex.data.length - 1].address + self.hex.data[self.hex.data.length - 1].bytes - 0x8000000,
- erase_pages_n = Math.ceil(max_address / self.page_size),
- page = 0;
+ // find out which pages to erase
+ var erase_pages = [];
+ for (var i = 0; i < self.flash_layout.sectors.length; i++) {
+ for (var j = 0; j < self.flash_layout.sectors[i].num_pages; j++) {
+ var page_start = self.flash_layout.sectors[i].start_address + j * self.flash_layout.sectors[i].page_size;
+ var page_end = page_start + self.flash_layout.sectors[i].page_size - 1;
+ for (var k = 0; k < self.hex.data.length; k++) {
+ var starts_in_page = self.hex.data[k].address >= page_start && self.hex.data[k].address <= page_end;
+ var end_address = self.hex.data[k].address + self.hex.data[k].bytes - 1;
+ var ends_in_page = end_address >= page_start && end_address <= page_end;
+ var spans_page = self.hex.data[k].address < page_start && end_address > page_end;
+ if (starts_in_page || ends_in_page || spans_page) {
+ var idx = erase_pages.findIndex(function (element, index, array) {
+ return element.sector == i && element.page == j;
+ });
+ if (idx == -1)
+ erase_pages.push({'sector': i, 'page': j});
+ }
+ }
+ }
+ }
$('span.progressLabel').text('Erasing ...');
- console.log('Executing local chip erase');
- console.log('Erasing. page: 0x00 - 0x' + erase_pages_n.toString(16));
+ console.log('Executing local chip erase');
+
+ var page = 0;
+ var total_erased = 0; // bytes
var erase_page = function() {
- var page_addr = page * self.page_size + 0x8000000;
+ var page_addr = erase_pages[page].page * self.flash_layout.sectors[erase_pages[page].sector].page_size +
+ self.flash_layout.sectors[erase_pages[page].sector].start_address;
var cmd = [0x41, page_addr & 0xff, (page_addr >> 8) & 0xff, (page_addr >> 16) & 0xff, (page_addr >> 24) & 0xff];
+ total_erased += self.flash_layout.sectors[erase_pages[page].sector].page_size;
+ console.log('Erasing. sector ' + erase_pages[page].sector +
+ ', page ' + erase_pages[page].page + ' @ 0x' + page_addr.toString(16));
self.controlTransfer('out', self.request.DNLOAD, 0, 0, 0, cmd, function () {
self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) {
@@ -357,24 +541,24 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) {
if (data[4] == self.state.dfuDNLOAD_IDLE) {
// update progress bar
- self.progress_bar_e.val((page + 1) / erase_pages_n * 100);
+ self.progress_bar_e.val((page + 1) / erase_pages.length * 100);
page++;
- if(page == erase_pages_n) {
+ if(page == erase_pages.length) {
console.log("Erase: complete");
- GUI.log(chrome.i18n.getMessage('dfu_erased_kilobytes', (erase_pages_n * self.page_size / 1024).toString()));
+ GUI.log(chrome.i18n.getMessage('dfu_erased_kilobytes', (total_erased / 1024).toString()));
self.upload_procedure(4);
}
else
erase_page();
} else {
- console.log('Failed to erase page 0x' + self.current_page.toString(16));
+ console.log('Failed to erase page 0x' + page_addr.toString(16));
self.upload_procedure(99);
}
});
}, delay);
} else {
- console.log('Failed to initiate page erase, page 0x' + self.current_page.toString(16));
+ console.log('Failed to initiate page erase, page 0x' + page_addr.toString(16));
self.upload_procedure(99);
}
});
diff --git a/js/serial.js b/js/serial.js
index 7284c993f..03b0adf50 100644
--- a/js/serial.js
+++ b/js/serial.js
@@ -68,12 +68,44 @@ var serial = {
});
}
break;
+
+ case 'break':
+ // This occurs on F1 boards with old firmware during reboot
+ case 'overrun':
+ // wait 50 ms and attempt recovery
+ self.error = info.error;
+ setTimeout(function() {
+ chrome.serial.setPaused(info.connectionId, false, function() {
+ self.getInfo(function (info) {
+ if (info.paused) {
+ // assume unrecoverable, disconnect
+ console.log('SERIAL: Connection did not recover from ' + self.error + ' condition, disconnecting');
+ GUI.log('Unrecoverable failure of serial connection, disconnecting...');
+ googleAnalytics.sendException('Serial: ' + self.error + ' - unrecoverable', false);
+
+ if (GUI.connected_to || GUI.connecting_to) {
+ $('a.connect').click();
+ } else {
+ self.disconnect();
+ }
+ }
+ else {
+ console.log('SERIAL: Connection recovered from ' + self.error + ' condition');
+ googleAnalytics.sendException('Serial: ' + self.error + ' - recovered', false);
+ }
+ });
+ });
+ }, 50);
+ break;
+
case 'timeout':
// TODO
break;
+
case 'device_lost':
// TODO
break;
+
case 'disconnected':
// TODO
break;
diff --git a/js/serial_backend.js b/js/serial_backend.js
index 57a02655f..cef54589f 100755
--- a/js/serial_backend.js
+++ b/js/serial_backend.js
@@ -178,6 +178,7 @@ function onOpen(openInfo) {
}
}, 10000);
+ FC.resetState();
// request configuration data
MSP.send_message(MSP_codes.MSP_API_VERSION, false, false, function () {
@@ -250,13 +251,21 @@ function onConnect() {
$('div#connectbutton a.connect_state').text(chrome.i18n.getMessage('disconnect')).addClass('active');
$('div#connectbutton a.connect').addClass('active');
$('#tabs ul.mode-disconnected').hide();
- $('#tabs ul.mode-connected').show();
-
+ $('#tabs ul.mode-connected').show();
+
+ MSP.send_message(MSP_codes.MSP_STATUS, false, false);
+
+ MSP.send_message(MSP_codes.MSP_DATAFLASH_SUMMARY, false, false);
+
var sensor_state = $('#sensor-status');
sensor_state.show();
-
+
var port_picker = $('#portsinput');
port_picker.hide();
+
+ var dataflash = $('#dataflash_wrapper_global');
+ dataflash.show();
+
}
function onClosed(result) {
@@ -269,12 +278,14 @@ function onClosed(result) {
$('#tabs ul.mode-connected').hide();
$('#tabs ul.mode-disconnected').show();
- var port_picker = $('#portsinput');
- port_picker.show();
-
var sensor_state = $('#sensor-status');
sensor_state.hide();
-
+
+ var port_picker = $('#portsinput');
+ port_picker.show();
+
+ var dataflash = $('#dataflash_wrapper_global');
+ dataflash.hide();
}
function read_serial(info) {
@@ -374,7 +385,34 @@ function highByte(num) {
function lowByte(num) {
return 0x00FF & num;
-}
+}function update_dataflash_global() {
+ var supportsDataflash = DATAFLASH.totalSize > 0;
+ if (supportsDataflash){
+
+ $(".noflash_global").css({
+ display: 'none'
+ });
+
+ $(".dataflash-contents_global").css({
+ display: 'block'
+ });
+
+ $(".dataflash-free_global").css({
+ width: (100-(DATAFLASH.totalSize - DATAFLASH.usedSize) / DATAFLASH.totalSize * 100) + "%",
+ display: 'block'
+ });
+ $(".dataflash-free_global div").text('Dataflash: free ' + formatFilesize(DATAFLASH.totalSize - DATAFLASH.usedSize));
+ } else {
+ $(".noflash_global").css({
+ display: 'block'
+ });
+
+ $(".dataflash-contents_global").css({
+ display: 'none'
+ });
+ }
+
+ }
function specificByte(num, pos) {
return 0x000000FF & (num >> (8 * pos));
@@ -392,3 +430,45 @@ function bit_clear(num, bit) {
return num & ~(1 << bit);
}
+function update_dataflash_global() {
+ function formatFilesize(bytes) {
+ if (bytes < 1024) {
+ return bytes + "B";
+ }
+ var kilobytes = bytes / 1024;
+
+ if (kilobytes < 1024) {
+ return Math.round(kilobytes) + "kB";
+ }
+
+ var megabytes = kilobytes / 1024;
+
+ return megabytes.toFixed(1) + "MB";
+ }
+
+ var supportsDataflash = DATAFLASH.totalSize > 0;
+
+ if (supportsDataflash){
+ $(".noflash_global").css({
+ display: 'none'
+ });
+
+ $(".dataflash-contents_global").css({
+ display: 'block'
+ });
+
+ $(".dataflash-free_global").css({
+ width: (100-(DATAFLASH.totalSize - DATAFLASH.usedSize) / DATAFLASH.totalSize * 100) + "%",
+ display: 'block'
+ });
+ $(".dataflash-free_global div").text('Dataflash: free ' + formatFilesize(DATAFLASH.totalSize - DATAFLASH.usedSize));
+ } else {
+ $(".noflash_global").css({
+ display: 'block'
+ });
+
+ $(".dataflash-contents_global").css({
+ display: 'none'
+ });
+ }
+}
diff --git a/main.css b/main.css
index b16ce9a8f..2a2e890fe 100644
--- a/main.css
+++ b/main.css
@@ -225,7 +225,6 @@ input[type="number"]::-webkit-inner-spin-button {
background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.45));
padding-left: 5px;
padding-right: 5px;
- text-align: center;
text-shadow: 0px 1px rgba(0, 0, 0, 1.0);
}
@@ -282,7 +281,6 @@ input[type="number"]::-webkit-inner-spin-button {
.magicon.active {
background-image: url(images/icons/sensor_mag_on.png);
- color: #61d514;
color: #818181;
}
@@ -301,7 +299,6 @@ input[type="number"]::-webkit-inner-spin-button {
.gpsicon.active {
background-image: url(images/icons/sensor_sat_on.png);
- color: #61d514;
color: #818181;
}
@@ -320,7 +317,6 @@ input[type="number"]::-webkit-inner-spin-button {
.baroicon.active {
background-image: url(images/icons/sensor_baro_on.png);
- color: #61d514;
color: #818181;
}
@@ -339,7 +335,6 @@ input[type="number"]::-webkit-inner-spin-button {
.sonaricon.active {
background-image: url(images/icons/sensor_sonar_on.png);
- color: #61d514;
color: #818181;
}
@@ -408,6 +403,7 @@ input[type="number"]::-webkit-inner-spin-button {
margin-bottom: 0px;
border: 0px solid silver; /* was 1px*/
background-color: #242424;
+ color: #ccc;
color: rgba(255, 255, 255, 0.60);
line-height: 21px;
height: 27px; /* was 65*/
@@ -433,7 +429,6 @@ input[type="number"]::-webkit-inner-spin-button {
margin-right: 20px;
width: 110px;
opacity: 0.15;
- background-image: url(images/icons/scroll.svg);
background-size: 80%;
box-shadow: inset 0 0 5px #000000;
transition: all ease 0.3s;
@@ -489,28 +484,22 @@ input[type="number"]::-webkit-inner-spin-button {
width: 200px;
border-right: 4px solid #59aa29;
background-color: #2e2e2e;
+ transition: all 0.2s;
+
}
.tab_container.logopen {
height: calc(100% - 235px);
overflow-x: hidden;
overflow-y: auto;
-}
+ transition: all 0.5s;
+}
#tabs {
font-size: 13px;
}
-#tabs ul {
- /* overflow-y: auto; do not force scrollbars as it renders blank stripe on some user agents */
-
-}
-
-#tabs.logopen ul {
- /* Cause the height to shrink to contain its floated contents while log is open */
-}
-
.header-wrapper .mode-connected {
display: none;
}
@@ -551,7 +540,9 @@ input[type="number"]::-webkit-inner-spin-button {
#tabs li a:hover {
text-decoration: none;
- background-color: rgba(0, 0, 0, 0.20);
+ background-color: rgba(128, 128, 128, 0.50);
+ color: #fff;
+
}
#tabs li.active {
@@ -581,6 +572,10 @@ input[type="number"]::-webkit-inner-spin-button {
background-image: url(images/icons/cf_icon_setup_grey.svg);
}
+.ic_setup:hover {
+ background-image: url(images/icons/cf_icon_setup_white.svg);
+}
+
li.active .ic_setup {
background-image: url(images/icons/cf_icon_setup_white.svg);
}
@@ -589,6 +584,10 @@ li.active .ic_setup {
background-image: url(images/icons/cf_icon_ports_grey.svg);
}
+.ic_ports:hover {
+ background-image: url(images/icons/cf_icon_ports_white.svg);
+}
+
li.active .ic_ports {
background-image: url(images/icons/cf_icon_ports_white.svg);
}
@@ -597,6 +596,10 @@ li.active .ic_ports {
background-image: url(images/icons/cf_icon_config_grey.svg);
}
+.ic_config:hover {
+ background-image: url(images/icons/cf_icon_config_white.svg);
+}
+
li.active .ic_config {
background-image: url(images/icons/cf_icon_config_white.svg);
}
@@ -605,6 +608,10 @@ li.active .ic_config {
background-image: url(images/icons/cf_icon_pid_grey.svg);
}
+.ic_pid:hover {
+ background-image: url(images/icons/cf_icon_pid_white.svg);
+}
+
li.active .ic_pid {
background-image: url(images/icons/cf_icon_pid_white.svg);
}
@@ -613,6 +620,10 @@ li.active .ic_pid {
background-image: url(images/icons/cf_icon_rx_grey.svg);
}
+.ic_rx:hover {
+ background-image: url(images/icons/cf_icon_rx_white.svg);
+}
+
li.active .ic_rx {
background-image: url(images/icons/cf_icon_rx_white.svg);
}
@@ -621,6 +632,10 @@ li.active .ic_rx {
background-image: url(images/icons/cf_icon_modes_grey.svg);
}
+.ic_modes:hover {
+ background-image: url(images/icons/cf_icon_modes_white.svg);
+}
+
li.active .ic_modes {
background-image: url(images/icons/cf_icon_modes_white.svg);
}
@@ -629,6 +644,10 @@ li.active .ic_modes {
background-image: url(images/icons/cf_icon_adjust_grey.svg);
}
+.ic_adjust:hover {
+ background-image: url(images/icons/cf_icon_adjust_white.svg);
+}
+
li.active .ic_adjust {
background-image: url(images/icons/cf_icon_adjust_white.svg);
}
@@ -637,6 +656,10 @@ li.active .ic_adjust {
background-image: url(images/icons/cf_icon_servo_grey.svg);
}
+.ic_servo:hover {
+ background-image: url(images/icons/cf_icon_servo_white.svg);
+}
+
li.active .ic_servo {
background-image: url(images/icons/cf_icon_servo_white.svg);
}
@@ -645,6 +668,10 @@ li.active .ic_servo {
background-image: url(images/icons/cf_icon_gps_grey.svg);
}
+.ic_gps:hover {
+ background-image: url(images/icons/cf_icon_gps_white.svg);
+}
+
li.active .ic_gps {
background-image: url(images/icons/cf_icon_gps_white.svg);
}
@@ -653,6 +680,10 @@ li.active .ic_gps {
background-image: url(images/icons/cf_icon_led_grey.svg);
}
+.ic_led:hover {
+ background-image: url(images/icons/cf_icon_led_white.svg);
+}
+
li.active .ic_led {
background-image: url(images/icons/cf_icon_led_white.svg);
}
@@ -661,6 +692,10 @@ li.active .ic_led {
background-image: url(images/icons/cf_icon_sensors_grey.svg);
}
+.ic_sensors:hover {
+ background-image: url(images/icons/cf_icon_sensors_white.svg);
+}
+
li.active .ic_sensors {
background-image: url(images/icons/cf_icon_sensors_white.svg);
}
@@ -669,6 +704,10 @@ li.active .ic_sensors {
background-image: url(images/icons/cf_icon_log_grey.svg);
}
+.ic_log:hover {
+ background-image: url(images/icons/cf_icon_log_white.svg);
+}
+
li.active .ic_log {
background-image: url(images/icons/cf_icon_log_white.svg);
}
@@ -677,6 +716,10 @@ li.active .ic_log {
background-image: url(images/icons/cf_icon_data_grey.svg);
}
+.ic_data:hover {
+ background-image: url(images/icons/cf_icon_data_white.svg);
+}
+
li.active .ic_data {
background-image: url(images/icons/cf_icon_data_white.svg);
}
@@ -685,6 +728,10 @@ li.active .ic_data {
background-image: url(images/icons/cf_icon_cli_grey.svg);
}
+.ic_cli:hover {
+ background-image: url(images/icons/cf_icon_cli_white.svg);
+}
+
li.active .ic_cli {
background-image: url(images/icons/cf_icon_cli_white.svg);
}
@@ -693,6 +740,10 @@ li.active .ic_cli {
background-image: url(images/icons/cf_icon_motor_grey.svg);
}
+.ic_motor:hover {
+ background-image: url(images/icons/cf_icon_motor_white.svg);
+}
+
li.active .ic_motor {
background-image: url(images/icons/cf_icon_motor_white.svg);
}
@@ -701,6 +752,10 @@ li.active .ic_motor {
background-image: url(images/icons/cf_icon_welcome_grey.svg);
}
+.ic_welcome:hover {
+ background-image: url(images/icons/cf_icon_welcome_white.svg);
+}
+
li.active .ic_welcome {
background-image: url(images/icons/cf_icon_welcome_white.svg);
}
@@ -709,6 +764,10 @@ li.active .ic_welcome {
background-image: url(images/icons/cf_icon_help_grey.svg);
}
+.ic_help:hover {
+ background-image: url(images/icons/cf_icon_help_white.svg);
+}
+
li.active .ic_help {
background-image: url(images/icons/cf_icon_help_white.svg);
}
@@ -717,14 +776,45 @@ li.active .ic_help {
background-image: url(images/icons/cf_icon_flasher_grey.svg);
}
+.ic_flasher:hover {
+ background-image: url(images/icons/cf_icon_flasher_white.svg);
+}
+
li.active .ic_flasher {
background-image: url(images/icons/cf_icon_flasher_white.svg);
}
+.ic_transponder {
+ background-image: url(images/icons/cf_icon_transponder_grey.svg);
+}
+
+.ic_transponder:hover {
+ background-image: url(images/icons/cf_icon_transponder_white.svg);
+}
+
+li.active .ic_transponder {
+ background-image: url(images/icons/cf_icon_transponder_white.svg);
+}
+
+
/* SPARE Tab-Icons */
+.ic_failsafe {
+ background-image: url(images/icons/cf_icon_failsafe_grey.svg);
+}
+
+.ic_failsafe:hover {
+ background-image: url(images/icons/cf_icon_failsafe_white.svg);
+}
+
+li.active .ic_failsafe {
+ background-image: url(images/icons/cf_icon_failsafe_white.svg);
+}
.ic_backup {
background-image: url(images/icons/cf_icon_backup_grey.svg);
}
+.ic_backup:hover {
+ background-image: url(images/icons/cf_icon_backup_white.svg);
+}
li.active .ic_backup {
background-image: url(images/icons/cf_icon_backup_white.svg);
@@ -733,6 +823,9 @@ li.active .ic_backup {
.ic_wizzard {
background-image: url(images/icons/cf_icon_wizard_grey.svg);
}
+.ic_wizzard:hover {
+ background-image: url(images/icons/cf_icon_wizard_white.svg);
+}
li.active .ic_wizard {
background-image: url(images/icons/cf_icon_wizard_white.svg);
@@ -741,6 +834,9 @@ li.active .ic_wizard {
.ic_advanced {
background-image: url(images/icons/cf_icon_advanced_grey.svg);
}
+.ic_advanced:hover {
+ background-image: url(images/icons/cf_icon_advanced_white.svg);
+}
li.active .ic_advanced {
background-image: url(images/icons/cf_icon_advanced_white.svg);
@@ -749,32 +845,35 @@ li.active .ic_advanced {
.ic_mission {
background-image: url(images/icons/cf_icon_mission_grey.svg);
}
+.ic_mission:hover {
+ background-image: url(images/icons/cf_icon_mission_white.svg);
+}
li.active .ic_mission {
background-image: url(images/icons/cf_icon_mission_white.svg);
}
#content {
- margin-top: 0px; /* 31 */
- padding: 0px; /* 10 */
+ margin-top: 0px;
+ padding: 0px;
height: calc(100% - 150px);
/* (port picker 105px, log CLOSED 25px, status bar: 20px + padding) - was: calc(100% - 171px)*/
background-color: white;
overflow-x: hidden;
overflow-y: auto;
- border: 0px solid #848484; /* 1px solid #848484; */
+ border: 0px solid #848484;
-webkit-transform: rotateX(0deg); /* DO NOT REMOVE! this fixes the UI freezing bug on MAC OS X */
transition: all 0.3s;
}
#content.logopen {
- margin-top: 0px; /* 31 */
- padding: 0px; /* 10 */
+ margin-top: 0px;
+ padding: 0px;
height: calc(100% - 234px); /* (port picker, log OPEN, status bar: 20px + padding) - was: calc(100% - 171px)*/
background-color: white;
overflow-x: hidden;
overflow-y: auto;
- border: 0px solid #848484; /* 1px solid #848484; */
+ border: 0px solid #848484;
-webkit-transform: rotateX(0deg); /* DO NOT REMOVE! this fixes the UI freezing bug on MAC OS X */
transition: all 0.5s;
/* Cause the height to shrink to contain its floated contents while log is open */
@@ -863,10 +962,8 @@ dialog {
}
.tab_wrapper {
- padding-left: 20px;
- padding-right: 15px;
- padding-top: 15px;
- padding-bottom: 15px;
+ padding: 20px 15px 15px 15px;
+
}
.content_wrapper {
@@ -1034,6 +1131,35 @@ dialog {
font-family: 'open_sansregular', Arial;
}
+.gui_warning {
+ background: #ffdddd;
+}
+
+.gui_note {
+ background: #ffffdd;
+}
+
+.gui_warning .gui_box_titlebar {
+ background-color: #dc0000;
+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, .3) 10%, transparent 10%, transparent 20%,
+ rgba(255, 255, 255, .3) 20%, rgba(255, 255, 255, .3) 30%, transparent 30%, transparent 40%,
+ rgba(255, 255, 255, .3) 40%, rgba(255, 255, 255, .3) 50%, transparent 50%, transparent 60%,
+ rgba(255, 255, 255, .3) 60%, rgba(255, 255, 255, .3) 70%, transparent 70%, transparent 80%,
+ rgba(255, 255, 255, .3) 80%, rgba(255, 255, 255, .3) 90%, transparent 90%, transparent 100%,
+ rgba(255, 255, 255, .4) 100%, transparent);
+}
+
+.gui_note .gui_box_titlebar {
+ background-color: #cccc00;
+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, .3) 10%, transparent 10%, transparent 20%,
+ rgba(255, 255, 255, .3) 20%, rgba(255, 255, 255, .3) 30%, transparent 30%, transparent 40%,
+ rgba(255, 255, 255, .3) 40%, rgba(255, 255, 255, .3) 50%, transparent 50%, transparent 60%,
+ rgba(255, 255, 255, .3) 60%, rgba(255, 255, 255, .3) 70%, transparent 70%, transparent 80%,
+ rgba(255, 255, 255, .3) 80%, rgba(255, 255, 255, .3) 90%, transparent 90%, transparent 100%,
+ rgba(255, 255, 255, .4) 100%, transparent);
+}
+
+
.grey {
/* background-color:#f5f5f5; */
background-color: #f9f9f9
@@ -1123,6 +1249,7 @@ dialog {
line-height: 13px;
display: block;
transition: all ease 0.2s;
+ text-decoration:none;
}
.default_btn a:hover {
@@ -1130,6 +1257,8 @@ dialog {
color: #fff;
text-shadow: 0px 1px rgba(0, 0, 0, 0.25);
transition: all ease 0.2s;
+ text-decoration:none;
+
}
.default_btn a:active {
@@ -1300,7 +1429,7 @@ dialog {
}
/* fixing padding for all Tabs*/
-.tab-setup, .tab-landing, .tab-adjustments, .tab-auxiliary, .tab-cli, .tab-configuration, .tab-dataflash,
+.tab-setup, .tab-landing, .tab-adjustments, .tab-auxiliary, .tab-cli, .tab-configuration, .tab-failsafe, .tab-onboard_logging,
.tab-firmware_flasher, .tab-gps, .tab-help, .tab-led-strip, .tab-logging, .tab-modes, .tab-motors, .tab-pid_tuning,
.tab-ports, .tab-receiver, .tab-sensors, .tab-servos {
height: 100%;
@@ -1318,7 +1447,7 @@ dialog {
.properties dd {
width: 400px;
- height: auto !important;
+ height: auto;
}
/* GPS Fix styling*/
@@ -1330,7 +1459,7 @@ dialog {
border-radius: 3px;
color: #fff;
font-size: 10px;
- }
+}
.fixfalse {
background-color: #e60000;
@@ -1341,115 +1470,206 @@ dialog {
color: #fff;
font-size: 10px;
}
+/* Dataflash element styling*/
+
+#dataflash_wrapper_global {
+ color:white;
+ font-size:10px;
+ margin-top: 20px;
+ width:125px;
+ float: right;
+ margin-right: 20px;
+ line-height: 12px;
+ height: 33px;
+ border-radius: 5px;
+ border: 1px solid #272727;
+ box-shadow: 0px 1px 0px rgba(92, 92, 92, 0.5);
+ background-color: #434343;
+ background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.55));
+ padding-top:5px;
+ display:none;
+ text-shadow: 0px 1px rgba(0, 0, 0, 1.0);
+
+}
+
+#profile_change {
+ color:white;
+ margin-top: 16px;
+ width:125px;
+ float: right;
+ margin-right: 0px;
+ line-height: 12px;
+}
+
+.dataflash-contents_global {
+ margin-top: 18px;
+ border: 1px solid #4A4A4A;
+ background-color: #4A4A4A;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ border-radius: 3px;
+ margin-left: 5px;
+ margin-right: 5px;
+}
+
+
+.dataflash-free_global {
+ background-color: #59AA29;
+ border-radius: 4px;
+}
+
+
+.dataflash-contents_global .notsupported_global {
+ display: none;
+}
+
+.dataflash-contents_global li {
+ height: 5px;
+ position: relative;
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.20);
+ border-radius: 2px;
+
+}
+
+.dataflash-contents_global li div {
+ position: absolute;
+ top: -18px;
+ margin-top: 0px;
+ left: 0;
+ right: 0;
+ width:120px;
+ text-align: left;
+ color:silver;
+}
+
+.dataflash-contents_global progress::-webkit-progress-bar {
+ height: 8px;
+ background-color: #eee;
+}
+
+.dataflash-contents progress::-webkit-progress-value {
+ background-color: #bcf;
+}
+
+.noflash_global {
+ display:none;
+ color: #868686;
+ text-align: center;
+ text-shadow: 0px 1px rgba(0, 0, 0, 1.0);
+ margin-top:2px;
+}
+
+.cf_tooltiptext {
+ display:none;
+}
+
@media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) {
- .content_wrapper {
- padding: 15px;
- /*width:calc(100% - 30px);*/
- }
- .tab_title {
- font-size: 16px;
- line-height: 18px;
- font-family: 'open_sanslight', Arial;
- margin-bottom: 10px;
- height: 22px;
- }
- .cf_doc_version_bt a {
- padding: 1px 5px 1px 5px;
- margin-top: -35px;
- font-size: 9px;
- line-height: 15px;
- }
- #content {
- height: calc(100% - 151px);
- /* (port picker 105px, log CLOSED 25px, status bar: 20px + padding) - was: calc(100% - 171px)*/
- }
- body {
- /*font-size: 11px;*/
- /* lets see if we really need this? */
- }
- .tab-setup, .tab-landing, .tab-adjustments, .tab-auxiliary, .tab-cli, .tab-configuration, .tab-dataflash,
- .tab-firmware_flasher, .tab-gps, .tab-help, .tab-led-strip, .tab-logging, .tab-modes, .tab-motors,
- .tab-pid_tuning, .tab-ports, .tab-receiver, .tab-sensors, .tab-servos {
+.content_wrapper {
+ padding: 15px;
+}
- }
- .cf_table td {
- padding-top: 2px;
- padding-bottom: 2px;
- }
- .default_btn {
- margin-bottom: 10px;
- }
- .default_btn a {
- /*font-size:11px;*/
+.tab_title {
+ font-size: 16px;
+ line-height: 18px;
+ font-family: 'open_sanslight', Arial;
+ margin-bottom: 10px;
+ height: 22px;
+}
- }
- #tabs li a {
- font-family: 'open_sansregular', Arial;
- font-size: 12px;
- padding-left: 53px;
- padding-top: 6px;
- padding-bottom: 2px;
- content: "" !important;
- text-shadow: none;
- transition: none;
- /* following is just for a graceful degradation */
- text-overflow: clip;
- white-space: nowrap;
- overflow: hidden;
- }
- .tab_container {
- width: 40px;
- }
- .gui_box_titlebar {
- font-size: 12px;
- height: 24px;
- padding-bottom: 0px;
- margin-bottom: 5px;
- float: left;
- }
- .spacer_box_title {
- padding-left: 10px;
- padding-right: 10px;
- padding-top: 3px;
- margin-bottom: 0px;
- float: left;
- }
- input {
- font-size: 11px !important;
- }
- .helpicon {
- float: right;
- margin-top: 5px;
- margin-right: 7px;
- height: 14px;
- width: 14px;
- transition: none;
+.cf_doc_version_bt a {
+ padding: 1px 5px 1px 5px;
+ margin-top: -35px;
+ font-size: 9px;
+ line-height: 15px;
+}
+#content {
+ height: calc(100% - 151px);
+}
+
+.cf_table td {
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+
+.default_btn {
+ margin-bottom: 10px;
+}
+
+#tabs li a {
+ font-family: 'open_sansregular', Arial;
+ font-size: 12px;
+ padding-left: 60px;
+ padding-top: 6px;
+ padding-bottom: 2px;
+ content: "";
+ text-shadow: none;
+ transition: none;
+ /* following is just for a graceful degradation */
+ text-overflow: clip;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.tab_container {
+ width: 60px;
+}
+
+.gui_box_titlebar {
+ font-size: 12px;
+ height: 24px;
+ padding-bottom: 0px;
+ margin-bottom: 5px;
+ float: left;
+}
+
+.spacer_box_title {
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 3px;
+ margin-bottom: 0px;
+ float: left;
+}
+
+input {
+ font-size: 11px !important;
+}
+
+.helpicon {
+ float: right;
+ margin-top: 5px;
+ margin-right: 7px;
+ height: 14px;
+ width: 14px;
+ transition: none;
}
-
- #tooltiptext {
- }
-
- .gps_false {
- padding: 0px 3px 0px 3px;
- font-size: 10px;
- }
- .gps_true {
- padding: 0px 3px 0px 3px;
- font-size: 10px;
- }
- .content_toolbar .btn a {
- margin-right: 15px;
- }
- .toolbar_fixed_bottom .content_wrapper {
- /* content wrapper in view with toolbar fixed over bottom edge
- leave 50px space for the toolbar
- */
- height: calc(100% - 81px);
- overflow-y: auto;
- }
+
+.gps_false {
+ padding: 0px 3px 0px 3px;
+ font-size: 10px;
+}
+
+.gps_true {
+ padding: 0px 3px 0px 3px;
+ font-size: 10px;
+}
+
+.content_toolbar .btn a {
+ margin-right: 15px;
+}
+
+.toolbar_fixed_bottom .content_wrapper {
+ /* content wrapper in view with toolbar fixed over bottom edge
+ leave 50px space for the toolbar
+ */
+ height: calc(100% - 81px);
+ overflow-y: auto;
+}
+
}
@media only screen and (max-height: 700px) , only screen and (max-device-height: 700px) {
@@ -1459,4 +1679,4 @@ dialog {
overflow-y: auto;
}
- }
+ }
\ No newline at end of file
diff --git a/main.html b/main.html
index 88320b864..14783c82a 100755
--- a/main.html
+++ b/main.html
@@ -21,10 +21,12 @@
-
+
+
+
@@ -50,6 +52,7 @@
+
@@ -73,8 +76,10 @@
-
+
+
+
@@ -126,6 +131,25 @@