1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-20 10:54:14 +01:00

Merge branch 'rel-15.02' RC4 into next

Conflicts:
	ground/openpilotgcs/src/plugins/config/input.ui
	ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp
This commit is contained in:
abeck70 2015-03-07 16:47:46 +11:00
commit 8c31f96dd7
20 changed files with 11747 additions and 461 deletions

View File

@ -1,3 +1,72 @@
--- RELEASE-15.02 RC4
This release introduces major flight performance improvements, enhancements as well as bug fixes. Many enhancements have been made to reducing dead-time of the communication between the flight controller and ESCs. In our testing, we have found this to be not only the best flight performance so far in the OpenPilot project but the best flight performance of any project we have tested against. This is a recommended upgrade for everyone and the more skilled of a pilot you are, the more you will love this release.
A key improvement that helped achieve this was the addition of the PWMSync code path, this is now enabled by default. Some restrictions applies to CC3D/CC as it needs a compatible input method to enable PWMSync. Compatible input methods are PPM, S.Bus, DSM and OPLink. This release also introduces support for OneShot125 capable ESCs, such as the KISS ESCs and all ESCs supported in BLHeli V13 and above. Note that OneShot125 support has the same restrictions as PWMSync for CC and CC3D.
Note for CC3D/CC: To support PWMSync/OneShot125 PPM input pin has changed from earlier releases to the last pin on the input IO port, please refer to the connection diagram in the setup wizard to see the required new pin layout for PPM.
Other enhancements include key parts of the GCS translated to Chinese and further OPLink reliability additions allowing us to confidently say it can be used as a primary control link as well as for telemetry.
The full list of features, improvements and bugfixes in this release is accessible here:
https://progress.openpilot.org/issues/?filter=12161
Release Notes - OpenPilot - Version RELEASE-15.02
** Bug
* [OP-969] - Input Configuration Wizard has scrollbars showing up and next/previous buttons are pushed down out of sight
* [OP-1034] - CCPM Config Widget crashes GCS if required boxes aren't set i.e. Channel set to None
* [OP-1466] - Gcs crashes on Helicopter config tab
* [OP-1522] - Improve Robustness of OPLink radio
* [OP-1601] - Still not enough ram on CC for gps to be usable
* [OP-1644] - Radio Setup Wiz problem with 6 flight modes
* [OP-1670] - cruise control conflict with flight modes (rate & acro +)
* [OP-1680] - OPLink control limited to 1000-1896
* [OP-1682] - Overflow issue with pwm rx and CC3D
* [OP-1686] - Slave OPLM should receive PPM in PPM_only mode
* [OP-1706] - Output Reverse checkboxes tick them selves when min equals max
* [OP-1718] - FW vehicle setup wizard may strip servo gears
* [OP-1722] - libusb include is incorrect.
* [OP-1728] - FW servos ignore set neutral
* [OP-1733] - version-info.py should check for version-info.json not git repo.
* [OP-1735] - Build fails with a tilde (~) in path.
* [OP-1737] - Min/max will be greyed even if motor output test is canceled
* [OP-1741] - Repo path is incorrect in version_info.pro
* [OP-1743] - cc3d fails to connect once "next " is loaded 2-23-15
* [OP-1744] - Vehicle config wizard produces a bad configuration
* [OP-1754] - Vehicle Wizard bad config when setting PPM in and RapidESC out
* [OP-1755] - Add additional path for cloudconfigs
* [OP-1758] - Upgrade hidapi for all OSs (except windows) to solve mac issue:Fix incorrect device list after device removal
* [OP-1761] - Wizard bad config when PPM in, RapidESC out and hexa frame with CC/CC3D/Atom
** Improvement
* [OP-1519] - Auto Reboot of board when required by Wizard
* [OP-1576] - Remove tx resent accounting from OPlink
* [OP-1635] - Remove Quad H from wizard to avoid confusion with Quad X
* [OP-1650] - Reduce telemetry to improve OPLink
* [OP-1658] - Sensor driver API and overhaul of sensor module
* [OP-1683] - Support synchronous (OneShot) and OneShot125 output mode
* [OP-1685] - Support OneShot/OneShot125 for CC* targets
* [OP-1694] - Make package make rule non-nested
* [OP-1698] - Add easy to set channel passtrough GCS functionality
* [OP-1704] - Add support for sanity check custom hooks
* [OP-1759] - Hide CC3D non-supported options (GPSAssist)
** New Feature
* [OP-1723] - RCCar Forward/reverse support
** Task
* [OP-1721] - C++ enable flight controller and upgrade ARM tools
* [OP-1738] - change default flight modes and thrust settings
** Sub task
* [OP-1748] - Chinese translation for 15.02
* [OP-1752] - Add Alarm sub status to SystemHealth
--- RELEASE-15.01 --- Look Ma, No hands ---
This release mainly focuses on a new feature, GPSAssist which is a new form of assisted control for multirotors.
Assisted Control provides assistance functions on top of existing flight modes. GPSAssist is the

View File

@ -0,0 +1,2185 @@
{
"battery": "4S 1800mah",
"comment": "",
"controller": "CC3D",
"esc": "Sunrise 20A OPTO BLHeli 13.1",
"motor": "Sunnysky 2207 2100 KV",
"name": "ZMR 250",
"nick": "ehitaja",
"objects": [
{
"fields": [
{
"name": "VbarSensitivity",
"type": "float32",
"unit": "frac",
"values": [
{
"name": "Roll",
"value": 0.5
},
{
"name": "Pitch",
"value": 0.5
},
{
"name": "Yaw",
"value": 0.5
}
]
},
{
"name": "VbarRollPI",
"type": "float32",
"unit": "1/(deg/s)",
"values": [
{
"name": "Kp",
"value": 0.004999999888241291
},
{
"name": "Ki",
"value": 0.0020000000949949026
}
]
},
{
"name": "VbarPitchPI",
"type": "float32",
"unit": "1/(deg/s)",
"values": [
{
"name": "Kp",
"value": 0.004999999888241291
},
{
"name": "Ki",
"value": 0.0020000000949949026
}
]
},
{
"name": "VbarYawPI",
"type": "float32",
"unit": "1/(deg/s)",
"values": [
{
"name": "Kp",
"value": 0.004999999888241291
},
{
"name": "Ki",
"value": 0.0020000000949949026
}
]
},
{
"name": "VbarTau",
"type": "float32",
"unit": "sec",
"values": [
{
"name": "0",
"value": 0.5
}
]
},
{
"name": "GyroTau",
"type": "float32",
"unit": "",
"values": [
{
"name": "0",
"value": 0.0040000001899898052
}
]
},
{
"name": "DerivativeGamma",
"type": "float32",
"unit": "",
"values": [
{
"name": "0",
"value": 1
}
]
},
{
"name": "AxisLockKp",
"type": "float32",
"unit": "",
"values": [
{
"name": "0",
"value": 2.5
}
]
},
{
"name": "WeakLevelingKp",
"type": "float32",
"unit": "(deg/s)/deg",
"values": [
{
"name": "0",
"value": 0.10000000149011612
}
]
},
{
"name": "CruiseControlMaxPowerFactor",
"type": "float32",
"unit": "x",
"values": [
{
"name": "0",
"value": 3
}
]
},
{
"name": "CruiseControlPowerTrim",
"type": "float32",
"unit": "%",
"values": [
{
"name": "0",
"value": 100
}
]
},
{
"name": "CruiseControlPowerDelayComp",
"type": "float32",
"unit": "sec",
"values": [
{
"name": "0",
"value": 0.25
}
]
},
{
"name": "ScaleToAirspeed",
"type": "float32",
"unit": "m/s",
"values": [
{
"name": "0",
"value": 0
}
]
},
{
"name": "ScaleToAirspeedLimits",
"type": "float32",
"unit": "",
"values": [
{
"name": "Min",
"value": 0.05000000074505806
},
{
"name": "Max",
"value": 3
}
]
},
{
"name": "FlightModeMap",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Bank1"
},
{
"name": "1",
"value": "Bank1"
},
{
"name": "2",
"value": "Bank1"
},
{
"name": "3",
"value": "Bank1"
},
{
"name": "4",
"value": "Bank1"
},
{
"name": "5",
"value": "Bank1"
}
]
},
{
"name": "VbarGyroSuppress",
"type": "int8",
"unit": "%",
"values": [
{
"name": "0",
"value": 30
}
]
},
{
"name": "VbarPiroComp",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "FALSE"
}
]
},
{
"name": "VbarMaxAngle",
"type": "uint8",
"unit": "deg",
"values": [
{
"name": "0",
"value": 10
}
]
},
{
"name": "DerivativeCutoff",
"type": "uint8",
"unit": "Hz",
"values": [
{
"name": "0",
"value": 20
}
]
},
{
"name": "MaxAxisLock",
"type": "uint8",
"unit": "deg",
"values": [
{
"name": "0",
"value": 30
}
]
},
{
"name": "MaxAxisLockRate",
"type": "uint8",
"unit": "deg/s",
"values": [
{
"name": "0",
"value": 2
}
]
},
{
"name": "MaxWeakLevelingRate",
"type": "uint8",
"unit": "deg/s",
"values": [
{
"name": "0",
"value": 5
}
]
},
{
"name": "RattitudeModeTransition",
"type": "uint8",
"unit": "%",
"values": [
{
"name": "0",
"value": 80
}
]
},
{
"name": "CruiseControlMinThrust",
"type": "int8",
"unit": "%",
"values": [
{
"name": "0",
"value": 5
}
]
},
{
"name": "CruiseControlMaxThrust",
"type": "uint8",
"unit": "%",
"values": [
{
"name": "0",
"value": 90
}
]
},
{
"name": "CruiseControlMaxAngle",
"type": "uint8",
"unit": "deg",
"values": [
{
"name": "0",
"value": 105
}
]
},
{
"name": "CruiseControlFlightModeSwitchPosEnable",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "FALSE"
},
{
"name": "1",
"value": "FALSE"
},
{
"name": "2",
"value": "FALSE"
},
{
"name": "3",
"value": "FALSE"
},
{
"name": "4",
"value": "FALSE"
},
{
"name": "5",
"value": "FALSE"
}
]
},
{
"name": "CruiseControlInvertedThrustReversing",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Unreversed"
}
]
},
{
"name": "CruiseControlInvertedPowerOutput",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Zero"
}
]
},
{
"name": "LowThrottleZeroIntegral",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "TRUE"
}
]
},
{
"name": "FlightModeAssistMap",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "None"
},
{
"name": "1",
"value": "None"
},
{
"name": "2",
"value": "None"
},
{
"name": "3",
"value": "None"
},
{
"name": "4",
"value": "None"
},
{
"name": "5",
"value": "None"
}
]
}
],
"id": "73603180",
"instance": 0,
"name": "StabilizationSettings",
"setting": true
},
{
"fields": [
{
"name": "ManualRate",
"type": "float32",
"unit": "degrees/sec",
"values": [
{
"name": "Roll",
"value": 420
},
{
"name": "Pitch",
"value": 400
},
{
"name": "Yaw",
"value": 310
}
]
},
{
"name": "MaximumRate",
"type": "float32",
"unit": "degrees/sec",
"values": [
{
"name": "Roll",
"value": 475
},
{
"name": "Pitch",
"value": 475
},
{
"name": "Yaw",
"value": 360
}
]
},
{
"name": "RollRatePID",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 0.0027000000700354576
},
{
"name": "Ki",
"value": 0.0070000002160668373
},
{
"name": "Kd",
"value": 3.9999998989515007e-05
},
{
"name": "ILimit",
"value": 0.30000001192092896
}
]
},
{
"name": "PitchRatePID",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 0.0032999999821186066
},
{
"name": "Ki",
"value": 0.012500000186264515
},
{
"name": "Kd",
"value": 5.999999848427251e-05
},
{
"name": "ILimit",
"value": 0.30000001192092896
}
]
},
{
"name": "YawRatePID",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 0.0075500002130866051
},
{
"name": "Ki",
"value": 0.011500000022351742
},
{
"name": "Kd",
"value": 4.9999998736893758e-05
},
{
"name": "ILimit",
"value": 0.30000001192092896
}
]
},
{
"name": "RollPI",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 3
},
{
"name": "Ki",
"value": 0
},
{
"name": "ILimit",
"value": 50
}
]
},
{
"name": "PitchPI",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 3.4000000953674316
},
{
"name": "Ki",
"value": 0
},
{
"name": "ILimit",
"value": 50
}
]
},
{
"name": "YawPI",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 2.5
},
{
"name": "Ki",
"value": 0
},
{
"name": "ILimit",
"value": 50
}
]
},
{
"name": "AcroInsanityFactor",
"type": "float32",
"unit": "percent",
"values": [
{
"name": "0",
"value": 0.41999998688697815
}
]
},
{
"name": "ThrustPIDScaleCurve",
"type": "float32",
"unit": "percent",
"values": [
{
"name": "0",
"value": 0.18856599926948547
},
{
"name": "25",
"value": 0.094283096492290497
},
{
"name": "50",
"value": 0
},
{
"name": "75",
"value": -0.10285499691963196
},
{
"name": "100",
"value": -0.20282800495624542
}
]
},
{
"name": "RollMax",
"type": "uint8",
"unit": "degrees",
"values": [
{
"name": "0",
"value": 80
}
]
},
{
"name": "PitchMax",
"type": "uint8",
"unit": "degrees",
"values": [
{
"name": "0",
"value": 80
}
]
},
{
"name": "YawMax",
"type": "uint8",
"unit": "degrees",
"values": [
{
"name": "0",
"value": 35
}
]
},
{
"name": "StickExpo",
"type": "int8",
"unit": "percent",
"values": [
{
"name": "Roll",
"value": 12
},
{
"name": "Pitch",
"value": 12
},
{
"name": "Yaw",
"value": 14
}
]
},
{
"name": "EnablePiroComp",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "FALSE"
}
]
},
{
"name": "EnableThrustPIDScaling",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "TRUE"
}
]
},
{
"name": "ThrustPIDScaleSource",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "ActuatorDesiredThrust"
}
]
},
{
"name": "ThrustPIDScaleTarget",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "PD"
}
]
},
{
"name": "ThrustPIDScaleAxes",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Roll Pitch"
}
]
}
],
"id": "E8EBBD48",
"instance": 0,
"name": "StabilizationSettingsBank1",
"setting": true
},
{
"fields": [
{
"name": "ManualRate",
"type": "float32",
"unit": "degrees/sec",
"values": [
{
"name": "Roll",
"value": 400
},
{
"name": "Pitch",
"value": 400
},
{
"name": "Yaw",
"value": 220
}
]
},
{
"name": "MaximumRate",
"type": "float32",
"unit": "degrees/sec",
"values": [
{
"name": "Roll",
"value": 400
},
{
"name": "Pitch",
"value": 400
},
{
"name": "Yaw",
"value": 300
}
]
},
{
"name": "RollRatePID",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 0.0032999999821186066
},
{
"name": "Ki",
"value": 0.0076000001281499863
},
{
"name": "Kd",
"value": 3.600000127335079e-05
},
{
"name": "ILimit",
"value": 0.30000001192092896
}
]
},
{
"name": "PitchRatePID",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 0.0044999998062849045
},
{
"name": "Ki",
"value": 0.0093999998643994331
},
{
"name": "Kd",
"value": 4.5000000682193786e-05
},
{
"name": "ILimit",
"value": 0.30000001192092896
}
]
},
{
"name": "YawRatePID",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 0.0086000002920627594
},
{
"name": "Ki",
"value": 0.014299999922513962
},
{
"name": "Kd",
"value": 4.9999998736893758e-05
},
{
"name": "ILimit",
"value": 0.30000001192092896
}
]
},
{
"name": "RollPI",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 3
},
{
"name": "Ki",
"value": 0
},
{
"name": "ILimit",
"value": 50
}
]
},
{
"name": "PitchPI",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 3.4000000953674316
},
{
"name": "Ki",
"value": 0
},
{
"name": "ILimit",
"value": 50
}
]
},
{
"name": "YawPI",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 2.5
},
{
"name": "Ki",
"value": 0
},
{
"name": "ILimit",
"value": 50
}
]
},
{
"name": "AcroInsanityFactor",
"type": "float32",
"unit": "percent",
"values": [
{
"name": "0",
"value": 0.5
}
]
},
{
"name": "ThrustPIDScaleCurve",
"type": "float32",
"unit": "percent",
"values": [
{
"name": "0",
"value": 0.19285200536251068
},
{
"name": "25",
"value": 0.089997202157974243
},
{
"name": "50",
"value": 0
},
{
"name": "75",
"value": -0.085711203515529633
},
{
"name": "100",
"value": -0.18427999317646027
}
]
},
{
"name": "RollMax",
"type": "uint8",
"unit": "degrees",
"values": [
{
"name": "0",
"value": 55
}
]
},
{
"name": "PitchMax",
"type": "uint8",
"unit": "degrees",
"values": [
{
"name": "0",
"value": 55
}
]
},
{
"name": "YawMax",
"type": "uint8",
"unit": "degrees",
"values": [
{
"name": "0",
"value": 35
}
]
},
{
"name": "StickExpo",
"type": "int8",
"unit": "percent",
"values": [
{
"name": "Roll",
"value": 18
},
{
"name": "Pitch",
"value": 18
},
{
"name": "Yaw",
"value": -8
}
]
},
{
"name": "EnablePiroComp",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "FALSE"
}
]
},
{
"name": "EnableThrustPIDScaling",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "TRUE"
}
]
},
{
"name": "ThrustPIDScaleSource",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "ActuatorDesiredThrust"
}
]
},
{
"name": "ThrustPIDScaleTarget",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "PD"
}
]
},
{
"name": "ThrustPIDScaleAxes",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Roll Pitch"
}
]
}
],
"id": "70E9539A",
"instance": 0,
"name": "StabilizationSettingsBank2",
"setting": true
},
{
"fields": [
{
"name": "ManualRate",
"type": "float32",
"unit": "degrees/sec",
"values": [
{
"name": "Roll",
"value": 220
},
{
"name": "Pitch",
"value": 220
},
{
"name": "Yaw",
"value": 220
}
]
},
{
"name": "MaximumRate",
"type": "float32",
"unit": "degrees/sec",
"values": [
{
"name": "Roll",
"value": 300
},
{
"name": "Pitch",
"value": 300
},
{
"name": "Yaw",
"value": 300
}
]
},
{
"name": "RollRatePID",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 0.0024999999441206455
},
{
"name": "Ki",
"value": 0.0040000001899898052
},
{
"name": "Kd",
"value": 1.9999999494757503e-05
},
{
"name": "ILimit",
"value": 0.30000001192092896
}
]
},
{
"name": "PitchRatePID",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 0.0024999999441206455
},
{
"name": "Ki",
"value": 0.0040000001899898052
},
{
"name": "Kd",
"value": 1.9999999494757503e-05
},
{
"name": "ILimit",
"value": 0.30000001192092896
}
]
},
{
"name": "YawRatePID",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 0.0062000001780688763
},
{
"name": "Ki",
"value": 0.0099999997764825821
},
{
"name": "Kd",
"value": 4.9999998736893758e-05
},
{
"name": "ILimit",
"value": 0.30000001192092896
}
]
},
{
"name": "RollPI",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 2.5
},
{
"name": "Ki",
"value": 0
},
{
"name": "ILimit",
"value": 50
}
]
},
{
"name": "PitchPI",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 2.5
},
{
"name": "Ki",
"value": 0
},
{
"name": "ILimit",
"value": 50
}
]
},
{
"name": "YawPI",
"type": "float32",
"unit": "",
"values": [
{
"name": "Kp",
"value": 2.5
},
{
"name": "Ki",
"value": 0
},
{
"name": "ILimit",
"value": 50
}
]
},
{
"name": "AcroInsanityFactor",
"type": "float32",
"unit": "percent",
"values": [
{
"name": "0",
"value": 0.5
}
]
},
{
"name": "ThrustPIDScaleCurve",
"type": "float32",
"unit": "percent",
"values": [
{
"name": "0",
"value": 0.30000001192092896
},
{
"name": "25",
"value": 0.15000000596046448
},
{
"name": "50",
"value": 0
},
{
"name": "75",
"value": -0.15000000596046448
},
{
"name": "100",
"value": -0.30000001192092896
}
]
},
{
"name": "RollMax",
"type": "uint8",
"unit": "degrees",
"values": [
{
"name": "0",
"value": 55
}
]
},
{
"name": "PitchMax",
"type": "uint8",
"unit": "degrees",
"values": [
{
"name": "0",
"value": 55
}
]
},
{
"name": "YawMax",
"type": "uint8",
"unit": "degrees",
"values": [
{
"name": "0",
"value": 35
}
]
},
{
"name": "StickExpo",
"type": "int8",
"unit": "percent",
"values": [
{
"name": "Roll",
"value": 0
},
{
"name": "Pitch",
"value": 0
},
{
"name": "Yaw",
"value": 0
}
]
},
{
"name": "EnablePiroComp",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "TRUE"
}
]
},
{
"name": "EnableThrustPIDScaling",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "FALSE"
}
]
},
{
"name": "ThrustPIDScaleSource",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "ActuatorDesiredThrust"
}
]
},
{
"name": "ThrustPIDScaleTarget",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "PID"
}
]
},
{
"name": "ThrustPIDScaleAxes",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Roll Pitch"
}
]
}
],
"id": "C02DAA6A",
"instance": 0,
"name": "StabilizationSettingsBank3",
"setting": true
},
{
"fields": [
{
"name": "MaxAccel",
"type": "float32",
"unit": "units/sec",
"values": [
{
"name": "0",
"value": 1000
}
]
},
{
"name": "FeedForward",
"type": "float32",
"unit": "",
"values": [
{
"name": "0",
"value": 0
}
]
},
{
"name": "AccelTime",
"type": "float32",
"unit": "ms",
"values": [
{
"name": "0",
"value": 0
}
]
},
{
"name": "DecelTime",
"type": "float32",
"unit": "ms",
"values": [
{
"name": "0",
"value": 0
}
]
},
{
"name": "ThrottleCurve1",
"type": "float32",
"unit": "percent",
"values": [
{
"name": "0",
"value": 0
},
{
"name": "25",
"value": 0.22499999403953552
},
{
"name": "50",
"value": 0.44999998807907104
},
{
"name": "75",
"value": 0.67499995231628418
},
{
"name": "100",
"value": 0.89999997615814209
}
]
},
{
"name": "ThrottleCurve2",
"type": "float32",
"unit": "percent",
"values": [
{
"name": "0",
"value": 0
},
{
"name": "25",
"value": 0.22499999403953552
},
{
"name": "50",
"value": 0.44999998807907104
},
{
"name": "75",
"value": 0.67499995231628418
},
{
"name": "100",
"value": 0.89999997615814209
}
]
},
{
"name": "MixerValueRoll",
"type": "int8",
"unit": "percent",
"values": [
{
"name": "0",
"value": 50
}
]
},
{
"name": "MixerValuePitch",
"type": "int8",
"unit": "percent",
"values": [
{
"name": "0",
"value": 50
}
]
},
{
"name": "MixerValueYaw",
"type": "int8",
"unit": "percent",
"values": [
{
"name": "0",
"value": 50
}
]
},
{
"name": "Curve2Source",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Throttle"
}
]
},
{
"name": "Mixer1Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Motor"
}
]
},
{
"name": "Mixer1Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 127
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": 64
},
{
"name": "Pitch",
"value": 64
},
{
"name": "Yaw",
"value": -64
}
]
},
{
"name": "Mixer2Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Motor"
}
]
},
{
"name": "Mixer2Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 127
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": -64
},
{
"name": "Pitch",
"value": 64
},
{
"name": "Yaw",
"value": 64
}
]
},
{
"name": "Mixer3Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Motor"
}
]
},
{
"name": "Mixer3Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 127
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": -64
},
{
"name": "Pitch",
"value": -64
},
{
"name": "Yaw",
"value": -64
}
]
},
{
"name": "Mixer4Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Motor"
}
]
},
{
"name": "Mixer4Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 127
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": 64
},
{
"name": "Pitch",
"value": -64
},
{
"name": "Yaw",
"value": 64
}
]
},
{
"name": "Mixer5Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Disabled"
}
]
},
{
"name": "Mixer5Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 0
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": 0
},
{
"name": "Pitch",
"value": 0
},
{
"name": "Yaw",
"value": 0
}
]
},
{
"name": "Mixer6Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Disabled"
}
]
},
{
"name": "Mixer6Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 0
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": 0
},
{
"name": "Pitch",
"value": 0
},
{
"name": "Yaw",
"value": 0
}
]
},
{
"name": "Mixer7Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Disabled"
}
]
},
{
"name": "Mixer7Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 0
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": 0
},
{
"name": "Pitch",
"value": 0
},
{
"name": "Yaw",
"value": 0
}
]
},
{
"name": "Mixer8Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Disabled"
}
]
},
{
"name": "Mixer8Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 0
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": 0
},
{
"name": "Pitch",
"value": 0
},
{
"name": "Yaw",
"value": 0
}
]
},
{
"name": "Mixer9Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Disabled"
}
]
},
{
"name": "Mixer9Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 0
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": 0
},
{
"name": "Pitch",
"value": 0
},
{
"name": "Yaw",
"value": 0
}
]
},
{
"name": "Mixer10Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Disabled"
}
]
},
{
"name": "Mixer10Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 0
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": 0
},
{
"name": "Pitch",
"value": 0
},
{
"name": "Yaw",
"value": 0
}
]
},
{
"name": "Mixer11Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Disabled"
}
]
},
{
"name": "Mixer11Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 0
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": 0
},
{
"name": "Pitch",
"value": 0
},
{
"name": "Yaw",
"value": 0
}
]
},
{
"name": "Mixer12Type",
"type": "enum",
"unit": "",
"values": [
{
"name": "0",
"value": "Disabled"
}
]
},
{
"name": "Mixer12Vector",
"type": "int8",
"unit": "",
"values": [
{
"name": "ThrottleCurve1",
"value": 0
},
{
"name": "ThrottleCurve2",
"value": 0
},
{
"name": "Roll",
"value": 0
},
{
"name": "Pitch",
"value": 0
},
{
"name": "Yaw",
"value": 0
}
]
}
],
"id": "7BF2CFA8",
"instance": 0,
"name": "MixerSettings",
"setting": true
},
{
"fields": [
{
"name": "P",
"type": "float32",
"unit": "1^2",
"values": [
{
"name": "PositionNorth",
"value": 10
},
{
"name": "PositionEast",
"value": 10
},
{
"name": "PositionDown",
"value": 10
},
{
"name": "VelocityNorth",
"value": 1
},
{
"name": "VelocityEast",
"value": 1
},
{
"name": "VelocityDown",
"value": 1
},
{
"name": "AttitudeQ1",
"value": 0.0070000002160668373
},
{
"name": "AttitudeQ2",
"value": 0.0070000002160668373
},
{
"name": "AttitudeQ3",
"value": 0.0070000002160668373
},
{
"name": "AttitudeQ4",
"value": 0.0070000002160668373
},
{
"name": "GyroDriftX",
"value": 9.9999999747524271e-07
},
{
"name": "GyroDriftY",
"value": 9.9999999747524271e-07
},
{
"name": "GyroDriftZ",
"value": 9.9999999747524271e-07
}
]
},
{
"name": "Q",
"type": "float32",
"unit": "1^2",
"values": [
{
"name": "GyroX",
"value": 0.0099999997764825821
},
{
"name": "GyroY",
"value": 0.0099999997764825821
},
{
"name": "GyroZ",
"value": 0.0099999997764825821
},
{
"name": "AccelX",
"value": 0.0099999997764825821
},
{
"name": "AccelY",
"value": 0.0099999997764825821
},
{
"name": "AccelZ",
"value": 0.0099999997764825821
},
{
"name": "GyroDriftX",
"value": 9.9999999747524271e-07
},
{
"name": "GyroDriftY",
"value": 9.9999999747524271e-07
},
{
"name": "GyroDriftZ",
"value": 9.9999999747524271e-07
}
]
},
{
"name": "R",
"type": "float32",
"unit": "1^2",
"values": [
{
"name": "GPSPosNorth",
"value": 1
},
{
"name": "GPSPosEast",
"value": 1
},
{
"name": "GPSPosDown",
"value": 1000000
},
{
"name": "GPSVelNorth",
"value": 0.0010000000474974513
},
{
"name": "GPSVelEast",
"value": 0.0010000000474974513
},
{
"name": "GPSVelDown",
"value": 0.0010000000474974513
},
{
"name": "MagX",
"value": 10
},
{
"name": "MagY",
"value": 10
},
{
"name": "MagZ",
"value": 10
},
{
"name": "BaroZ",
"value": 0.0099999997764825821
}
]
},
{
"name": "FakeR",
"type": "float32",
"unit": "1^2",
"values": [
{
"name": "FakeGPSPosIndoor",
"value": 10
},
{
"name": "FakeGPSVelIndoor",
"value": 1
},
{
"name": "FakeGPSVelAirspeed",
"value": 1000
}
]
}
],
"id": "5E91213C",
"instance": 0,
"name": "EKFConfiguration",
"setting": true
}
],
"owner": "Roman",
"propeller": "5040",
"servo": "",
"size": "250",
"subtype": 2,
"type": 1,
"uuid": "{65b347bb-5e6d-466f-895e-5895b222d670}",
"weight": "630 with battery"
}

View File

@ -4591,7 +4591,7 @@ p, li { white-space: pre-wrap; }
<message>
<location/>
<source>Module Control</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -4758,7 +4758,7 @@ Useful if you have accidentally changed some settings.</source>
<message>
<location/>
<source>Reload Board Data</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -4773,7 +4773,7 @@ Useful if you have accidentally changed some settings.</source>
<message>
<location/>
<source>Send settings to the board but do not save to the non-volatile memory</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -4788,7 +4788,7 @@ Useful if you have accidentally changed some settings.</source>
<message>
<location/>
<source>Send settings to the board and save to the non-volatile memory</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -4822,7 +4822,7 @@ p, li { white-space: pre-wrap; }
<message>
<location/>
<source>After enabling the module, you must power cycle before using and configuring.</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
</context>
<context>
@ -4830,32 +4830,32 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../../src/plugins/config/camerastabilization.ui"/>
<source>Form</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Camera Stabilization</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Module Control</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Enable CameraStabilization module</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>After enabling the module, you must power cycle before using and configuring.</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Basic Settings (Stabilization)</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -4863,37 +4863,39 @@ p, li { white-space: pre-wrap; }
This value should be tuned for particular gimbal and servo. You also
have to define channel output range using Output configuration tab.</source>
<translation type="unfinished"></translation>
<translation>
Output</translation>
</message>
<message>
<location/>
<source>objname:CameraStabSettings</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>fieldname:OutputRange</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>element:Yaw</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>haslimits:no</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>scale:1</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>buttongroup:1</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -4901,12 +4903,14 @@ have to define channel output range using Output configuration tab.</source>
This value should be tuned for particular gimbal and servo. You also
have to define channel output range using Output configuration tab.</source>
<translation type="unfinished"></translation>
<translation>
Output</translation>
</message>
<message>
<location/>
<source>element:Pitch</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -4914,88 +4918,96 @@ have to define channel output range using Output configuration tab.</source>
This value should be tuned for particular gimbal and servo. You also
have to define channel output range using Output configuration tab.</source>
<translation type="unfinished"></translation>
<translation>
Output</translation>
</message>
<message>
<location/>
<source>element:Roll</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Yaw output channel for camera gimbal</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>None</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Pitch output channel for camera gimbal</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Roll output channel for camera gimbal</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Output Channel</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Yaw</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Pitch</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Roll</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Advanced Settings (Control)</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Input channel to control camera yaw
Don&apos;t forget to map this channel using Input configuration tab.</source>
<translation type="unfinished"></translation>
<translation>
Input</translation>
</message>
<message>
<location/>
<source>fieldname:Input</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Input channel to control camera pitch
Don&apos;t forget to map this channel using Input configuration tab.</source>
<translation type="unfinished"></translation>
<translation>
Input</translation>
</message>
<message>
<location/>
<source>Input channel to control camera roll
Don&apos;t forget to map this channel using Input configuration tab.</source>
<translation type="unfinished"></translation>
<translation>
Input</translation>
</message>
<message>
<location/>
<source>Input Channel</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -5003,77 +5015,80 @@ Don&apos;t forget to map this channel using Input configuration tab.</source>
Attitude: camera tracks level for the axis. Input controls the deflection.
AxisLock: camera remembers tracking attitude. Input controls the rate of deflection.</source>
<translation type="unfinished"></translation>
<translation>
Attitude
AxisLock</translation>
</message>
<message>
<location/>
<source>fieldname:StabilizationMode</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Attitude</source>
<translation type="unfinished">姿</translation>
<translation></translation>
</message>
<message>
<location/>
<source>Maximum camera yaw deflection for 100% input in Attitude mode, deg.</source>
<translation type="unfinished"></translation>
<translation>Attitude模式下</translation>
</message>
<message>
<location/>
<source>fieldname:InputRange</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Maximum camera yaw rate for 100% input in AxisLock mode, deg/s.</source>
<translation type="unfinished"></translation>
<translation>AxisLock模式下/</translation>
</message>
<message>
<location/>
<source>fieldname:InputRate</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>fieldname:ResponseTime</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Maximum camera pitch deflection for 100% input in Attitude mode, deg.</source>
<translation type="unfinished"></translation>
<translation>Attitude模式下</translation>
</message>
<message>
<location/>
<source>Maximum camera pitch rate for 100% input in AxisLock mode, deg/s.</source>
<translation type="unfinished"></translation>
<translation>AxisLock模式下/</translation>
</message>
<message>
<location/>
<source>Maximum camera roll deflection for 100% input in Attitude mode, deg.</source>
<translation type="unfinished"></translation>
<translation>Attitude模式下</translation>
</message>
<message>
<location/>
<source>Maximum camera roll rate for 100% input in AxisLock mode, deg/s.</source>
<translation type="unfinished"></translation>
<translation>AxisLock模式下/</translation>
</message>
<message>
<location/>
<source>MaxAxisLockRate</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Stabilization Mode</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>(the same value for Roll, Pitch, Yaw)</source>
<translation type="unfinished"></translation>
<translation>XYZ三个转动轴向</translation>
</message>
<message>
<location/>
@ -5085,32 +5100,34 @@ rate depending on input value.
If you have drift in your Tx controls, you may want to increase this
value.</source>
<translation type="unfinished"></translation>
<translation>AxisLock模式下XYZ三个轴向的转动速率死区 /
姿</translation>
</message>
<message>
<location/>
<source>fieldname:MaxAxisLockRate</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Messages</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Ctrl+S</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>button:help</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>url:http://wiki.openpilot.org/display/Doc/Camera+Stabilization+Configuration</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -5118,17 +5135,19 @@ value.</source>
Loaded settings are not applied automatically. You have to click the
Apply or Save button afterwards.</source>
<translation type="unfinished"></translation>
<translation>
</translation>
</message>
<message>
<location/>
<source>Reset To Defaults</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>button:default</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -5138,82 +5157,85 @@ settings.
Loaded settings are not applied automatically. You have to click the
Apply or Save button afterwards.</source>
<translation type="unfinished"></translation>
<translation>
使
</translation>
</message>
<message>
<location/>
<source>Reload Board Data</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>button:reload</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Send settings to the board but do not save to the non-volatile memory</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Apply</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>button:apply</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Send settings to the board and save to the non-volatile memory</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Save</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>button:save</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Output Range (Angle)</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Pitch Or Servo2</source>
<translation type="unfinished"></translation>
<translation>/2</translation>
</message>
<message>
<location/>
<source>Roll Or Servo1</source>
<translation type="unfinished"></translation>
<translation>/1</translation>
</message>
<message>
<location/>
<source>Input Rate (Speed)</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Input Range (Angle)</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Expert Settings (Attitude Filter and Feed Forward)</source>
<translation type="unfinished"></translation>
<translation>姿</translation>
</message>
<message>
<location/>
<source>Attitude Filter RT</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -5222,7 +5244,11 @@ Apply or Save button afterwards.</source>
Range: 0-250ms, 0 disables the filter (default).
Smoothes estimated airframe attitude used by camera stabilization.</source>
<translation type="unfinished"></translation>
<translation>
02500
使</translation>
</message>
<message>
<location/>
@ -5231,7 +5257,11 @@ Smoothes estimated airframe attitude used by camera stabilization.</source>
Range: 0-250ms, 0 disables the filter (default).
Smoothes estimated airframe attitude used by camera stabilization.</source>
<translation type="unfinished"></translation>
<translation>
02500
使</translation>
</message>
<message>
<location/>
@ -5240,12 +5270,16 @@ Smoothes estimated airframe attitude used by camera stabilization.</source>
Range: 0-250ms, 0 disables the filter (default).
Smoothes estimated airframe attitude used by camera stabilization.</source>
<translation type="unfinished"></translation>
<translation>
02500
使</translation>
</message>
<message>
<location/>
<source>FF Servo Acceleration</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -5255,12 +5289,17 @@ Range: 0-25, 0 disables feed forward for the axis (default).
Good starting value is 2-7.
Too high value may burn your servo!</source>
<translation type="unfinished"></translation>
<translation>
0250
27
</translation>
</message>
<message>
<location/>
<source>fieldname:FeedForward</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -5270,7 +5309,12 @@ Range: 0-25, 0 disables feed forward for the axis (default).
Good starting value is 2-7.
Too high value may burn your servo!</source>
<translation type="unfinished"></translation>
<translation>
0250
27
</translation>
</message>
<message>
<location/>
@ -5280,74 +5324,91 @@ Range: 0-25, 0 disables feed forward for the axis (default).
Good starting value is 2-7.
Too high value may burn your servo!</source>
<translation type="unfinished"></translation>
<translation>
0250
27
</translation>
</message>
<message>
<location/>
<source>FF Accel Time Constant</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Roll servo feed forward acceleration time constant
Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation>
<translation>
0505</translation>
</message>
<message>
<location/>
<source>fieldname:AccelTime</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Pitch servo feed forward acceleration time constant
Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation>
<translation>
0505</translation>
</message>
<message>
<location/>
<source>Yaw servo feed forward acceleration time constant
Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation>
<translation>
0505</translation>
</message>
<message>
<location/>
<source>FF Decel Time Constant</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Roll servo feed forward deceleration time constant
Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation>
<translation>
0505</translation>
</message>
<message>
<location/>
<source>fieldname:DecelTime</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Pitch servo feed forward deceleration time constant
Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation>
<translation>
0505</translation>
</message>
<message>
<location/>
<source>Yaw servo feed forward deceleration time constant
Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation>
<translation>
0505</translation>
</message>
<message>
<location/>
<source>Gimbal Type:</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -5355,22 +5416,23 @@ Range: 0-50ms, default is 5.</source>
Used to limit feed forward acceleration at extreme angles.
Generic type provides no limit.</source>
<translation type="unfinished"></translation>
<translation>
Generic类型表示不做限制</translation>
</message>
<message>
<location/>
<source>fieldname:GimbalType</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Yaw-Roll-Pitch</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>FF Max Acceleration</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -5379,17 +5441,21 @@ Generic type provides no limit.</source>
Range: 0-1000, default is 500.
The same value is used for all axes.</source>
<translation type="unfinished"></translation>
<translation>
01000500.
XYZ三个转动轴向</translation>
</message>
<message>
<location/>
<source>fieldname:MaxAccel</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Input configuration also provides smoothing for controls. Look for RT options on the RC Input tab.</source>
<translation type="unfinished"></translation>
<translation>Input设置页中对应输入通道的RT</translation>
</message>
</context>
<context>
@ -5412,7 +5478,7 @@ The same value is used for all axes.</source>
<message>
<location/>
<source>Changes on this page only take effect after board reset or power cycle</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location/>
@ -5561,7 +5627,7 @@ arming it in that case!</source>
<message>
<location/>
<source>Zero gyros while arming aircraft</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location/>
@ -5976,19 +6042,16 @@ p, li { white-space: pre-wrap; }
<translation> 0-100</translation>
</message>
<message>
<location/>
<source>Back</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location/>
<source>Next</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location/>
<source>Cancel</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location/>
@ -6207,7 +6270,7 @@ Applies and Saves all settings to SD</source>
<message>
<location/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Avoid &amp;quot;Manual&amp;quot; for multirotors! Never select &amp;quot;Altitude&amp;quot;, &amp;quot;VelocityControl&amp;quot; or &amp;quot;CruiseControl&amp;quot; on a fixed wing!&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &amp;quot;&amp;quot; &amp;quot;姿&amp;quot;, &amp;quot;&amp;quot; &amp;quot;&amp;quot;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; &amp;quot;&amp;quot; &amp;quot;姿&amp;quot;, &amp;quot;&amp;quot; &amp;quot;&amp;quot;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location/>
@ -6309,6 +6372,11 @@ Applies and Saves all settings to SD</source>
<source>fieldname:FlightModeAssistMap</source>
<translation></translation>
</message>
<message>
<location/>
<source>haslimits:yes</source>
<translation></translation>
</message>
</context>
<context>
<name>MixerCurve</name>
@ -6441,39 +6509,32 @@ Applies and Saves all settings to SD</source>
<translation></translation>
</message>
<message>
<location/>
<source>50</source>
<translation>50</translation>
<translation type="vanished">50</translation>
</message>
<message>
<location/>
<source>60</source>
<translation>60</translation>
<translation type="vanished">60</translation>
</message>
<message>
<location/>
<source>125</source>
<translation>125</translation>
<translation type="vanished">125</translation>
</message>
<message>
<location/>
<source>165</source>
<translation>165</translation>
<translation type="vanished">165</translation>
</message>
<message>
<location/>
<source>270</source>
<translation>270</translation>
<translation type="vanished">270</translation>
</message>
<message>
<location/>
<source>330</source>
<translation>330</translation>
<translation type="vanished">330</translation>
</message>
<message>
<location/>
<source>400</source>
<translation>400</translation>
<translation type="vanished">400</translation>
</message>
<message>
<location/>
@ -6539,9 +6600,8 @@ Applies and Saves all settings to SD</source>
<translation></translation>
</message>
<message>
<location/>
<source>490</source>
<translation>490</translation>
<translation type="vanished">490</translation>
</message>
<message>
<source>Output configuration</source>
@ -6581,20 +6641,24 @@ When using OneShot125 all values set in min/max and idle are divided by eight be
使OneShot125模式时/ 8 1000/8 = 125, 2000/8 = 250).</translation>
</message>
<message>
<location/>
<source>GroupBox</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Setup PWM rate here: usual value is 490 Hz for multirotor airframes.&lt;br/&gt;PWMSync and OneShot125 does not use this value.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;PWM490Hz&lt;br/&gt;&lt;br/&gt;PWMSync以及OneShot125则不需要配置此项</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;PWM490Hz&lt;br/&gt;&lt;br/&gt;PWMSync以及OneShot125则不需要配置此项</translation>
</message>
<message>
<location/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Setup output mode. Use PWM or PWMSync with Standard ESCs.&lt;br/&gt;Several other ESCs like BLHeli 13+ can use the more advanced OneShot125.&lt;br/&gt;When using OneShot125 all values set in min/max and idle are divided by &lt;br/&gt;eight before being sent to esc (i.e. 1000 = 125, 2000 = 250).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;PWM或OneShot模式&lt;br/&gt;BLHeli 13+OneShot125模式&lt;br/&gt;使OneShot125模式时/ 8&lt;/br&gt; 1000/8 = 125, 2000/8 = 250)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location/>
<source>Output Configuration</source>
<translation></translation>
</message>
</context>
<context>
<name>outputChannelForm</name>
@ -7403,7 +7467,7 @@ Useful if you have accidentally changed some settings.</source>
<message>
<location/>
<source>Reload Board Data</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -7413,7 +7477,7 @@ Useful if you have accidentally changed some settings.</source>
<message>
<location/>
<source>Send settings to the board but do not save to the non-volatile memory</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -7428,7 +7492,7 @@ Useful if you have accidentally changed some settings.</source>
<message>
<location/>
<source>Send settings to the board and save to the non-volatile memory</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -8135,7 +8199,7 @@ response (deg)</source>
<message>
<location/>
<source>Module Control</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -8157,7 +8221,7 @@ Up to 3 separate PID options (or option pairs) can be selected and updated.</sou
<message>
<location/>
<source>After enabling the module, you must power cycle before using and configuring.</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
@ -8272,7 +8336,7 @@ only when system is armed without disabling the module.</source>
<message>
<location/>
<source>Messages</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -8287,7 +8351,7 @@ only when system is armed without disabling the module.</source>
<message>
<location/>
<source>Send settings to the board but do not save to the non-volatile memory</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -8297,7 +8361,7 @@ only when system is armed without disabling the module.</source>
<message>
<location/>
<source>Send settings to the board and save to the non-volatile memory</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -8793,7 +8857,7 @@ only when system is armed without disabling the module.</source>
<translation></translation>
</message>
<message>
<location line="+213"/>
<location line="+230"/>
<source>Save File</source>
<translation></translation>
</message>
@ -8981,7 +9045,7 @@ p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Cantarell&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt; font-weight:600;&quot;&gt;OpenPilot设备识别&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot;font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;OpenPilot控制板尚未连接USB连接好&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</translation>
</message>
@ -9050,8 +9114,8 @@ p, li { white-space: pre-wrap; }
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Cantarell&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt; font-weight:600;&quot;&gt;OpenPilot遥控器类型设置&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;OpenPilot支持绝大多数遥控器&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;OpenPilot控制板重启才能生效&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;OpenPilot支持绝大多数遥控器&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;OpenPilot控制板重启才能生效&lt;/span&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
@ -9070,88 +9134,87 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../../src/plugins/setupwizard/pages/multipage.cpp" line="+58"/>
<source>Tricopter</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+1"/>
<source>The Tricopter uses three motors and one servo. The servo is used to give yaw authority to the rear motor. The front motors are rotating in opposite directions. The Tricopter is known for its sweeping yaw movement and it is very well suited for FPV since the front rotors are spread wide apart.</source>
<translatorcomment></translatorcomment>
<translation></translation>
<translation>广YawFPV)</translation>
</message>
<message>
<location line="+6"/>
<source>Quadcopter X</source>
<translation>X型四</translation>
<translation>X型四旋翼</translation>
</message>
<message>
<location line="+1"/>
<source>The X Quadcopter uses four motors and is the most common multi rotor configuration. Two of the motors rotate clockwise and two counter clockwise. The motors positioned diagonal to each other rotate in the same direction. This setup is perfect for sport flying and is also commonly used for FPV platforms.</source>
<translation>X型四轴是目前最常见的一种多轴飞行器</translation>
<translation>X型四旋翼是目前最常见的一种多旋翼飞行器FPV</translation>
</message>
<message>
<location line="+6"/>
<source>Quadcopter +</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+1"/>
<source>The Plus(+) Quadcopter uses four motors and is similar to the X Quadcopter but the forward direction is offset by 45 degrees. The motors front and rear rotate in clockwise and the motors right and left rotate counter-clockwise. This setup was one of the first to be used and is still used for sport flying. This configuration is not that well suited for FPV since the fore rotor tend to be in the way of the camera.</source>
<translation>X型四轴45</translation>
<translation>X型四旋翼45FPV</translation>
</message>
<message>
<location line="+7"/>
<source>Hexacopter</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+1"/>
<source>A multirotor with six motors, one motor in front.</source>
<translation>1</translation>
<translation>1</translation>
</message>
<message>
<location line="+5"/>
<source>A multirotor with six motors, two motors in front.</source>
<translation>16</translation>
<translation>16</translation>
</message>
<message>
<location line="+5"/>
<source>A multirotor with six motors in two rows.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+4"/>
<source>Hexacopter Coax (Y6)</source>
<translation> Y6</translation>
<translation> Y6</translation>
</message>
<message>
<location line="+1"/>
<source>A multirotor with six motors mounted in a coaxial fashion.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="-11"/>
<source>Hexacopter X</source>
<translation>X型六</translation>
<translation>X型六旋翼</translation>
</message>
<message>
<location line="-33"/>
<source>OpenPilot Multirotor Configuration</source>
<translation>OpenPilot多飞行器设置</translation>
<translation>OpenPilot多旋翼飞行器设置</translation>
</message>
<message>
<location line="+1"/>
<source>This part of the wizard will set up the OpenPilot controller for use with a flying platform utilizing multiple rotors. The wizard supports the most common types of multirotors. Other variants of multirotors can be configured by using custom configuration options in the Configuration plugin in the GCS.
Please select the type of multirotor you want to create a configuration for below:</source>
<translation>OpenPilot目前支持绝大部分的多飞行器类型
<translation>OpenPilot目前支持绝大部分的多旋翼飞行器类型
ConfigurationVehicle
</translation>
</translation>
</message>
<message>
<location line="+37"/>
<source>Hexacopter H</source>
<translation>H型六</translation>
<translation>H型六旋翼</translation>
</message>
</context>
<context>
@ -9224,7 +9287,7 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt; font-weight:600; color:#ff0000;&quot;&gt;VERY IMPORTANT!&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt; font-weight:600; color:#ff0000;&quot;&gt;REMOVE ALL PROPELLERS FROM THE VEHICLE BEFORE PROCEEDING!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt;&quot;&gt;Connect all components according to the illustration on the summary page, and provide power using an external power supply such as a battery before continuing.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt;&quot;&gt;Depending on what vehicle you have selected, both the motors controlled by ESCs and/or servos controlled directly by the OpenPilot controller may have to be calibrated. The following steps will guide you safely through this process. &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
<translation type="unfinished">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Cantarell&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
@ -9232,7 +9295,7 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt; font-weight:600; color:#ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt; font-weight:600; color:#ff0000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Lucida Grande&apos;; font-size:10pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
@ -9387,7 +9450,7 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt; font-weight:600;&quot;&gt;OpenPilot设置概要&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;OpenPilot设备配置已经完成&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;CONNECTION DIAGRAM&amp;quot;使USB连接OpenPilot设备&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;CONNECTION DIAGRAM&amp;quot;使USB连接OpenPilot设备&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
@ -9456,12 +9519,12 @@ Please select the type of ground vehicle you want to create a configuration for
<message>
<location/>
<source>Tricopter, Quadcopter, Hexacopter</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Multirotor</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location/>
@ -9477,7 +9540,7 @@ Please select the type of ground vehicle you want to create a configuration for
<location/>
<source>Airplane, Sloper, Jet</source>
<translatorcomment></translatorcomment>
<translation> </translation>
<translation></translation>
</message>
<message>
<location/>
@ -9509,8 +9572,8 @@ p, li { white-space: pre-wrap; }
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Cantarell&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt; font-weight:600;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;OpenPilot GCS只支持多轴飞行器和固定翼飞机&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:10pt;&quot;&gt;OpenPilot GCS只支持多旋翼飞行器和固定翼飞机&lt;/span&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</translation>
</message>
@ -10087,7 +10150,7 @@ p, li { white-space: pre-wrap; }
<translation></translation>
</message>
<message>
<location line="+419"/>
<location line="+420"/>
<location line="+24"/>
<location line="+31"/>
<location line="+31"/>
@ -10177,7 +10240,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../../src/plugins/config/configgadgetwidget.cpp" line="+218"/>
<source>Unsaved changes</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+0"/>
@ -10189,27 +10252,27 @@ Do you still want to proceed?</source>
<context>
<name>ConfigInputWidget</name>
<message>
<location filename="../../../src/plugins/config/configinputwidget.cpp" line="+385"/>
<location filename="../../../src/plugins/config/configinputwidget.cpp" line="+388"/>
<source>http://wiki.openpilot.org/x/04Cf</source>
<translation></translation>
</message>
<message>
<location line="+7"/>
<source>Arming Settings are now set to &apos;Always Disarmed&apos; for your safety.</source>
<translation></translation>
<translation>
</translation>
</message>
<message>
<location line="+1"/>
<source>You will have to reconfigure the arming settings manually when the wizard is finished. After the last step of the wizard you will be taken to the Arming Settings screen.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+211"/>
<location line="+210"/>
<source>Next</source>
<translation></translation>
</message>
<message>
<location line="+12"/>
<source>Welcome to the inputs configuration wizard.
Please follow the instructions on the screen and only move your controls when asked to.
@ -10217,7 +10280,7 @@ Make sure you already configured your hardware settings on the proper tab and re
You can press &apos;back&apos; at any time to return to the previous screen or press &apos;Cancel&apos; to quit the wizard.
</source>
<translation>使
<translation type="vanished">使
@ -10225,32 +10288,23 @@ You can press &apos;back&apos; at any time to return to the previous screen or p
</translation>
</message>
<message>
<location line="+12"/>
<source>Please choose your transmitter type:</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location line="+2"/>
<source>Acro: normal transmitter for fixed-wing or quad</source>
<translation>Acro</translation>
<translation type="vanished">Acro</translation>
</message>
<message>
<location line="+1"/>
<source>Helicopter: has collective pitch and throttle input</source>
<translation>Helicopter</translation>
<translation type="vanished">Helicopter</translation>
</message>
<message>
<location line="+6"/>
<source>If selecting the Helicopter option, please engage throttle hold now.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>Please choose your transmitter mode:</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location line="+6"/>
<location line="+45"/>
<source>Mode 1: Fore/Aft Cyclic and Yaw on the left, Throttle/Collective and Left/Right Cyclic on the right</source>
<translation type="unfinished"></translation>
</message>
@ -10270,7 +10324,7 @@ You can press &apos;back&apos; at any time to return to the previous screen or p
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+6"/>
<source>Mode 1: Elevator and Rudder on the left, Throttle and Ailerons on the right</source>
<translation>1</translation>
</message>
@ -10292,42 +10346,38 @@ You can press &apos;back&apos; at any time to return to the previous screen or p
<message>
<location line="+3"/>
<source>For a Quad: Elevator is Pitch, Ailerons are Roll, and Rudder is Yaw.</source>
<translation></translation>
<translation>ELEVAILERUDD</translation>
</message>
<message>
<location line="+21"/>
<source>Please center all controls and trims and press Next when ready.
If your FlightMode switch has only two positions, leave it in either position.</source>
<translation>
<translation type="vanished">
</translation>
</message>
<message>
<location line="+6"/>
<source>Please move all controls to their maximum extents on both directions.
Press Next when ready.</source>
<translation>
<translation type="vanished">
</translation>
</message>
<message>
<location line="+36"/>
<source>Please check the picture below and correct all the sticks which show an inverted movement. Press Next when ready.</source>
<translation></translation>
<translation type="vanished"></translation>
</message>
<message>
<location line="+7"/>
<source>You have completed this wizard, please check below if the picture mimics your sticks movement.
IMPORTANT: These new settings have not been saved to the board yet. After pressing Next you will go to the Arming Settings tab where you can set your desired arming sequence and save the configuration.</source>
<translation>
<translation type="vanished">
</translation>
</message>
<message>
<location line="+124"/>
<location line="+191"/>
<source>Please enable throttle hold mode.
Move the Collective Pitch stick.</source>
@ -10338,7 +10388,7 @@ Move the Collective Pitch stick.</source>
<source>Please toggle the Flight Mode switch.
For switches you may have to repeat this rapidly.</source>
<translation>
<translation>
</translation>
</message>
@ -10361,7 +10411,7 @@ Move the %1 stick.</source>
<message>
<location line="+6"/>
<source>Next / Skip</source>
<translation>/</translation>
<translation>/</translation>
</message>
<message>
<location line="+726"/>
@ -10371,7 +10421,7 @@ Move the %1 stick.</source>
<message>
<location line="+3"/>
<source>&lt;p&gt;Arming Settings are now set to &apos;Always Disarmed&apos; for your safety.&lt;/p&gt;&lt;p&gt;Be sure your receiver is powered with an external source and Transmitter is on.&lt;/p&gt;&lt;p align=&apos;center&apos;&gt;&lt;b&gt;Stop Manual Calibration&lt;/b&gt; when done&lt;/p&gt;</source>
<translation>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p align=&apos;center&apos;&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;</translation>
<translation>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p align=&apos;center&apos;&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;</translation>
</message>
<message>
<location line="+3"/>
@ -10386,7 +10436,7 @@ Move the %1 stick.</source>
<message>
<location line="-764"/>
<source> Alternatively, click Next to skip this channel.</source>
<translation>/</translation>
<translation>/</translation>
</message>
</context>
<context>
@ -10394,23 +10444,23 @@ Move the %1 stick.</source>
<message>
<location filename="../../../src/plugins/coreplugin/connectionmanager.cpp" line="+53"/>
<source>USB: OPLinkMini</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location line="+13"/>
<source>Connections:</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location line="+72"/>
<source>Disconnect</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location line="-81"/>
<location line="+127"/>
<source>Connect</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
</context>
<context>
@ -10542,7 +10592,7 @@ Move the %1 stick.</source>
<message>
<location filename="../../../src/plugins/modelview/modelviewgadgetfactory.cpp" line="+36"/>
<source>ModelView</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
</context>
<context>
@ -10712,21 +10762,21 @@ Move the %1 stick.</source>
<location line="+24"/>
<location line="+6"/>
<location line="+19"/>
<location line="+13"/>
<location line="+16"/>
<location line="+16"/>
<location line="+38"/>
<source>Unknown</source>
<translation></translation>
</message>
<message>
<location line="-179"/>
<location line="-182"/>
<source>Vehicle type: </source>
<translation> </translation>
</message>
<message>
<location line="+3"/>
<source>Multirotor</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+3"/>
@ -10738,58 +10788,57 @@ Move the %1 stick.</source>
<message>
<location line="-66"/>
<source>Tricopter</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+3"/>
<source>Quadcopter X</source>
<translation>X型四</translation>
<translation>X型四旋翼</translation>
</message>
<message>
<location line="+3"/>
<source>Quadcopter +</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+3"/>
<source>Hexacopter</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+3"/>
<source>Hexacopter Coax (Y6)</source>
<translatorcomment></translatorcomment>
<translation> Y6</translation>
<translation> Y6</translation>
</message>
<message>
<location line="+3"/>
<source>Hexacopter H</source>
<translation>H型六</translation>
<translation>H型六旋翼</translation>
</message>
<message>
<location line="+3"/>
<source>Hexacopter X</source>
<translation>X型六</translation>
<translation>X型六旋翼</translation>
</message>
<message>
<location line="+3"/>
<source>Octocopter</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+3"/>
<source>Octocopter Coax X</source>
<translation>X型八</translation>
<translation>X型八旋翼</translation>
</message>
<message>
<location line="+3"/>
<source>Octocopter Coax +</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location line="+3"/>
<source>Octocopter V</source>
<translation>V型八</translation>
<translation>V型八旋翼</translation>
</message>
<message>
<location line="+9"/>
@ -10877,7 +10926,12 @@ Move the %1 stick.</source>
<translation>ESC </translation>
</message>
<message>
<location line="+16"/>
<location line="+9"/>
<source>Oneshot ESC</source>
<translation>Oneshot电调</translation>
</message>
<message>
<location line="+10"/>
<source>Servo type: </source>
<translation> </translation>
</message>
@ -10957,16 +11011,16 @@ Move the %1 stick.</source>
<location filename="../../../src/plugins/setupwizard/vehicleconfigurationhelper.cpp" line="+85"/>
<location line="+12"/>
<source>Done!</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location line="-12"/>
<location line="+12"/>
<source>Failed!</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location line="+136"/>
<location line="+141"/>
<source>Writing External Mag sensor settings</source>
<translation type="unfinished"></translation>
</message>
@ -10986,9 +11040,9 @@ Move the %1 stick.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+31"/>
<location line="+36"/>
<location line="+199"/>
<location line="+32"/>
<location line="+37"/>
<source>Writing actuator settings</source>
<translation type="unfinished"></translation>
</message>
@ -11748,6 +11802,11 @@ The board will be restarted and all settings erased.</source>
<source>-</source>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
<source>Prev</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CustomConfigWidget</name>
@ -11872,17 +11931,17 @@ The board will be restarted and all settings erased.</source>
<message>
<location filename="../../../src/plugins/config/airframe_fixedwing.ui"/>
<source>Form</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Airframe</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Throttle Curve</source>
<translation type="unfinished">线</translation>
<translation>线</translation>
</message>
<message>
<location/>
@ -12105,7 +12164,7 @@ The board will be restarted and all settings erased.</source>
<source>Weight of Roll mixing in percent.
Typical values are 100% for + configuration and 50% for X configuration on quads</source>
<translation>
100%X型则使用50%</translation>
100%X型则使用50%</translation>
</message>
<message>
<location/>
@ -12122,7 +12181,7 @@ Typical values are 100% for + configuration and 50% for X configuration on quads
<source>Weight of Pitch mixing in percent.
Typical values are 100% for + configuration and 50% for X configuration on quads.</source>
<translation>
100%X型则使用50%</translation>
100%X型则使用50%</translation>
</message>
<message>
<location/>
@ -12133,8 +12192,8 @@ Typical values are 100% for + configuration and 50% for X configuration on quads
<location/>
<source>Weight of Yaw mixing in percent.
Typical value is 50% for + or X configuration on quads.</source>
<translation type="unfinished">
X型四飞行器通常都设为50%</translation>
<translation>
X型四旋翼飞行器通常都设为50%</translation>
</message>
<message>
<location/>
@ -12209,7 +12268,7 @@ Typical value is 50% for + or X configuration on quads.</source>
<message>
<location/>
<source>Tricopter Yaw Servo channel</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location/>
@ -12219,72 +12278,72 @@ Typical value is 50% for + or X configuration on quads.</source>
<message>
<location/>
<source>Select output channel for Accessory0 RcInput</source>
<translation type="unfinished"></translation>
<translation>Accessory0控制量选择一个输出通道</translation>
</message>
<message>
<location/>
<source>Accessory1</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>RcOutput channels</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>RC Output</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Accessory0</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>RC Input</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Select output channel for Accessory2 RcInput</source>
<translation type="unfinished"></translation>
<translation>Accessory2控制量选择一个输出通道</translation>
</message>
<message>
<location/>
<source>Select output channel for Accessory1 RcInput</source>
<translation type="unfinished"></translation>
<translation>Accessory1控制量选择一个输出通道</translation>
</message>
<message>
<location/>
<source>Accessory2</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>RcOutput curve</source>
<translation type="unfinished"></translation>
<translation>线</translation>
</message>
<message>
<location/>
<source>Curve</source>
<translation type="unfinished"></translation>
<translation>线</translation>
</message>
<message>
<location/>
<source>Select output curve for Accessory0 RcInput</source>
<translation type="unfinished"></translation>
<translation> Accessory0选择一个输出曲线</translation>
</message>
<message>
<location/>
<source>Select output curve for Accessory1 RcInput</source>
<translation type="unfinished"></translation>
<translation> Accessory1选择一个输出曲线</translation>
</message>
<message>
<location/>
<source>Select output curve for Accessory2 RcInput</source>
<translation type="unfinished"></translation>
<translation> Accessory2选择一个输出曲线</translation>
</message>
</context>
<context>
@ -12808,7 +12867,7 @@ even lead to crash. Use with caution.</source>
<message>
<location/>
<source>Send settings to the board but do not save to the non-volatile memory</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -12818,7 +12877,7 @@ even lead to crash. Use with caution.</source>
<message>
<location/>
<source>Send settings to the board and save to the non-volatile memory</source>
<translation type="unfinished"></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
@ -13134,12 +13193,12 @@ p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Cantarell&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt; font-weight:600;&quot;&gt;Initial Tuning&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2,sans-serif&apos;; font-size:10pt;&quot;&gt;This section of the OpenPilot Wizard allows you to select a set of initial tuning parameters for your airframe. Presented below is a list of common airframe types, select the one that matches your airframe the closest, if unsure select the generic variant.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
<translation type="unfinished">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Cantarell&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p align=&quot;center&quot; style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt; font-weight:600;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2,sans-serif&apos;; font-size:10pt;&quot;&gt;OpenPilot根据目前流行的多飞行器提供了一系列机型的稳态飞行控制参数Generic开头的选项&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2,sans-serif&apos;; font-size:10pt;&quot;&gt;OpenPilot根据目前流行的多旋翼飞行器提供了一系列机型的稳态飞行控制参数Generic开头的选项&lt;/span&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
@ -13212,7 +13271,7 @@ It is suggested that if this is a first time configuration of your controller, r
使Generic开头的选项</translation>
</message>
<message>
<location line="+85"/>
<location line="+93"/>
<source>Current Tuning</source>
<translation></translation>
</message>
@ -13395,6 +13454,11 @@ p, li { white-space: pre-wrap; }
<source>Rapid ESC</source>
<translation></translation>
</message>
<message>
<location/>
<source>OneShot ESC</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>OPEndPage</name>
@ -14233,7 +14297,18 @@ Please first select the area of the map to rip with &lt;CTRL&gt;+Left mouse clic
<context>
<name>ConfigOutputWidget</name>
<message>
<location filename="../../../src/plugins/config/configoutputwidget.cpp" line="+160"/>
<location filename="../../../src/plugins/config/configoutputwidget.cpp" line="+111"/>
<source>-</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<location line="+261"/>
<source>%1 Hz</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-201"/>
<source>The actuator module is in an error state. This can also occur because there are no inputs. Please fix these before testing outputs.</source>
<translation type="unfinished"></translation>
</message>
@ -14248,14 +14323,18 @@ Please first select the area of the map to rip with &lt;CTRL&gt;+Left mouse clic
<translation></translation>
</message>
<message>
<location line="+238"/>
<location line="+219"/>
<source>http://wiki.openpilot.org/x/WIGf</source>
<translation></translation>
</message>
<message>
<location line="+16"/>
<location line="+32"/>
<source>OneShot only works with Receiver Port settings marked with &apos;+OneShot&apos;&lt;br&gt;When using Receiver Port setting &apos;PPM_PIN8+OneShot&apos; &lt;b&gt;&lt;font color=&apos;%1&apos;&gt;Bank %2&lt;/font&gt;&lt;/b&gt; must be set to PWM</source>
<translation>+OneShot&lt;br&gt;PPM_PIN6+OneShot&lt;b&gt;&lt;font color=&apos;%1&apos;&gt;%2&lt;/font&gt;&lt;/b&gt;PWM</translation>
</message>
<message>
<source>OneShot only works with Receiver Port settings marked with &apos;+OneShot&apos;&lt;br&gt;When using Receiver Port setting &apos;PPM_PIN6+OneShot&apos; &lt;b&gt;&lt;font color=&apos;#C3A8FF&apos;&gt;Bank 4 (output 6,9-10)&lt;/font&gt;&lt;/b&gt; must be set to PWM</source>
<translation>+OneShot&lt;br&gt;PPM_PIN6+OneShot&lt;b&gt;&lt;font color=&apos;#C3A8FF&apos;&gt;469-10&lt;/font&gt;&lt;/b&gt;PWM</translation>
<translation type="vanished">+OneShot&lt;br&gt;PPM_PIN6+OneShot&lt;b&gt;&lt;font color=&apos;#C3A8FF&apos;&gt;469-10&lt;/font&gt;&lt;/b&gt;PWM</translation>
</message>
</context>
<context>
@ -14388,7 +14467,7 @@ not only the ones visible on screen.</source>
<message>
<location filename="../../../src/plugins/config/configvehicletypewidget.cpp" line="+142"/>
<source>Multirotor</source>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
@ -15282,6 +15361,7 @@ Note: for the OpenPilot v8 GPS please select the U-Blox option.</source>
<context>
<name>InputWizardWidget</name>
<message>
<location filename="../../../src/plugins/config/input_wizard.ui"/>
<source>Welcome to the inputs configuration wizard.
Please follow the instructions on the screen and only move your controls when asked to.
@ -15289,68 +15369,182 @@ Make sure you already configured your hardware settings on the proper tab and re
You can press &apos;back&apos; at any time to return to the previous screen or press &apos;Cancel&apos; to quit the wizard.
</source>
<translation type="obsolete">使
<translation>使
退
退
</translation>
</message>
<message>
<location/>
<source>Please choose your transmitter type:</source>
<translation type="obsolete"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Acro: normal transmitter for fixed-wing or quad</source>
<translation type="obsolete">Acro</translation>
<translation>Acro</translation>
</message>
<message>
<location/>
<source>Helicopter: has collective pitch and throttle input</source>
<translation type="obsolete">Helicopter</translation>
<translation type="unfinished">Helicopter</translation>
</message>
<message>
<location/>
<source>Please choose your transmitter mode:</source>
<translation type="obsolete"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>For a Quad: Elevator is Pitch, Ailerons are Roll, and Rudder is Yaw.</source>
<translation type="obsolete"></translation>
<translation>ELEVAILERUDD</translation>
</message>
<message>
<location/>
<source>Please center all controls and trims and press Next when ready.
If your FlightMode switch has only two positions, leave it in either position.</source>
<translation type="obsolete">
<translation>
</translation>
</message>
<message>
<location/>
<source>Please move all controls to their maximum extents on both directions.
Press Next when ready.</source>
<translation type="obsolete">
<translation>
</translation>
</message>
<message>
<location/>
<source>Please check the picture below and correct all the sticks which show an inverted movement. Press Next when ready.</source>
<translation type="obsolete"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>You have completed this wizard, please check below if the picture mimics your sticks movement.
IMPORTANT: These new settings have not been saved to the board yet. After pressing Next you will go to the Arming Settings tab where you can set your desired arming sequence and save the configuration.</source>
<translation type="obsolete">
<translation>
</translation>
</message>
<message>
<location/>
<source>Back</source>
<translation type="obsolete"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>Cancel</source>
<translation type="obsolete"></translation>
<translation></translation>
</message>
<message>
<location/>
<source>If selecting the Helicopter option, please engage throttle hold now.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location/>
<source>Mode 1</source>
<translation></translation>
</message>
<message>
<location/>
<source>Mode 2</source>
<translation></translation>
</message>
<message>
<location/>
<source>Mode 3</source>
<translation></translation>
</message>
<message>
<location/>
<source>Mode 4</source>
<translation></translation>
</message>
<message>
<location/>
<source>Identify sticks instructions</source>
<translation></translation>
</message>
<message>
<location/>
<source>Next</source>
<translation></translation>
</message>
</context>
<context>
<name>ConfigCcpmWidget</name>
<message>
<location filename="../../../src/plugins/config/cfg_vehicletypes/configccpmwidget.cpp" line="+1081"/>
<source>&lt;h1&gt;Swashplate Leveling Routine&lt;/h1&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>&lt;b&gt;You are about to start the Swashplate levelling routine.&lt;/b&gt;&lt;p&gt;This process will start by downloading the current configuration from the GCS to the OP hardware and will adjust your configuration at various stages.&lt;p&gt;The final state of your system should match the current configuration in the GCS config gadget.&lt;/p&gt;&lt;p&gt;Please ensure all ccpm settings in the GCS are correct before continuing.&lt;/p&gt;&lt;p&gt;If this process is interrupted, then the state of your OP board may not match the GCS configuration.&lt;/p&gt;&lt;p&gt;&lt;i&gt;After completing this process, please check all settings before attempting to fly.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=red&gt;&lt;b&gt;Please disconnect your motor to ensure it will not spin up.&lt;/b&gt;&lt;/font&gt;&lt;p&gt;&lt;hr&gt;&lt;i&gt;Do you wish to proceed?&lt;/i&gt;&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+128"/>
<source>&lt;h2&gt;Neutral levelling&lt;/h2&gt;&lt;p&gt;Using adjustment of:&lt;ul&gt;&lt;li&gt;Servo horns,&lt;/li&gt;&lt;li&gt;Link lengths,&lt;/li&gt;&lt;li&gt;Neutral triming spinboxes to the right&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Ensure that the swashplate is in the center of desired travel range and is level.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>&lt;h2&gt;Max levelling&lt;/h2&gt;&lt;p&gt;Using adjustment of:&lt;ul&gt;&lt;li&gt;Max triming spinboxes to the right ONLY&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Ensure that the swashplate is at the top of desired travel range and is level.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>&lt;h2&gt;Min levelling&lt;/h2&gt;&lt;p&gt;Using adjustment of:&lt;ul&gt;&lt;li&gt;Min triming spinboxes to the right ONLY&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Ensure that the swashplate is at the bottom of desired travel range and is level.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<source>&lt;h2&gt;Levelling verification&lt;/h2&gt;&lt;p&gt;Adjust the slider to the right over it&apos;s full range and observe the swashplate motion. It should remain level over the entire range of travel.&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>&lt;h2&gt;Levelling complete&lt;/h2&gt;&lt;p&gt;Press the Finish button to save these settings to the SD card&lt;/p&gt;&lt;p&gt;Press the cancel button to return to the pre-levelling settings&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<source>&lt;h2&gt;Levelling Cancelled&lt;/h2&gt;&lt;p&gt;Previous settings have been restored.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<source>&lt;h2&gt;Levelling Completed&lt;/h2&gt;&lt;p&gt;New settings have been saved to the SD card</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<source>&lt;font color=red&gt;&lt;h1&gt;Warning!!!&lt;/h2&gt;&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>&lt;h2&gt;This code has many configurations.&lt;/h2&gt;&lt;p&gt;Please double check all settings before attempting flight!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>&lt;h2&gt;The CCPM mixer code needs more testing!&lt;/h2&gt;&lt;p&gt;&lt;font color=red&gt;Use it at your own risk!&lt;/font&gt;&lt;p&gt;Do you wish to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>&lt;h2&gt;The CCPM swashplate levelling code is NOT complete!&lt;/h2&gt;&lt;p&gt;&lt;font color=red&gt;DO NOT use it for flight!&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -491,7 +491,7 @@
<x>0</x>
<y>0</y>
<width>1228</width>
<height>661</height>
<height>669</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_7" rowstretch="1,0,0,0">
@ -1967,7 +1967,7 @@ font:bold;</string>
<string>objname:StabilizationSettings</string>
<string>fieldname:FlightModeAssistMap</string>
<string>index:0</string>
<string>haslimits:no</string>
<string>haslimits:yes</string>
<string>scale:1</string>
<string>buttongroup:16</string>
</stringlist>
@ -1993,7 +1993,7 @@ font:bold;</string>
<string>objname:StabilizationSettings</string>
<string>fieldname:FlightModeAssistMap</string>
<string>index:1</string>
<string>haslimits:no</string>
<string>haslimits:yes</string>
<string>scale:1</string>
<string>buttongroup:16</string>
</stringlist>
@ -2019,7 +2019,7 @@ font:bold;</string>
<string>objname:StabilizationSettings</string>
<string>fieldname:FlightModeAssistMap</string>
<string>index:2</string>
<string>haslimits:no</string>
<string>haslimits:yes</string>
<string>scale:1</string>
<string>buttongroup:16</string>
</stringlist>
@ -2048,7 +2048,7 @@ font:bold;</string>
<string>objname:StabilizationSettings</string>
<string>fieldname:FlightModeAssistMap</string>
<string>index:3</string>
<string>haslimits:no</string>
<string>haslimits:yes</string>
<string>scale:1</string>
<string>buttongroup:16</string>
</stringlist>
@ -2077,7 +2077,7 @@ font:bold;</string>
<string>objname:StabilizationSettings</string>
<string>fieldname:FlightModeAssistMap</string>
<string>index:4</string>
<string>haslimits:no</string>
<string>haslimits:yes</string>
<string>scale:1</string>
<string>buttongroup:16</string>
</stringlist>
@ -2106,7 +2106,7 @@ font:bold;</string>
<string>objname:StabilizationSettings</string>
<string>fieldname:FlightModeAssistMap</string>
<string>index:5</string>
<string>haslimits:no</string>
<string>haslimits:yes</string>
<string>scale:1</string>
<string>buttongroup:16</string>
</stringlist>
@ -2220,7 +2220,7 @@ font:bold;</string>
<x>0</x>
<y>0</y>
<width>1228</width>
<height>661</height>
<height>669</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">

View File

@ -11,7 +11,7 @@
At the discretion of the user of this library,
this software may be licensed under the terms of the
GNU Public License v3, a BSD-Style license, or the
GNU General Public License v3, a BSD-Style license, or the
original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution.
@ -218,7 +218,8 @@ extern "C" {
@returns
This function returns the actual number of bytes read and
-1 on error.
-1 on error. If no packet was available to be read within
the timeout period, this function returns 0.
*/
int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds);
@ -237,7 +238,8 @@ extern "C" {
@returns
This function returns the actual number of bytes read and
-1 on error.
-1 on error. If no packet was available to be read and
the handle is in non-blocking mode, this function returns 0.
*/
int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length);
@ -291,22 +293,26 @@ extern "C" {
/** @brief Get a feature report from a HID device.
Make sure to set the first byte of @p data[] to the Report
ID of the report to be read. Make sure to allow space for
this extra byte in @p data[].
Set the first byte of @p data[] to the Report ID of the
report to be read. Make sure to allow space for this
extra byte in @p data[]. Upon return, the first byte will
still contain the Report ID, and the report data will
start in data[1].
@ingroup API
@param device A device handle returned from hid_open().
@param data A buffer to put the read data into, including
the Report ID. Set the first byte of @p data[] to the
Report ID of the report to be read.
Report ID of the report to be read, or set it to zero
if your device does not use numbered reports.
@param length The number of bytes to read, including an
extra byte for the report ID. The buffer can be longer
than the actual report.
@returns
This function returns the number of bytes read and
-1 on error.
This function returns the number of bytes read plus
one for the report ID (which is still in the first
byte), or -1 on error.
*/
int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length);

View File

@ -14,7 +14,7 @@
At the discretion of the user of this library,
this software may be licensed under the terms of the
GNU Public License v3, a BSD-Style license, or the
GNU General Public License v3, a BSD-Style license, or the
original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution.
@ -44,11 +44,74 @@
#include <wchar.h>
/* GNU / LibUSB */
#include "libusb.h"
#include "iconv.h"
#include <libusb.h>
#ifndef __ANDROID__
#include <iconv.h>
#endif
#include "../hidapi.h"
#ifdef __ANDROID__
/* Barrier implementation because Android/Bionic don't have pthread_barrier.
This implementation came from Brent Priddy and was posted on
StackOverflow. It is used with his permission. */
typedef int pthread_barrierattr_t;
typedef struct pthread_barrier {
pthread_mutex_t mutex;
pthread_cond_t cond;
int count;
int trip_count;
} pthread_barrier_t;
static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count)
{
if(count == 0) {
errno = EINVAL;
return -1;
}
if(pthread_mutex_init(&barrier->mutex, 0) < 0) {
return -1;
}
if(pthread_cond_init(&barrier->cond, 0) < 0) {
pthread_mutex_destroy(&barrier->mutex);
return -1;
}
barrier->trip_count = count;
barrier->count = 0;
return 0;
}
static int pthread_barrier_destroy(pthread_barrier_t *barrier)
{
pthread_cond_destroy(&barrier->cond);
pthread_mutex_destroy(&barrier->mutex);
return 0;
}
static int pthread_barrier_wait(pthread_barrier_t *barrier)
{
pthread_mutex_lock(&barrier->mutex);
++(barrier->count);
if(barrier->count >= barrier->trip_count)
{
barrier->count = 0;
pthread_cond_broadcast(&barrier->cond);
pthread_mutex_unlock(&barrier->mutex);
return 1;
}
else
{
pthread_cond_wait(&barrier->cond, &(barrier->mutex));
pthread_mutex_unlock(&barrier->mutex);
return 0;
}
}
#endif
#ifdef __cplusplus
extern "C" {
#endif
@ -105,6 +168,7 @@ struct hid_device_ {
pthread_cond_t condition;
pthread_barrier_t barrier; /* Ensures correct startup sequence */
int shutdown_thread;
int cancelled;
struct libusb_transfer *transfer;
/* List of received input reports. */
@ -249,9 +313,9 @@ static int get_usage(uint8_t *report_descriptor, size_t size,
}
#endif /* INVASIVE_GET_USAGE */
#ifdef __FreeBSD__
/* The FreeBSD version of libusb doesn't have this funciton. In mainline
libusb, it's inlined in libusb.h. This function will bear a striking
#if defined(__FreeBSD__) && __FreeBSD__ < 10
/* The libusb version included in FreeBSD < 10 doesn't have this function. In
mainline libusb, it's inlined in libusb.h. This function will bear a striking
resemblence to that one, because there's about one way to code it.
Note that the data parameter is Unicode in UTF-16LE encoding.
@ -325,8 +389,9 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
char buf[512];
int len;
wchar_t *str = NULL;
wchar_t wbuf[256];
#ifndef __ANDROID__ /* we don't use iconv on Android */
wchar_t wbuf[256];
/* iconv variables */
iconv_t ic;
size_t inbytes;
@ -338,6 +403,7 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
char *inptr;
#endif
char *outptr;
#endif
/* Determine which language to use. */
uint16_t lang;
@ -354,6 +420,25 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
if (len < 0)
return NULL;
#ifdef __ANDROID__
/* Bionic does not have iconv support nor wcsdup() function, so it
has to be done manually. The following code will only work for
code points that can be represented as a single UTF-16 character,
and will incorrectly convert any code points which require more
than one UTF-16 character.
Skip over the first character (2-bytes). */
len -= 2;
str = malloc((len / 2 + 1) * sizeof(wchar_t));
int i;
for (i = 0; i < len / 2; i++) {
str[i] = buf[i * 2 + 2] | (buf[i * 2 + 3] << 8);
}
str[len / 2] = 0x00000000;
#else
/* buf does not need to be explicitly NULL-terminated because
it is only passed into iconv() which does not need it. */
@ -387,6 +472,8 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
err:
iconv_close(ic);
#endif
return str;
}
@ -618,7 +705,8 @@ hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, const
if (cur_dev->vendor_id == vendor_id &&
cur_dev->product_id == product_id) {
if (serial_number) {
if (wcscmp(serial_number, cur_dev->serial_number) == 0) {
if (cur_dev->serial_number &&
wcscmp(serial_number, cur_dev->serial_number) == 0) {
path_to_open = cur_dev->path;
break;
}
@ -683,10 +771,12 @@ static void read_callback(struct libusb_transfer *transfer)
}
else if (transfer->status == LIBUSB_TRANSFER_CANCELLED) {
dev->shutdown_thread = 1;
dev->cancelled = 1;
return;
}
else if (transfer->status == LIBUSB_TRANSFER_NO_DEVICE) {
dev->shutdown_thread = 1;
dev->cancelled = 1;
return;
}
else if (transfer->status == LIBUSB_TRANSFER_TIMED_OUT) {
@ -701,6 +791,7 @@ static void read_callback(struct libusb_transfer *transfer)
if (res != 0) {
LOG("Unable to submit URB. libusb error code: %d\n", res);
dev->shutdown_thread = 1;
dev->cancelled = 1;
}
}
@ -750,10 +841,10 @@ static void *read_thread(void *param)
/* Cancel any transfer that may be pending. This call will fail
if no transfers are pending, but that's OK. */
if (libusb_cancel_transfer(dev->transfer) == 0) {
/* The transfer was cancelled, so wait for its completion. */
libusb_handle_events(usb_context);
}
libusb_cancel_transfer(dev->transfer);
while (!dev->cancelled)
libusb_handle_events_completed(usb_context, &dev->cancelled);
/* Now that the read thread is stopping, Wake any threads which are
waiting on data (in hid_read_timeout()). Do this under a mutex to
@ -786,11 +877,11 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path)
int d = 0;
int good_open = 0;
dev = new_hid_device();
if(hid_init() < 0)
return NULL;
dev = new_hid_device();
libusb_get_device_list(usb_context, &devs);
while ((usb_dev = devs[d++]) != NULL) {
struct libusb_device_descriptor desc;
@ -1205,9 +1296,9 @@ int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index
}
HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev __attribute__ ((unused)))
HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev)
{
return NULL;
return NULL;
}

View File

@ -12,7 +12,7 @@
At the discretion of the user of this library,
this software may be licensed under the terms of the
GNU Public License v3, a BSD-Style license, or the
GNU General Public License v3, a BSD-Style license, or the
original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution.
@ -80,6 +80,27 @@ struct hid_device_ {
static __u32 kernel_version = 0;
static __u32 detect_kernel_version(void)
{
struct utsname name;
int major, minor, release;
int ret;
uname(&name);
ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
if (ret == 3) {
return KERNEL_VERSION(major, minor, release);
}
ret = sscanf(name.release, "%d.%d", &major, &minor);
if (ret == 2) {
return KERNEL_VERSION(major, minor, 0);
}
printf("Couldn't determine kernel version from version string \"%s\"\n", name.release);
return 0;
}
static hid_device *new_hid_device(void)
{
hid_device *dev = calloc(1, sizeof(hid_device));
@ -345,6 +366,8 @@ int HID_API_EXPORT hid_init(void)
if (!locale)
setlocale(LC_CTYPE, "");
kernel_version = detect_kernel_version();
return 0;
}
@ -600,21 +623,6 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path)
dev = new_hid_device();
if (kernel_version == 0) {
struct utsname name;
int major, minor, release;
int ret;
uname(&name);
ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
if (ret == 3) {
kernel_version = major << 16 | minor << 8 | release;
//printf("Kernel Version: %d\n", kernel_version);
}
else {
printf("Couldn't sscanf() version string %s\n", name.release);
}
}
/* OPEN HERE */
dev->device_handle = open(path, O_RDWR);
@ -700,6 +708,7 @@ int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t
bytes_read = 0;
if (bytes_read >= 0 &&
kernel_version != 0 &&
kernel_version < KERNEL_VERSION(2,6,34) &&
dev->uses_numbered_reports) {
/* Work around a kernel bug. Chop off the first byte. */

View File

@ -11,7 +11,7 @@
At the discretion of the user of this library,
this software may be licensed under the terms of the
GNU Public License v3, a BSD-Style license, or the
GNU General Public License v3, a BSD-Style license, or the
original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution.
@ -24,7 +24,6 @@
#include <IOKit/hid/IOHIDManager.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <IOKit/IOKitLib.h>
#include <CoreFoundation/CoreFoundation.h>
#include <wchar.h>
#include <locale.h>
@ -265,6 +264,46 @@ static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t
}
static int get_string_property_utf8(IOHIDDeviceRef device, CFStringRef prop, char *buf, size_t len)
{
CFStringRef str;
if (!len)
return 0;
str = IOHIDDeviceGetProperty(device, prop);
buf[0] = 0;
if (str) {
len--;
CFIndex str_len = CFStringGetLength(str);
CFRange range;
range.location = 0;
range.length = str_len;
CFIndex used_buf_len;
CFIndex chars_copied;
chars_copied = CFStringGetBytes(str,
range,
kCFStringEncodingUTF8,
(char)'?',
FALSE,
(UInt8*)buf,
len,
&used_buf_len);
if (used_buf_len == len)
buf[len] = 0; /* len is decremented above */
else
buf[used_buf_len] = 0;
return used_buf_len;
}
else
return 0;
}
static int get_serial_number(IOHIDDeviceRef device, wchar_t *buf, size_t len)
{
return get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, len);
@ -291,54 +330,33 @@ static wchar_t *dup_wcs(const wchar_t *s)
return ret;
}
#if MAC_OS_X_VERSION_MIN_REQUIRED != MAC_OS_X_VERSION_10_5
#warning "hidapi must be compiled/linked with -mmacosx-version-min=10.5 if you want OS X 10.5 compatibility"
#endif
/* hidapi_IOHIDDeviceGetService()
*
* Return the io_service_t corresponding to a given IOHIDDeviceRef, either by:
* - on OS X 10.6 and above, calling IOHIDDeviceGetService()
* - on OS X 10.5, extract it from the IOHIDDevice struct
*/
static io_service_t hidapi_IOHIDDeviceGetService(IOHIDDeviceRef device)
static int make_path(IOHIDDeviceRef device, char *buf, size_t len)
{
/* When compiled with '-mmacosx-version-min=10.5', IOHIDDeviceGetService()
* is weakly linked in so we can decide to use it (or not) at runtime.
*/
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
if (IOHIDDeviceGetService != NULL) {
/* OS X 10.6 and above: IOHIDDeviceGetService() exists */
return IOHIDDeviceGetService(device);
}
else
#endif
{
/* OS X 10.5: IOHIDDeviceGetService() doesn't exist.
* Be naughty and pull the service out of the IOHIDDevice.
* Tested and working on OS X 10.5.8 i386, x86_64, and ppc
*/
struct IOHIDDevice_internal {
/* The first field of the IOHIDDevice struct is a
* CFRuntimeBase (which is a private CF struct).
*
* a, b, and c are the 3 fields that make up a CFRuntimeBase.
* See http://opensource.apple.com/source/CF/CF-476.18/CFRuntime.h
*
* The second field of the IOHIDDevice is the io_service_t we're looking for.
*/
//CFRuntimeBase base;
uintptr_t a;
uint8_t b[4];
#if __LP64__
uint32_t c;
#endif
io_service_t service;
};
struct IOHIDDevice_internal *tmp = (struct IOHIDDevice_internal *)device;
int res;
unsigned short vid, pid;
char transport[32];
int32_t location;
return tmp->service;
}
buf[0] = '\0';
res = get_string_property_utf8(
device, CFSTR(kIOHIDTransportKey),
transport, sizeof(transport));
if (!res)
return -1;
location = get_location_id(device);
vid = get_vendor_id(device);
pid = get_product_id(device);
res = snprintf(buf, len, "%s_%04hx_%04hx_%x",
transport, vid, pid, location);
buf[len-1] = '\0';
return res+1;
}
/* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */
@ -402,6 +420,7 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id,
process_pending_events();
/* Get a list of the Devices */
IOHIDManagerSetDeviceMatching(hid_mgr, NULL);
CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr);
/* Convert the list into a C array so we can iterate easily. */
@ -415,6 +434,7 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id,
unsigned short dev_pid;
#define BUF_LEN 256
wchar_t buf[BUF_LEN];
char cbuf[BUF_LEN];
IOHIDDeviceRef dev = device_array[i];
@ -428,9 +448,7 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id,
if ((vendor_id == 0x0 || vendor_id == dev_vid) &&
(product_id == 0x0 || product_id == dev_pid)) {
struct hid_device_info *tmp;
io_object_t iokit_dev;
kern_return_t res;
io_string_t path;
size_t len;
/* VID/PID match. Create the record. */
tmp = malloc(sizeof(struct hid_device_info));
@ -448,14 +466,8 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id,
/* Fill out the record */
cur_dev->next = NULL;
/* Fill in the path (IOService plane) */
iokit_dev = hidapi_IOHIDDeviceGetService(dev);
res = IORegistryEntryGetPath(iokit_dev, kIOServicePlane, path);
if (res == KERN_SUCCESS)
cur_dev->path = strdup(path);
else
cur_dev->path = strdup("");
len = make_path(dev, cbuf, sizeof(cbuf));
cur_dev->path = strdup(cbuf);
/* Serial Number */
get_serial_number(dev, buf, BUF_LEN);
@ -669,77 +681,76 @@ static void *read_thread(void *param)
return NULL;
}
/* hid_open_path()
*
* path must be a valid path to an IOHIDDevice in the IOService plane
* Example: "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EHC1@1D,7/AppleUSBEHCI/PLAYSTATION(R)3 Controller@fd120000/IOUSBInterface@0/IOUSBHIDDriver"
*/
hid_device * HID_API_EXPORT hid_open_path(const char *path)
{
int i;
hid_device *dev = NULL;
io_registry_entry_t entry = MACH_PORT_NULL;
CFIndex num_devices;
dev = new_hid_device();
/* Set up the HID Manager if it hasn't been done */
if (hid_init() < 0)
return NULL;
/* Get the IORegistry entry for the given path */
entry = IORegistryEntryFromPath(kIOMasterPortDefault, path);
if (entry == MACH_PORT_NULL) {
/* Path wasn't valid (maybe device was removed?) */
goto return_error;
}
/* give the IOHIDManager a chance to update itself */
process_pending_events();
/* Create an IOHIDDevice for the entry */
dev->device_handle = IOHIDDeviceCreate(kCFAllocatorDefault, entry);
if (dev->device_handle == NULL) {
/* Error creating the HID device */
goto return_error;
}
CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr);
/* Open the IOHIDDevice */
IOReturn ret = IOHIDDeviceOpen(dev->device_handle, kIOHIDOptionsTypeSeizeDevice);
if (ret == kIOReturnSuccess) {
char str[32];
num_devices = CFSetGetCount(device_set);
IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef));
CFSetGetValues(device_set, (const void **) device_array);
for (i = 0; i < num_devices; i++) {
char cbuf[BUF_LEN];
size_t len;
IOHIDDeviceRef os_dev = device_array[i];
/* Create the buffers for receiving data */
dev->max_input_report_len = (CFIndex) get_max_report_length(dev->device_handle);
dev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t));
len = make_path(os_dev, cbuf, sizeof(cbuf));
if (!strcmp(cbuf, path)) {
/* Matched Paths. Open this Device. */
IOReturn ret = IOHIDDeviceOpen(os_dev, kIOHIDOptionsTypeSeizeDevice);
if (ret == kIOReturnSuccess) {
char str[32];
/* Create the Run Loop Mode for this device.
printing the reference seems to work. */
sprintf(str, "HIDAPI_%p", dev->device_handle);
dev->run_loop_mode =
CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII);
/* Attach the device to a Run Loop */
IOHIDDeviceRegisterInputReportCallback(
dev->device_handle, dev->input_report_buf, dev->max_input_report_len,
&hid_report_callback, dev);
IOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev);
free(device_array);
CFRetain(os_dev);
CFRelease(device_set);
dev->device_handle = os_dev;
/* Start the read thread */
pthread_create(&dev->thread, NULL, read_thread, dev);
/* Create the buffers for receiving data */
dev->max_input_report_len = (CFIndex) get_max_report_length(os_dev);
dev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t));
/* Wait here for the read thread to be initialized. */
pthread_barrier_wait(&dev->barrier);
IOObjectRelease(entry);
return dev;
}
else {
goto return_error;
/* Create the Run Loop Mode for this device.
printing the reference seems to work. */
sprintf(str, "HIDAPI_%p", os_dev);
dev->run_loop_mode =
CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII);
/* Attach the device to a Run Loop */
IOHIDDeviceRegisterInputReportCallback(
os_dev, dev->input_report_buf, dev->max_input_report_len,
&hid_report_callback, dev);
IOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev);
/* Start the read thread */
pthread_create(&dev->thread, NULL, read_thread, dev);
/* Wait here for the read thread to be initialized. */
pthread_barrier_wait(&dev->barrier);
return dev;
}
else {
goto return_error;
}
}
}
return_error:
if (dev->device_handle != NULL)
CFRelease(dev->device_handle);
if (entry != MACH_PORT_NULL)
IOObjectRelease(entry);
free(device_array);
CFRelease(device_set);
free_hid_device(dev);
return NULL;
}

View File

@ -168,7 +168,7 @@ void ConnectionDiagram::setupGraphicsScene()
case VehicleConfigurationSource::CONTROLLER_CC3D:
prefix = "cc-";
if (m_configSource->getEscType() == VehicleConfigurationSource::ESC_ONESHOT ||
m_configSource->getEscType() == VehicleConfigurationSource::ESC_RAPID) {
m_configSource->getEscType() == VehicleConfigurationSource::ESC_SYNCHED) {
suffix = "-oneshot";
}
break;

View File

@ -47,7 +47,11 @@ bool EscPage::validatePage()
if (ui->oneshotESCButton->isChecked()) {
getWizard()->setEscType(SetupWizard::ESC_ONESHOT);
} else if (ui->rapidESCButton->isChecked()) {
getWizard()->setEscType(SetupWizard::ESC_RAPID);
if (isSynchOrOneShotAvailable()) {
getWizard()->setEscType(SetupWizard::ESC_SYNCHED);
} else {
getWizard()->setEscType(SetupWizard::ESC_RAPID);
}
} else if (ui->defaultESCButton->isChecked()) {
getWizard()->setEscType(SetupWizard::ESC_STANDARD);
}
@ -58,7 +62,18 @@ bool EscPage::validatePage()
void EscPage::initializePage()
{
bool enabled = true;
bool enabled = isSynchOrOneShotAvailable();
ui->oneshotESCButton->setEnabled(enabled);
if (ui->oneshotESCButton->isChecked() && !enabled) {
ui->oneshotESCButton->setChecked(false);
ui->rapidESCButton->setChecked(true);
}
}
bool EscPage::isSynchOrOneShotAvailable()
{
bool available = true;
switch (getWizard()->getControllerType()) {
case SetupWizard::CONTROLLER_CC:
@ -70,10 +85,10 @@ void EscPage::initializePage()
case SetupWizard::MULTI_ROTOR_QUAD_X:
case SetupWizard::MULTI_ROTOR_QUAD_H:
case SetupWizard::MULTI_ROTOR_QUAD_PLUS:
enabled = getWizard()->getInputType() != SetupWizard::INPUT_PWM;
available = getWizard()->getInputType() != SetupWizard::INPUT_PWM;
break;
default:
enabled = false;
available = false;
break;
}
break;
@ -82,9 +97,5 @@ void EscPage::initializePage()
break;
default: break;
}
ui->oneshotESCButton->setEnabled(enabled);
if (ui->oneshotESCButton->isChecked() && !enabled) {
ui->oneshotESCButton->setChecked(false);
ui->rapidESCButton->setChecked(true);
}
return available;
}

View File

@ -45,6 +45,7 @@ public:
private:
Ui::EscPage *ui;
bool isSynchOrOneShotAvailable();
};
#endif // ESCPAGE_H

View File

@ -385,6 +385,9 @@ QString SetupWizard::getSummaryText()
case ESC_RAPID:
summary.append(tr("Rapid ESC (%1 Hz)").arg(VehicleConfigurationHelper::RAPID_ESC_FREQUENCY));
break;
case ESC_SYNCHED:
summary.append(tr("Synched ESC"));
break;
case ESC_ONESHOT:
summary.append(tr("Oneshot ESC"));
break;

View File

@ -151,7 +151,7 @@ void VehicleConfigurationHelper::applyHardwareConfiguration()
break;
case VehicleConfigurationSource::INPUT_PPM:
if (m_configSource->getEscType() == VehicleConfigurationSource::ESC_ONESHOT ||
m_configSource->getEscType() == VehicleConfigurationSource::ESC_RAPID) {
m_configSource->getEscType() == VehicleConfigurationSource::ESC_SYNCHED) {
data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PPM_PIN8ONESHOT;
} else {
data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PPMNOONESHOT;
@ -377,15 +377,12 @@ void VehicleConfigurationHelper::applyActuatorConfiguration()
bankMode = ActuatorSettings::BANKMODE_PWM;
break;
case VehicleConfigurationSource::ESC_RAPID:
if ((m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_CC ||
m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_CC3D) &&
m_configSource->getInputType() == VehicleConfigurationSource::INPUT_PWM) {
bankMode = ActuatorSettings::BANKMODE_PWM;
escFrequence = RAPID_ESC_FREQUENCY;
} else {
bankMode = ActuatorSettings::BANKMODE_PWMSYNC;
escFrequence = PWMSYNC_ESC_FREQUENCY;
}
bankMode = ActuatorSettings::BANKMODE_PWM;
escFrequence = RAPID_ESC_FREQUENCY;
break;
case VehicleConfigurationSource::ESC_SYNCHED:
bankMode = ActuatorSettings::BANKMODE_PWMSYNC;
escFrequence = PWMSYNC_ESC_FREQUENCY;
break;
case VehicleConfigurationSource::ESC_ONESHOT:
bankMode = ActuatorSettings::BANKMODE_ONESHOT125;

View File

@ -64,7 +64,7 @@ public:
MULTI_ROTOR_OCTO_X, MULTI_ROTOR_OCTO_V, MULTI_ROTOR_OCTO_COAX_X, MULTI_ROTOR_OCTO_COAX_PLUS,
FIXED_WING_DUAL_AILERON, FIXED_WING_AILERON, FIXED_WING_ELEVON, FIXED_WING_VTAIL, HELI_CCPM,
GROUNDVEHICLE_MOTORCYCLE, GROUNDVEHICLE_CAR, GROUNDVEHICLE_DIFFERENTIAL };
enum ESC_TYPE { ESC_ONESHOT, ESC_RAPID, ESC_STANDARD, ESC_UNKNOWN };
enum ESC_TYPE { ESC_ONESHOT, ESC_SYNCHED, ESC_RAPID, ESC_STANDARD, ESC_UNKNOWN };
enum SERVO_TYPE { SERVO_ANALOG, SERVO_DIGITAL, SERVO_UNKNOWN };
enum INPUT_TYPE { INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSM, INPUT_UNKNOWN };
enum AIRSPEED_TYPE { AIRSPEED_ESTIMATE, AIRSPEED_EAGLETREE, AIRSPEED_MS4525, AIRSPEED_DISABLED };

View File

@ -49,7 +49,26 @@
<field name="FlightModeAssistMap" units="" type="enum"
options="None,GPSAssist"
elements="6"
defaultvalue="None,None,None,None,None,None"/>
defaultvalue="None,None,None,None,None,None"
limits="\
%0401NE:GPSAssist,\
%0402NE:GPSAssist;\
\
%0401NE:GPSAssist,\
%0402NE:GPSAssist;\
\
%0401NE:GPSAssist,\
%0402NE:GPSAssist;\
\
%0401NE:GPSAssist,\
%0402NE:GPSAssist;\
\
%0401NE:GPSAssist,\
%0402NE:GPSAssist;\
\
%0401NE:GPSAssist,\
%0402NE:GPSAssist;"
/>
<access gcs="readwrite" flight="readwrite"/>
<telemetrygcs acked="true" updatemode="onchange" period="0"/>