1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-03-14 06:29:18 +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 --- --- 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. 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 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> <message>
<location/> <location/>
<source>Module Control</source> <source>Module Control</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -4758,7 +4758,7 @@ Useful if you have accidentally changed some settings.</source>
<message> <message>
<location/> <location/>
<source>Reload Board Data</source> <source>Reload Board Data</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -4773,7 +4773,7 @@ Useful if you have accidentally changed some settings.</source>
<message> <message>
<location/> <location/>
<source>Send settings to the board but do not save to the non-volatile memory</source> <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>
<message> <message>
<location/> <location/>
@ -4788,7 +4788,7 @@ Useful if you have accidentally changed some settings.</source>
<message> <message>
<location/> <location/>
<source>Send settings to the board and save to the non-volatile memory</source> <source>Send settings to the board and save to the non-volatile memory</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -4822,7 +4822,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<location/> <location/>
<source>After enabling the module, you must power cycle before using and configuring.</source> <source>After enabling the module, you must power cycle before using and configuring.</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
</context> </context>
<context> <context>
@ -4830,32 +4830,32 @@ p, li { white-space: pre-wrap; }
<message> <message>
<location filename="../../../src/plugins/config/camerastabilization.ui"/> <location filename="../../../src/plugins/config/camerastabilization.ui"/>
<source>Form</source> <source>Form</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Camera Stabilization</source> <source>Camera Stabilization</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Module Control</source> <source>Module Control</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Enable CameraStabilization module</source> <source>Enable CameraStabilization module</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>After enabling the module, you must power cycle before using and configuring.</source> <source>After enabling the module, you must power cycle before using and configuring.</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Basic Settings (Stabilization)</source> <source>Basic Settings (Stabilization)</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -4863,37 +4863,39 @@ p, li { white-space: pre-wrap; }
This value should be tuned for particular gimbal and servo. You also This value should be tuned for particular gimbal and servo. You also
have to define channel output range using Output configuration tab.</source> have to define channel output range using Output configuration tab.</source>
<translation type="unfinished"></translation> <translation>
Output</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>objname:CameraStabSettings</source> <source>objname:CameraStabSettings</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:OutputRange</source> <source>fieldname:OutputRange</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>element:Yaw</source> <source>element:Yaw</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>haslimits:no</source> <source>haslimits:no</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>scale:1</source> <source>scale:1</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>buttongroup:1</source> <source>buttongroup:1</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <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 This value should be tuned for particular gimbal and servo. You also
have to define channel output range using Output configuration tab.</source> have to define channel output range using Output configuration tab.</source>
<translation type="unfinished"></translation> <translation>
Output</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>element:Pitch</source> <source>element:Pitch</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <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 This value should be tuned for particular gimbal and servo. You also
have to define channel output range using Output configuration tab.</source> have to define channel output range using Output configuration tab.</source>
<translation type="unfinished"></translation> <translation>
Output</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>element:Roll</source> <source>element:Roll</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Yaw output channel for camera gimbal</source> <source>Yaw output channel for camera gimbal</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>None</source> <source>None</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Pitch output channel for camera gimbal</source> <source>Pitch output channel for camera gimbal</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Roll output channel for camera gimbal</source> <source>Roll output channel for camera gimbal</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Output Channel</source> <source>Output Channel</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Yaw</source> <source>Yaw</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Pitch</source> <source>Pitch</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Roll</source> <source>Roll</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Advanced Settings (Control)</source> <source>Advanced Settings (Control)</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Input channel to control camera yaw <source>Input channel to control camera yaw
Don&apos;t forget to map this channel using Input configuration tab.</source> Don&apos;t forget to map this channel using Input configuration tab.</source>
<translation type="unfinished"></translation> <translation>
Input</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:Input</source> <source>fieldname:Input</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Input channel to control camera pitch <source>Input channel to control camera pitch
Don&apos;t forget to map this channel using Input configuration tab.</source> Don&apos;t forget to map this channel using Input configuration tab.</source>
<translation type="unfinished"></translation> <translation>
Input</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Input channel to control camera roll <source>Input channel to control camera roll
Don&apos;t forget to map this channel using Input configuration tab.</source> Don&apos;t forget to map this channel using Input configuration tab.</source>
<translation type="unfinished"></translation> <translation>
Input</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Input Channel</source> <source>Input Channel</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <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. Attitude: camera tracks level for the axis. Input controls the deflection.
AxisLock: camera remembers tracking attitude. Input controls the rate of deflection.</source> AxisLock: camera remembers tracking attitude. Input controls the rate of deflection.</source>
<translation type="unfinished"></translation> <translation>
Attitude
AxisLock</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:StabilizationMode</source> <source>fieldname:StabilizationMode</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Attitude</source> <source>Attitude</source>
<translation type="unfinished">姿</translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Maximum camera yaw deflection for 100% input in Attitude mode, deg.</source> <source>Maximum camera yaw deflection for 100% input in Attitude mode, deg.</source>
<translation type="unfinished"></translation> <translation>Attitude模式下</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:InputRange</source> <source>fieldname:InputRange</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Maximum camera yaw rate for 100% input in AxisLock mode, deg/s.</source> <source>Maximum camera yaw rate for 100% input in AxisLock mode, deg/s.</source>
<translation type="unfinished"></translation> <translation>AxisLock模式下/</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:InputRate</source> <source>fieldname:InputRate</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:ResponseTime</source> <source>fieldname:ResponseTime</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Maximum camera pitch deflection for 100% input in Attitude mode, deg.</source> <source>Maximum camera pitch deflection for 100% input in Attitude mode, deg.</source>
<translation type="unfinished"></translation> <translation>Attitude模式下</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Maximum camera pitch rate for 100% input in AxisLock mode, deg/s.</source> <source>Maximum camera pitch rate for 100% input in AxisLock mode, deg/s.</source>
<translation type="unfinished"></translation> <translation>AxisLock模式下/</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Maximum camera roll deflection for 100% input in Attitude mode, deg.</source> <source>Maximum camera roll deflection for 100% input in Attitude mode, deg.</source>
<translation type="unfinished"></translation> <translation>Attitude模式下</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Maximum camera roll rate for 100% input in AxisLock mode, deg/s.</source> <source>Maximum camera roll rate for 100% input in AxisLock mode, deg/s.</source>
<translation type="unfinished"></translation> <translation>AxisLock模式下/</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>MaxAxisLockRate</source> <source>MaxAxisLockRate</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Stabilization Mode</source> <source>Stabilization Mode</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>(the same value for Roll, Pitch, Yaw)</source> <source>(the same value for Roll, Pitch, Yaw)</source>
<translation type="unfinished"></translation> <translation>XYZ三个转动轴向</translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5085,32 +5100,34 @@ rate depending on input value.
If you have drift in your Tx controls, you may want to increase this If you have drift in your Tx controls, you may want to increase this
value.</source> value.</source>
<translation type="unfinished"></translation> <translation>AxisLock模式下XYZ三个轴向的转动速率死区 /
姿</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:MaxAxisLockRate</source> <source>fieldname:MaxAxisLockRate</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Messages</source> <source>Messages</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Ctrl+S</source> <source>Ctrl+S</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>button:help</source> <source>button:help</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>url:http://wiki.openpilot.org/display/Doc/Camera+Stabilization+Configuration</source> <source>url:http://wiki.openpilot.org/display/Doc/Camera+Stabilization+Configuration</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5118,17 +5135,19 @@ value.</source>
Loaded settings are not applied automatically. You have to click the Loaded settings are not applied automatically. You have to click the
Apply or Save button afterwards.</source> Apply or Save button afterwards.</source>
<translation type="unfinished"></translation> <translation>
</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Reset To Defaults</source> <source>Reset To Defaults</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>button:default</source> <source>button:default</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5138,82 +5157,85 @@ settings.
Loaded settings are not applied automatically. You have to click the Loaded settings are not applied automatically. You have to click the
Apply or Save button afterwards.</source> Apply or Save button afterwards.</source>
<translation type="unfinished"></translation> <translation>
使
</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Reload Board Data</source> <source>Reload Board Data</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>button:reload</source> <source>button:reload</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Send settings to the board but do not save to the non-volatile memory</source> <source>Send settings to the board but do not save to the non-volatile memory</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Apply</source> <source>Apply</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>button:apply</source> <source>button:apply</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Send settings to the board and save to the non-volatile memory</source> <source>Send settings to the board and save to the non-volatile memory</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Save</source> <source>Save</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>button:save</source> <source>button:save</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Output Range (Angle)</source> <source>Output Range (Angle)</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Pitch Or Servo2</source> <source>Pitch Or Servo2</source>
<translation type="unfinished"></translation> <translation>/2</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Roll Or Servo1</source> <source>Roll Or Servo1</source>
<translation type="unfinished"></translation> <translation>/1</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Input Rate (Speed)</source> <source>Input Rate (Speed)</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Input Range (Angle)</source> <source>Input Range (Angle)</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Expert Settings (Attitude Filter and Feed Forward)</source> <source>Expert Settings (Attitude Filter and Feed Forward)</source>
<translation type="unfinished"></translation> <translation>姿</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Attitude Filter RT</source> <source>Attitude Filter RT</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5222,7 +5244,11 @@ Apply or Save button afterwards.</source>
Range: 0-250ms, 0 disables the filter (default). Range: 0-250ms, 0 disables the filter (default).
Smoothes estimated airframe attitude used by camera stabilization.</source> Smoothes estimated airframe attitude used by camera stabilization.</source>
<translation type="unfinished"></translation> <translation>
02500
使</translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5231,7 +5257,11 @@ Smoothes estimated airframe attitude used by camera stabilization.</source>
Range: 0-250ms, 0 disables the filter (default). Range: 0-250ms, 0 disables the filter (default).
Smoothes estimated airframe attitude used by camera stabilization.</source> Smoothes estimated airframe attitude used by camera stabilization.</source>
<translation type="unfinished"></translation> <translation>
02500
使</translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5240,12 +5270,16 @@ Smoothes estimated airframe attitude used by camera stabilization.</source>
Range: 0-250ms, 0 disables the filter (default). Range: 0-250ms, 0 disables the filter (default).
Smoothes estimated airframe attitude used by camera stabilization.</source> Smoothes estimated airframe attitude used by camera stabilization.</source>
<translation type="unfinished"></translation> <translation>
02500
使</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>FF Servo Acceleration</source> <source>FF Servo Acceleration</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5255,12 +5289,17 @@ Range: 0-25, 0 disables feed forward for the axis (default).
Good starting value is 2-7. Good starting value is 2-7.
Too high value may burn your servo!</source> Too high value may burn your servo!</source>
<translation type="unfinished"></translation> <translation>
0250
27
</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:FeedForward</source> <source>fieldname:FeedForward</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5270,7 +5309,12 @@ Range: 0-25, 0 disables feed forward for the axis (default).
Good starting value is 2-7. Good starting value is 2-7.
Too high value may burn your servo!</source> Too high value may burn your servo!</source>
<translation type="unfinished"></translation> <translation>
0250
27
</translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5280,74 +5324,91 @@ Range: 0-25, 0 disables feed forward for the axis (default).
Good starting value is 2-7. Good starting value is 2-7.
Too high value may burn your servo!</source> Too high value may burn your servo!</source>
<translation type="unfinished"></translation> <translation>
0250
27
</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>FF Accel Time Constant</source> <source>FF Accel Time Constant</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Roll servo feed forward acceleration time constant <source>Roll servo feed forward acceleration time constant
Range: 0-50ms, default is 5.</source> Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation> <translation>
0505</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:AccelTime</source> <source>fieldname:AccelTime</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Pitch servo feed forward acceleration time constant <source>Pitch servo feed forward acceleration time constant
Range: 0-50ms, default is 5.</source> Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation> <translation>
0505</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Yaw servo feed forward acceleration time constant <source>Yaw servo feed forward acceleration time constant
Range: 0-50ms, default is 5.</source> Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation> <translation>
0505</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>FF Decel Time Constant</source> <source>FF Decel Time Constant</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Roll servo feed forward deceleration time constant <source>Roll servo feed forward deceleration time constant
Range: 0-50ms, default is 5.</source> Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation> <translation>
0505</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:DecelTime</source> <source>fieldname:DecelTime</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Pitch servo feed forward deceleration time constant <source>Pitch servo feed forward deceleration time constant
Range: 0-50ms, default is 5.</source> Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation> <translation>
0505</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Yaw servo feed forward deceleration time constant <source>Yaw servo feed forward deceleration time constant
Range: 0-50ms, default is 5.</source> Range: 0-50ms, default is 5.</source>
<translation type="unfinished"></translation> <translation>
0505</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Gimbal Type:</source> <source>Gimbal Type:</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5355,22 +5416,23 @@ Range: 0-50ms, default is 5.</source>
Used to limit feed forward acceleration at extreme angles. Used to limit feed forward acceleration at extreme angles.
Generic type provides no limit.</source> Generic type provides no limit.</source>
<translation type="unfinished"></translation> <translation>
Generic类型表示不做限制</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:GimbalType</source> <source>fieldname:GimbalType</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Yaw-Roll-Pitch</source> <source>Yaw-Roll-Pitch</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>FF Max Acceleration</source> <source>FF Max Acceleration</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5379,17 +5441,21 @@ Generic type provides no limit.</source>
Range: 0-1000, default is 500. Range: 0-1000, default is 500.
The same value is used for all axes.</source> The same value is used for all axes.</source>
<translation type="unfinished"></translation> <translation>
01000500.
XYZ三个转动轴向</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>fieldname:MaxAccel</source> <source>fieldname:MaxAccel</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Input configuration also provides smoothing for controls. Look for RT options on the RC Input tab.</source> <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> </message>
</context> </context>
<context> <context>
@ -5412,7 +5478,7 @@ The same value is used for all axes.</source>
<message> <message>
<location/> <location/>
<source>Changes on this page only take effect after board reset or power cycle</source> <source>Changes on this page only take effect after board reset or power cycle</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5561,7 +5627,7 @@ arming it in that case!</source>
<message> <message>
<location/> <location/>
<source>Zero gyros while arming aircraft</source> <source>Zero gyros while arming aircraft</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -5976,19 +6042,16 @@ p, li { white-space: pre-wrap; }
<translation> 0-100</translation> <translation> 0-100</translation>
</message> </message>
<message> <message>
<location/>
<source>Back</source> <source>Back</source>
<translation></translation> <translation type="vanished"></translation>
</message> </message>
<message> <message>
<location/>
<source>Next</source> <source>Next</source>
<translation></translation> <translation type="vanished"></translation>
</message> </message>
<message> <message>
<location/>
<source>Cancel</source> <source>Cancel</source>
<translation></translation> <translation type="vanished"></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -6207,7 +6270,7 @@ Applies and Saves all settings to SD</source>
<message> <message>
<location/> <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> <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>
<message> <message>
<location/> <location/>
@ -6309,6 +6372,11 @@ Applies and Saves all settings to SD</source>
<source>fieldname:FlightModeAssistMap</source> <source>fieldname:FlightModeAssistMap</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<location/>
<source>haslimits:yes</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>MixerCurve</name> <name>MixerCurve</name>
@ -6441,39 +6509,32 @@ Applies and Saves all settings to SD</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location/>
<source>50</source> <source>50</source>
<translation>50</translation> <translation type="vanished">50</translation>
</message> </message>
<message> <message>
<location/>
<source>60</source> <source>60</source>
<translation>60</translation> <translation type="vanished">60</translation>
</message> </message>
<message> <message>
<location/>
<source>125</source> <source>125</source>
<translation>125</translation> <translation type="vanished">125</translation>
</message> </message>
<message> <message>
<location/>
<source>165</source> <source>165</source>
<translation>165</translation> <translation type="vanished">165</translation>
</message> </message>
<message> <message>
<location/>
<source>270</source> <source>270</source>
<translation>270</translation> <translation type="vanished">270</translation>
</message> </message>
<message> <message>
<location/>
<source>330</source> <source>330</source>
<translation>330</translation> <translation type="vanished">330</translation>
</message> </message>
<message> <message>
<location/>
<source>400</source> <source>400</source>
<translation>400</translation> <translation type="vanished">400</translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -6539,9 +6600,8 @@ Applies and Saves all settings to SD</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location/>
<source>490</source> <source>490</source>
<translation>490</translation> <translation type="vanished">490</translation>
</message> </message>
<message> <message>
<source>Output configuration</source> <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> 使OneShot125模式时/ 8 1000/8 = 125, 2000/8 = 250).</translation>
</message> </message>
<message> <message>
<location/>
<source>GroupBox</source> <source>GroupBox</source>
<translation></translation> <translation type="vanished"></translation>
</message> </message>
<message> <message>
<location/> <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> <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>
<message> <message>
<location/> <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> <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> <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>
<message>
<location/>
<source>Output Configuration</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>outputChannelForm</name> <name>outputChannelForm</name>
@ -7403,7 +7467,7 @@ Useful if you have accidentally changed some settings.</source>
<message> <message>
<location/> <location/>
<source>Reload Board Data</source> <source>Reload Board Data</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -7413,7 +7477,7 @@ Useful if you have accidentally changed some settings.</source>
<message> <message>
<location/> <location/>
<source>Send settings to the board but do not save to the non-volatile memory</source> <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>
<message> <message>
<location/> <location/>
@ -7428,7 +7492,7 @@ Useful if you have accidentally changed some settings.</source>
<message> <message>
<location/> <location/>
<source>Send settings to the board and save to the non-volatile memory</source> <source>Send settings to the board and save to the non-volatile memory</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -8135,7 +8199,7 @@ response (deg)</source>
<message> <message>
<location/> <location/>
<source>Module Control</source> <source>Module Control</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -8157,7 +8221,7 @@ Up to 3 separate PID options (or option pairs) can be selected and updated.</sou
<message> <message>
<location/> <location/>
<source>After enabling the module, you must power cycle before using and configuring.</source> <source>After enabling the module, you must power cycle before using and configuring.</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -8272,7 +8336,7 @@ only when system is armed without disabling the module.</source>
<message> <message>
<location/> <location/>
<source>Messages</source> <source>Messages</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -8287,7 +8351,7 @@ only when system is armed without disabling the module.</source>
<message> <message>
<location/> <location/>
<source>Send settings to the board but do not save to the non-volatile memory</source> <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>
<message> <message>
<location/> <location/>
@ -8297,7 +8361,7 @@ only when system is armed without disabling the module.</source>
<message> <message>
<location/> <location/>
<source>Send settings to the board and save to the non-volatile memory</source> <source>Send settings to the board and save to the non-volatile memory</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -8793,7 +8857,7 @@ only when system is armed without disabling the module.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+213"/> <location line="+230"/>
<source>Save File</source> <source>Save File</source>
<translation></translation> <translation></translation>
</message> </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;/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 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;/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;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> &lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
@ -9050,8 +9114,8 @@ p, li { white-space: pre-wrap; }
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;/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 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> &lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<message> <message>
@ -9070,88 +9134,87 @@ p, li { white-space: pre-wrap; }
<message> <message>
<location filename="../../../src/plugins/setupwizard/pages/multipage.cpp" line="+58"/> <location filename="../../../src/plugins/setupwizard/pages/multipage.cpp" line="+58"/>
<source>Tricopter</source> <source>Tricopter</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+1"/> <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> <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>广YawFPV)</translation>
<translation></translation>
</message> </message>
<message> <message>
<location line="+6"/> <location line="+6"/>
<source>Quadcopter X</source> <source>Quadcopter X</source>
<translation>X型四</translation> <translation>X型四旋翼</translation>
</message> </message>
<message> <message>
<location line="+1"/> <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> <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>
<message> <message>
<location line="+6"/> <location line="+6"/>
<source>Quadcopter +</source> <source>Quadcopter +</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+1"/> <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> <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>
<message> <message>
<location line="+7"/> <location line="+7"/>
<source>Hexacopter</source> <source>Hexacopter</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+1"/> <location line="+1"/>
<source>A multirotor with six motors, one motor in front.</source> <source>A multirotor with six motors, one motor in front.</source>
<translation>1</translation> <translation>1</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+5"/>
<source>A multirotor with six motors, two motors in front.</source> <source>A multirotor with six motors, two motors in front.</source>
<translation>16</translation> <translation>16</translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+5"/>
<source>A multirotor with six motors in two rows.</source> <source>A multirotor with six motors in two rows.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+4"/> <location line="+4"/>
<source>Hexacopter Coax (Y6)</source> <source>Hexacopter Coax (Y6)</source>
<translation> Y6</translation> <translation> Y6</translation>
</message> </message>
<message> <message>
<location line="+1"/> <location line="+1"/>
<source>A multirotor with six motors mounted in a coaxial fashion.</source> <source>A multirotor with six motors mounted in a coaxial fashion.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="-11"/> <location line="-11"/>
<source>Hexacopter X</source> <source>Hexacopter X</source>
<translation>X型六</translation> <translation>X型六旋翼</translation>
</message> </message>
<message> <message>
<location line="-33"/> <location line="-33"/>
<source>OpenPilot Multirotor Configuration</source> <source>OpenPilot Multirotor Configuration</source>
<translation>OpenPilot多飞行器设置</translation> <translation>OpenPilot多旋翼飞行器设置</translation>
</message> </message>
<message> <message>
<location line="+1"/> <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. <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> Please select the type of multirotor you want to create a configuration for below:</source>
<translation>OpenPilot目前支持绝大部分的多飞行器类型 <translation>OpenPilot目前支持绝大部分的多旋翼飞行器类型
ConfigurationVehicle
</translation> </translation>
</message> </message>
<message> <message>
<location line="+37"/> <location line="+37"/>
<source>Hexacopter H</source> <source>Hexacopter H</source>
<translation>H型六</translation> <translation>H型六旋翼</translation>
</message> </message>
</context> </context>
<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 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;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> &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; &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; } 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;/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;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;/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;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> &lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<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 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;&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> &lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
</context> </context>
@ -9456,12 +9519,12 @@ Please select the type of ground vehicle you want to create a configuration for
<message> <message>
<location/> <location/>
<source>Tricopter, Quadcopter, Hexacopter</source> <source>Tricopter, Quadcopter, Hexacopter</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Multirotor</source> <source>Multirotor</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -9477,7 +9540,7 @@ Please select the type of ground vehicle you want to create a configuration for
<location/> <location/>
<source>Airplane, Sloper, Jet</source> <source>Airplane, Sloper, Jet</source>
<translatorcomment></translatorcomment> <translatorcomment></translatorcomment>
<translation> </translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -9509,8 +9572,8 @@ p, li { white-space: pre-wrap; }
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;/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 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;&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;OpenPilot GCS只支持多旋翼飞行器和固定翼飞机&lt;/span&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt; &lt;/body&gt;&lt;/html&gt;
</translation> </translation>
</message> </message>
@ -10087,7 +10150,7 @@ p, li { white-space: pre-wrap; }
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+419"/> <location line="+420"/>
<location line="+24"/> <location line="+24"/>
<location line="+31"/> <location line="+31"/>
<location line="+31"/> <location line="+31"/>
@ -10177,7 +10240,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<location filename="../../../src/plugins/config/configgadgetwidget.cpp" line="+218"/> <location filename="../../../src/plugins/config/configgadgetwidget.cpp" line="+218"/>
<source>Unsaved changes</source> <source>Unsaved changes</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+0"/> <location line="+0"/>
@ -10189,27 +10252,27 @@ Do you still want to proceed?</source>
<context> <context>
<name>ConfigInputWidget</name> <name>ConfigInputWidget</name>
<message> <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> <source>http://wiki.openpilot.org/x/04Cf</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+7"/> <location line="+7"/>
<source>Arming Settings are now set to &apos;Always Disarmed&apos; for your safety.</source> <source>Arming Settings are now set to &apos;Always Disarmed&apos; for your safety.</source>
<translation></translation> <translation>
</translation>
</message> </message>
<message> <message>
<location line="+1"/> <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> <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>
<message> <message>
<location line="+211"/> <location line="+210"/>
<source>Next</source> <source>Next</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+12"/>
<source>Welcome to the inputs configuration wizard. <source>Welcome to the inputs configuration wizard.
Please follow the instructions on the screen and only move your controls when asked to. 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. 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> </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> </translation>
</message> </message>
<message> <message>
<location line="+12"/>
<source>Please choose your transmitter type:</source> <source>Please choose your transmitter type:</source>
<translation></translation> <translation type="vanished"></translation>
</message> </message>
<message> <message>
<location line="+2"/>
<source>Acro: normal transmitter for fixed-wing or quad</source> <source>Acro: normal transmitter for fixed-wing or quad</source>
<translation>Acro</translation> <translation type="vanished">Acro</translation>
</message> </message>
<message> <message>
<location line="+1"/>
<source>Helicopter: has collective pitch and throttle input</source> <source>Helicopter: has collective pitch and throttle input</source>
<translation>Helicopter</translation> <translation type="vanished">Helicopter</translation>
</message> </message>
<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> <source>Please choose your transmitter mode:</source>
<translation></translation> <translation type="vanished"></translation>
</message> </message>
<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> <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> <translation type="unfinished"></translation>
</message> </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> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+5"/> <location line="+6"/>
<source>Mode 1: Elevator and Rudder on the left, Throttle and Ailerons on the right</source> <source>Mode 1: Elevator and Rudder on the left, Throttle and Ailerons on the right</source>
<translation>1</translation> <translation>1</translation>
</message> </message>
@ -10292,42 +10346,38 @@ You can press &apos;back&apos; at any time to return to the previous screen or p
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>For a Quad: Elevator is Pitch, Ailerons are Roll, and Rudder is Yaw.</source> <source>For a Quad: Elevator is Pitch, Ailerons are Roll, and Rudder is Yaw.</source>
<translation></translation> <translation>ELEVAILERUDD</translation>
</message> </message>
<message> <message>
<location line="+21"/>
<source>Please center all controls and trims and press Next when ready. <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> If your FlightMode switch has only two positions, leave it in either position.</source>
<translation> <translation type="vanished">
</translation> </translation>
</message> </message>
<message> <message>
<location line="+6"/>
<source>Please move all controls to their maximum extents on both directions. <source>Please move all controls to their maximum extents on both directions.
Press Next when ready.</source> Press Next when ready.</source>
<translation> <translation type="vanished">
</translation> </translation>
</message> </message>
<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> <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>
<message> <message>
<location line="+7"/>
<source>You have completed this wizard, please check below if the picture mimics your sticks movement. <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> 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> </translation>
</message> </message>
<message> <message>
<location line="+124"/> <location line="+191"/>
<source>Please enable throttle hold mode. <source>Please enable throttle hold mode.
Move the Collective Pitch stick.</source> Move the Collective Pitch stick.</source>
@ -10338,7 +10388,7 @@ Move the Collective Pitch stick.</source>
<source>Please toggle the Flight Mode switch. <source>Please toggle the Flight Mode switch.
For switches you may have to repeat this rapidly.</source> For switches you may have to repeat this rapidly.</source>
<translation> <translation>
</translation> </translation>
</message> </message>
@ -10361,7 +10411,7 @@ Move the %1 stick.</source>
<message> <message>
<location line="+6"/> <location line="+6"/>
<source>Next / Skip</source> <source>Next / Skip</source>
<translation>/</translation> <translation>/</translation>
</message> </message>
<message> <message>
<location line="+726"/> <location line="+726"/>
@ -10371,7 +10421,7 @@ Move the %1 stick.</source>
<message> <message>
<location line="+3"/> <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> <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>
<message> <message>
<location line="+3"/> <location line="+3"/>
@ -10386,7 +10436,7 @@ Move the %1 stick.</source>
<message> <message>
<location line="-764"/> <location line="-764"/>
<source> Alternatively, click Next to skip this channel.</source> <source> Alternatively, click Next to skip this channel.</source>
<translation>/</translation> <translation>/</translation>
</message> </message>
</context> </context>
<context> <context>
@ -10394,23 +10444,23 @@ Move the %1 stick.</source>
<message> <message>
<location filename="../../../src/plugins/coreplugin/connectionmanager.cpp" line="+53"/> <location filename="../../../src/plugins/coreplugin/connectionmanager.cpp" line="+53"/>
<source>USB: OPLinkMini</source> <source>USB: OPLinkMini</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+13"/> <location line="+13"/>
<source>Connections:</source> <source>Connections:</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+72"/> <location line="+72"/>
<source>Disconnect</source> <source>Disconnect</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="-81"/> <location line="-81"/>
<location line="+127"/> <location line="+127"/>
<source>Connect</source> <source>Connect</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
</context> </context>
<context> <context>
@ -10542,7 +10592,7 @@ Move the %1 stick.</source>
<message> <message>
<location filename="../../../src/plugins/modelview/modelviewgadgetfactory.cpp" line="+36"/> <location filename="../../../src/plugins/modelview/modelviewgadgetfactory.cpp" line="+36"/>
<source>ModelView</source> <source>ModelView</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
</context> </context>
<context> <context>
@ -10712,21 +10762,21 @@ Move the %1 stick.</source>
<location line="+24"/> <location line="+24"/>
<location line="+6"/> <location line="+6"/>
<location line="+19"/> <location line="+19"/>
<location line="+13"/> <location line="+16"/>
<location line="+16"/> <location line="+16"/>
<location line="+38"/> <location line="+38"/>
<source>Unknown</source> <source>Unknown</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="-179"/> <location line="-182"/>
<source>Vehicle type: </source> <source>Vehicle type: </source>
<translation> </translation> <translation> </translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Multirotor</source> <source>Multirotor</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
@ -10738,58 +10788,57 @@ Move the %1 stick.</source>
<message> <message>
<location line="-66"/> <location line="-66"/>
<source>Tricopter</source> <source>Tricopter</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Quadcopter X</source> <source>Quadcopter X</source>
<translation>X型四</translation> <translation>X型四旋翼</translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Quadcopter +</source> <source>Quadcopter +</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Hexacopter</source> <source>Hexacopter</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Hexacopter Coax (Y6)</source> <source>Hexacopter Coax (Y6)</source>
<translatorcomment></translatorcomment> <translation> Y6</translation>
<translation> Y6</translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Hexacopter H</source> <source>Hexacopter H</source>
<translation>H型六</translation> <translation>H型六旋翼</translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Hexacopter X</source> <source>Hexacopter X</source>
<translation>X型六</translation> <translation>X型六旋翼</translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Octocopter</source> <source>Octocopter</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Octocopter Coax X</source> <source>Octocopter Coax X</source>
<translation>X型八</translation> <translation>X型八旋翼</translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Octocopter Coax +</source> <source>Octocopter Coax +</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>
<source>Octocopter V</source> <source>Octocopter V</source>
<translation>V型八</translation> <translation>V型八旋翼</translation>
</message> </message>
<message> <message>
<location line="+9"/> <location line="+9"/>
@ -10877,7 +10926,12 @@ Move the %1 stick.</source>
<translation>ESC </translation> <translation>ESC </translation>
</message> </message>
<message> <message>
<location line="+16"/> <location line="+9"/>
<source>Oneshot ESC</source>
<translation>Oneshot电调</translation>
</message>
<message>
<location line="+10"/>
<source>Servo type: </source> <source>Servo type: </source>
<translation> </translation> <translation> </translation>
</message> </message>
@ -10957,16 +11011,16 @@ Move the %1 stick.</source>
<location filename="../../../src/plugins/setupwizard/vehicleconfigurationhelper.cpp" line="+85"/> <location filename="../../../src/plugins/setupwizard/vehicleconfigurationhelper.cpp" line="+85"/>
<location line="+12"/> <location line="+12"/>
<source>Done!</source> <source>Done!</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="-12"/> <location line="-12"/>
<location line="+12"/> <location line="+12"/>
<source>Failed!</source> <source>Failed!</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+136"/> <location line="+141"/>
<source>Writing External Mag sensor settings</source> <source>Writing External Mag sensor settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -10986,9 +11040,9 @@ Move the %1 stick.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+172"/> <location line="+199"/>
<location line="+31"/> <location line="+32"/>
<location line="+36"/> <location line="+37"/>
<source>Writing actuator settings</source> <source>Writing actuator settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -11748,6 +11802,11 @@ The board will be restarted and all settings erased.</source>
<source>-</source> <source>-</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location/>
<source>Prev</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>CustomConfigWidget</name> <name>CustomConfigWidget</name>
@ -11872,17 +11931,17 @@ The board will be restarted and all settings erased.</source>
<message> <message>
<location filename="../../../src/plugins/config/airframe_fixedwing.ui"/> <location filename="../../../src/plugins/config/airframe_fixedwing.ui"/>
<source>Form</source> <source>Form</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Airframe</source> <source>Airframe</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Throttle Curve</source> <source>Throttle Curve</source>
<translation type="unfinished">线</translation> <translation>线</translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -12105,7 +12164,7 @@ The board will be restarted and all settings erased.</source>
<source>Weight of Roll mixing in percent. <source>Weight of Roll mixing in percent.
Typical values are 100% for + configuration and 50% for X configuration on quads</source> Typical values are 100% for + configuration and 50% for X configuration on quads</source>
<translation> <translation>
100%X型则使用50%</translation> 100%X型则使用50%</translation>
</message> </message>
<message> <message>
<location/> <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. <source>Weight of Pitch mixing in percent.
Typical values are 100% for + configuration and 50% for X configuration on quads.</source> Typical values are 100% for + configuration and 50% for X configuration on quads.</source>
<translation> <translation>
100%X型则使用50%</translation> 100%X型则使用50%</translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -12133,8 +12192,8 @@ Typical values are 100% for + configuration and 50% for X configuration on quads
<location/> <location/>
<source>Weight of Yaw mixing in percent. <source>Weight of Yaw mixing in percent.
Typical value is 50% for + or X configuration on quads.</source> Typical value is 50% for + or X configuration on quads.</source>
<translation type="unfinished"> <translation>
X型四飞行器通常都设为50%</translation> X型四旋翼飞行器通常都设为50%</translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -12209,7 +12268,7 @@ Typical value is 50% for + or X configuration on quads.</source>
<message> <message>
<location/> <location/>
<source>Tricopter Yaw Servo channel</source> <source>Tricopter Yaw Servo channel</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
@ -12219,72 +12278,72 @@ Typical value is 50% for + or X configuration on quads.</source>
<message> <message>
<location/> <location/>
<source>Select output channel for Accessory0 RcInput</source> <source>Select output channel for Accessory0 RcInput</source>
<translation type="unfinished"></translation> <translation>Accessory0控制量选择一个输出通道</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Accessory1</source> <source>Accessory1</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>RcOutput channels</source> <source>RcOutput channels</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>RC Output</source> <source>RC Output</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Accessory0</source> <source>Accessory0</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>RC Input</source> <source>RC Input</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Select output channel for Accessory2 RcInput</source> <source>Select output channel for Accessory2 RcInput</source>
<translation type="unfinished"></translation> <translation>Accessory2控制量选择一个输出通道</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Select output channel for Accessory1 RcInput</source> <source>Select output channel for Accessory1 RcInput</source>
<translation type="unfinished"></translation> <translation>Accessory1控制量选择一个输出通道</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Accessory2</source> <source>Accessory2</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>RcOutput curve</source> <source>RcOutput curve</source>
<translation type="unfinished"></translation> <translation>线</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Curve</source> <source>Curve</source>
<translation type="unfinished"></translation> <translation>线</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Select output curve for Accessory0 RcInput</source> <source>Select output curve for Accessory0 RcInput</source>
<translation type="unfinished"></translation> <translation> Accessory0选择一个输出曲线</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Select output curve for Accessory1 RcInput</source> <source>Select output curve for Accessory1 RcInput</source>
<translation type="unfinished"></translation> <translation> Accessory1选择一个输出曲线</translation>
</message> </message>
<message> <message>
<location/> <location/>
<source>Select output curve for Accessory2 RcInput</source> <source>Select output curve for Accessory2 RcInput</source>
<translation type="unfinished"></translation> <translation> Accessory2选择一个输出曲线</translation>
</message> </message>
</context> </context>
<context> <context>
@ -12808,7 +12867,7 @@ even lead to crash. Use with caution.</source>
<message> <message>
<location/> <location/>
<source>Send settings to the board but do not save to the non-volatile memory</source> <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>
<message> <message>
<location/> <location/>
@ -12818,7 +12877,7 @@ even lead to crash. Use with caution.</source>
<message> <message>
<location/> <location/>
<source>Send settings to the board and save to the non-volatile memory</source> <source>Send settings to the board and save to the non-volatile memory</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location/> <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;/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 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> &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; &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; } 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;/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 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> &lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<message> <message>
@ -13212,7 +13271,7 @@ It is suggested that if this is a first time configuration of your controller, r
使Generic开头的选项</translation> 使Generic开头的选项</translation>
</message> </message>
<message> <message>
<location line="+85"/> <location line="+93"/>
<source>Current Tuning</source> <source>Current Tuning</source>
<translation></translation> <translation></translation>
</message> </message>
@ -13395,6 +13454,11 @@ p, li { white-space: pre-wrap; }
<source>Rapid ESC</source> <source>Rapid ESC</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<location/>
<source>OneShot ESC</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>OPEndPage</name> <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> <context>
<name>ConfigOutputWidget</name> <name>ConfigOutputWidget</name>
<message> <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> <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> <translation type="unfinished"></translation>
</message> </message>
@ -14248,14 +14323,18 @@ Please first select the area of the map to rip with &lt;CTRL&gt;+Left mouse clic
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location line="+238"/> <location line="+219"/>
<source>http://wiki.openpilot.org/x/WIGf</source> <source>http://wiki.openpilot.org/x/WIGf</source>
<translation></translation> <translation></translation>
</message> </message>
<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> <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> </message>
</context> </context>
<context> <context>
@ -14388,7 +14467,7 @@ not only the ones visible on screen.</source>
<message> <message>
<location filename="../../../src/plugins/config/configvehicletypewidget.cpp" line="+142"/> <location filename="../../../src/plugins/config/configvehicletypewidget.cpp" line="+142"/>
<source>Multirotor</source> <source>Multirotor</source>
<translation></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location line="+1"/> <location line="+1"/>
@ -15282,6 +15361,7 @@ Note: for the OpenPilot v8 GPS please select the U-Blox option.</source>
<context> <context>
<name>InputWizardWidget</name> <name>InputWizardWidget</name>
<message> <message>
<location filename="../../../src/plugins/config/input_wizard.ui"/>
<source>Welcome to the inputs configuration wizard. <source>Welcome to the inputs configuration wizard.
Please follow the instructions on the screen and only move your controls when asked to. 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. 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> </source>
<translation type="obsolete">使 <translation>使
退 退
</translation> </translation>
</message> </message>
<message> <message>
<location/>
<source>Please choose your transmitter type:</source> <source>Please choose your transmitter type:</source>
<translation type="obsolete"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/>
<source>Acro: normal transmitter for fixed-wing or quad</source> <source>Acro: normal transmitter for fixed-wing or quad</source>
<translation type="obsolete">Acro</translation> <translation>Acro</translation>
</message> </message>
<message> <message>
<location/>
<source>Helicopter: has collective pitch and throttle input</source> <source>Helicopter: has collective pitch and throttle input</source>
<translation type="obsolete">Helicopter</translation> <translation type="unfinished">Helicopter</translation>
</message> </message>
<message> <message>
<location/>
<source>Please choose your transmitter mode:</source> <source>Please choose your transmitter mode:</source>
<translation type="obsolete"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/>
<source>For a Quad: Elevator is Pitch, Ailerons are Roll, and Rudder is Yaw.</source> <source>For a Quad: Elevator is Pitch, Ailerons are Roll, and Rudder is Yaw.</source>
<translation type="obsolete"></translation> <translation>ELEVAILERUDD</translation>
</message> </message>
<message> <message>
<location/>
<source>Please center all controls and trims and press Next when ready. <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> If your FlightMode switch has only two positions, leave it in either position.</source>
<translation type="obsolete"> <translation>
</translation> </translation>
</message> </message>
<message> <message>
<location/>
<source>Please move all controls to their maximum extents on both directions. <source>Please move all controls to their maximum extents on both directions.
Press Next when ready.</source> Press Next when ready.</source>
<translation type="obsolete"> <translation>
</translation> </translation>
</message> </message>
<message> <message>
<location/>
<source>Please check the picture below and correct all the sticks which show an inverted movement. Press Next when ready.</source> <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>
<message> <message>
<location/>
<source>You have completed this wizard, please check below if the picture mimics your sticks movement. <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> 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> </translation>
</message> </message>
<message> <message>
<location/>
<source>Back</source> <source>Back</source>
<translation type="obsolete"></translation> <translation></translation>
</message> </message>
<message> <message>
<location/>
<source>Cancel</source> <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> </message>
</context> </context>
</TS> </TS>

View File

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

View File

@ -11,7 +11,7 @@
At the discretion of the user of this library, At the discretion of the user of this library,
this software may be licensed under the terms of the 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, original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution. files located at the root of the source distribution.
@ -218,7 +218,8 @@ extern "C" {
@returns @returns
This function returns the actual number of bytes read and 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); 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 @returns
This function returns the actual number of bytes read and 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); 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. /** @brief Get a feature report from a HID device.
Make sure to set the first byte of @p data[] to the Report Set the first byte of @p data[] to the Report ID of the
ID of the report to be read. Make sure to allow space for report to be read. Make sure to allow space for this
this extra byte in @p data[]. 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 @ingroup API
@param device A device handle returned from hid_open(). @param device A device handle returned from hid_open().
@param data A buffer to put the read data into, including @param data A buffer to put the read data into, including
the Report ID. Set the first byte of @p data[] to the 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 @param length The number of bytes to read, including an
extra byte for the report ID. The buffer can be longer extra byte for the report ID. The buffer can be longer
than the actual report. than the actual report.
@returns @returns
This function returns the number of bytes read and This function returns the number of bytes read plus
-1 on error. 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); 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, At the discretion of the user of this library,
this software may be licensed under the terms of the 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, original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution. files located at the root of the source distribution.
@ -44,11 +44,74 @@
#include <wchar.h> #include <wchar.h>
/* GNU / LibUSB */ /* GNU / LibUSB */
#include "libusb.h" #include <libusb.h>
#include "iconv.h" #ifndef __ANDROID__
#include <iconv.h>
#endif
#include "../hidapi.h" #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 #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -105,6 +168,7 @@ struct hid_device_ {
pthread_cond_t condition; pthread_cond_t condition;
pthread_barrier_t barrier; /* Ensures correct startup sequence */ pthread_barrier_t barrier; /* Ensures correct startup sequence */
int shutdown_thread; int shutdown_thread;
int cancelled;
struct libusb_transfer *transfer; struct libusb_transfer *transfer;
/* List of received input reports. */ /* List of received input reports. */
@ -249,9 +313,9 @@ static int get_usage(uint8_t *report_descriptor, size_t size,
} }
#endif /* INVASIVE_GET_USAGE */ #endif /* INVASIVE_GET_USAGE */
#ifdef __FreeBSD__ #if defined(__FreeBSD__) && __FreeBSD__ < 10
/* The FreeBSD version of libusb doesn't have this funciton. In mainline /* The libusb version included in FreeBSD < 10 doesn't have this function. In
libusb, it's inlined in libusb.h. This function will bear a striking 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. resemblence to that one, because there's about one way to code it.
Note that the data parameter is Unicode in UTF-16LE encoding. 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]; char buf[512];
int len; int len;
wchar_t *str = NULL; wchar_t *str = NULL;
wchar_t wbuf[256];
#ifndef __ANDROID__ /* we don't use iconv on Android */
wchar_t wbuf[256];
/* iconv variables */ /* iconv variables */
iconv_t ic; iconv_t ic;
size_t inbytes; size_t inbytes;
@ -338,6 +403,7 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
char *inptr; char *inptr;
#endif #endif
char *outptr; char *outptr;
#endif
/* Determine which language to use. */ /* Determine which language to use. */
uint16_t lang; uint16_t lang;
@ -354,6 +420,25 @@ static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)
if (len < 0) if (len < 0)
return NULL; 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 /* buf does not need to be explicitly NULL-terminated because
it is only passed into iconv() which does not need it. */ 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: err:
iconv_close(ic); iconv_close(ic);
#endif
return str; 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 && if (cur_dev->vendor_id == vendor_id &&
cur_dev->product_id == product_id) { cur_dev->product_id == product_id) {
if (serial_number) { 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; path_to_open = cur_dev->path;
break; break;
} }
@ -683,10 +771,12 @@ static void read_callback(struct libusb_transfer *transfer)
} }
else if (transfer->status == LIBUSB_TRANSFER_CANCELLED) { else if (transfer->status == LIBUSB_TRANSFER_CANCELLED) {
dev->shutdown_thread = 1; dev->shutdown_thread = 1;
dev->cancelled = 1;
return; return;
} }
else if (transfer->status == LIBUSB_TRANSFER_NO_DEVICE) { else if (transfer->status == LIBUSB_TRANSFER_NO_DEVICE) {
dev->shutdown_thread = 1; dev->shutdown_thread = 1;
dev->cancelled = 1;
return; return;
} }
else if (transfer->status == LIBUSB_TRANSFER_TIMED_OUT) { else if (transfer->status == LIBUSB_TRANSFER_TIMED_OUT) {
@ -701,6 +791,7 @@ static void read_callback(struct libusb_transfer *transfer)
if (res != 0) { if (res != 0) {
LOG("Unable to submit URB. libusb error code: %d\n", res); LOG("Unable to submit URB. libusb error code: %d\n", res);
dev->shutdown_thread = 1; 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 /* Cancel any transfer that may be pending. This call will fail
if no transfers are pending, but that's OK. */ if no transfers are pending, but that's OK. */
if (libusb_cancel_transfer(dev->transfer) == 0) { libusb_cancel_transfer(dev->transfer);
/* The transfer was cancelled, so wait for its completion. */
libusb_handle_events(usb_context); while (!dev->cancelled)
} libusb_handle_events_completed(usb_context, &dev->cancelled);
/* Now that the read thread is stopping, Wake any threads which are /* 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 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 d = 0;
int good_open = 0; int good_open = 0;
dev = new_hid_device();
if(hid_init() < 0) if(hid_init() < 0)
return NULL; return NULL;
dev = new_hid_device();
libusb_get_device_list(usb_context, &devs); libusb_get_device_list(usb_context, &devs);
while ((usb_dev = devs[d++]) != NULL) { while ((usb_dev = devs[d++]) != NULL) {
struct libusb_device_descriptor desc; struct libusb_device_descriptor desc;
@ -1205,7 +1296,7 @@ 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, At the discretion of the user of this library,
this software may be licensed under the terms of the 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, original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution. files located at the root of the source distribution.
@ -80,6 +80,27 @@ struct hid_device_ {
static __u32 kernel_version = 0; 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) static hid_device *new_hid_device(void)
{ {
hid_device *dev = calloc(1, sizeof(hid_device)); hid_device *dev = calloc(1, sizeof(hid_device));
@ -345,6 +366,8 @@ int HID_API_EXPORT hid_init(void)
if (!locale) if (!locale)
setlocale(LC_CTYPE, ""); setlocale(LC_CTYPE, "");
kernel_version = detect_kernel_version();
return 0; return 0;
} }
@ -600,21 +623,6 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path)
dev = new_hid_device(); 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 */ /* OPEN HERE */
dev->device_handle = open(path, O_RDWR); 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; bytes_read = 0;
if (bytes_read >= 0 && if (bytes_read >= 0 &&
kernel_version != 0 &&
kernel_version < KERNEL_VERSION(2,6,34) && kernel_version < KERNEL_VERSION(2,6,34) &&
dev->uses_numbered_reports) { dev->uses_numbered_reports) {
/* Work around a kernel bug. Chop off the first byte. */ /* 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, At the discretion of the user of this library,
this software may be licensed under the terms of the 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, original HIDAPI license as outlined in the LICENSE.txt,
LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt
files located at the root of the source distribution. files located at the root of the source distribution.
@ -24,7 +24,6 @@
#include <IOKit/hid/IOHIDManager.h> #include <IOKit/hid/IOHIDManager.h>
#include <IOKit/hid/IOHIDKeys.h> #include <IOKit/hid/IOHIDKeys.h>
#include <IOKit/IOKitLib.h>
#include <CoreFoundation/CoreFoundation.h> #include <CoreFoundation/CoreFoundation.h>
#include <wchar.h> #include <wchar.h>
#include <locale.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) static int get_serial_number(IOHIDDeviceRef device, wchar_t *buf, size_t len)
{ {
return get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, 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; 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() static int make_path(IOHIDDeviceRef device, char *buf, size_t len)
*
* 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)
{ {
/* When compiled with '-mmacosx-version-min=10.5', IOHIDDeviceGetService() int res;
* is weakly linked in so we can decide to use it (or not) at runtime. unsigned short vid, pid;
*/ char transport[32];
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 int32_t location;
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;
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. */ /* 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(); process_pending_events();
/* Get a list of the Devices */ /* Get a list of the Devices */
IOHIDManagerSetDeviceMatching(hid_mgr, NULL);
CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr);
/* Convert the list into a C array so we can iterate easily. */ /* 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; unsigned short dev_pid;
#define BUF_LEN 256 #define BUF_LEN 256
wchar_t buf[BUF_LEN]; wchar_t buf[BUF_LEN];
char cbuf[BUF_LEN];
IOHIDDeviceRef dev = device_array[i]; 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) && if ((vendor_id == 0x0 || vendor_id == dev_vid) &&
(product_id == 0x0 || product_id == dev_pid)) { (product_id == 0x0 || product_id == dev_pid)) {
struct hid_device_info *tmp; struct hid_device_info *tmp;
io_object_t iokit_dev; size_t len;
kern_return_t res;
io_string_t path;
/* VID/PID match. Create the record. */ /* VID/PID match. Create the record. */
tmp = malloc(sizeof(struct hid_device_info)); 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 */ /* Fill out the record */
cur_dev->next = NULL; cur_dev->next = NULL;
len = make_path(dev, cbuf, sizeof(cbuf));
/* Fill in the path (IOService plane) */ cur_dev->path = strdup(cbuf);
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("");
/* Serial Number */ /* Serial Number */
get_serial_number(dev, buf, BUF_LEN); get_serial_number(dev, buf, BUF_LEN);
@ -669,15 +681,11 @@ static void *read_thread(void *param)
return NULL; 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) hid_device * HID_API_EXPORT hid_open_path(const char *path)
{ {
int i;
hid_device *dev = NULL; hid_device *dev = NULL;
io_registry_entry_t entry = MACH_PORT_NULL; CFIndex num_devices;
dev = new_hid_device(); dev = new_hid_device();
@ -685,38 +693,44 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path)
if (hid_init() < 0) if (hid_init() < 0)
return NULL; return NULL;
/* Get the IORegistry entry for the given path */ /* give the IOHIDManager a chance to update itself */
entry = IORegistryEntryFromPath(kIOMasterPortDefault, path); process_pending_events();
if (entry == MACH_PORT_NULL) {
/* Path wasn't valid (maybe device was removed?) */
goto return_error;
}
/* Create an IOHIDDevice for the entry */ CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr);
dev->device_handle = IOHIDDeviceCreate(kCFAllocatorDefault, entry);
if (dev->device_handle == NULL) {
/* Error creating the HID device */
goto return_error;
}
/* Open the IOHIDDevice */ num_devices = CFSetGetCount(device_set);
IOReturn ret = IOHIDDeviceOpen(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); 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];
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) { if (ret == kIOReturnSuccess) {
char str[32]; char str[32];
free(device_array);
CFRetain(os_dev);
CFRelease(device_set);
dev->device_handle = os_dev;
/* Create the buffers for receiving data */ /* Create the buffers for receiving data */
dev->max_input_report_len = (CFIndex) get_max_report_length(dev->device_handle); 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)); dev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t));
/* Create the Run Loop Mode for this device. /* Create the Run Loop Mode for this device.
printing the reference seems to work. */ printing the reference seems to work. */
sprintf(str, "HIDAPI_%p", dev->device_handle); sprintf(str, "HIDAPI_%p", os_dev);
dev->run_loop_mode = dev->run_loop_mode =
CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII); CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII);
/* Attach the device to a Run Loop */ /* Attach the device to a Run Loop */
IOHIDDeviceRegisterInputReportCallback( IOHIDDeviceRegisterInputReportCallback(
dev->device_handle, dev->input_report_buf, dev->max_input_report_len, os_dev, dev->input_report_buf, dev->max_input_report_len,
&hid_report_callback, dev); &hid_report_callback, dev);
IOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev); IOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev);
@ -726,20 +740,17 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path)
/* Wait here for the read thread to be initialized. */ /* Wait here for the read thread to be initialized. */
pthread_barrier_wait(&dev->barrier); pthread_barrier_wait(&dev->barrier);
IOObjectRelease(entry);
return dev; return dev;
} }
else { else {
goto return_error; goto return_error;
} }
}
}
return_error: return_error:
if (dev->device_handle != NULL) free(device_array);
CFRelease(dev->device_handle); CFRelease(device_set);
if (entry != MACH_PORT_NULL)
IOObjectRelease(entry);
free_hid_device(dev); free_hid_device(dev);
return NULL; return NULL;
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -151,7 +151,7 @@ void VehicleConfigurationHelper::applyHardwareConfiguration()
break; break;
case VehicleConfigurationSource::INPUT_PPM: case VehicleConfigurationSource::INPUT_PPM:
if (m_configSource->getEscType() == VehicleConfigurationSource::ESC_ONESHOT || 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; data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PPM_PIN8ONESHOT;
} else { } else {
data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PPMNOONESHOT; data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PPMNOONESHOT;
@ -377,15 +377,12 @@ void VehicleConfigurationHelper::applyActuatorConfiguration()
bankMode = ActuatorSettings::BANKMODE_PWM; bankMode = ActuatorSettings::BANKMODE_PWM;
break; break;
case VehicleConfigurationSource::ESC_RAPID: 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; bankMode = ActuatorSettings::BANKMODE_PWM;
escFrequence = RAPID_ESC_FREQUENCY; escFrequence = RAPID_ESC_FREQUENCY;
} else { break;
case VehicleConfigurationSource::ESC_SYNCHED:
bankMode = ActuatorSettings::BANKMODE_PWMSYNC; bankMode = ActuatorSettings::BANKMODE_PWMSYNC;
escFrequence = PWMSYNC_ESC_FREQUENCY; escFrequence = PWMSYNC_ESC_FREQUENCY;
}
break; break;
case VehicleConfigurationSource::ESC_ONESHOT: case VehicleConfigurationSource::ESC_ONESHOT:
bankMode = ActuatorSettings::BANKMODE_ONESHOT125; 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, 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, FIXED_WING_DUAL_AILERON, FIXED_WING_AILERON, FIXED_WING_ELEVON, FIXED_WING_VTAIL, HELI_CCPM,
GROUNDVEHICLE_MOTORCYCLE, GROUNDVEHICLE_CAR, GROUNDVEHICLE_DIFFERENTIAL }; 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 SERVO_TYPE { SERVO_ANALOG, SERVO_DIGITAL, SERVO_UNKNOWN };
enum INPUT_TYPE { INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSM, INPUT_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 }; enum AIRSPEED_TYPE { AIRSPEED_ESTIMATE, AIRSPEED_EAGLETREE, AIRSPEED_MS4525, AIRSPEED_DISABLED };

View File

@ -49,7 +49,26 @@
<field name="FlightModeAssistMap" units="" type="enum" <field name="FlightModeAssistMap" units="" type="enum"
options="None,GPSAssist" options="None,GPSAssist"
elements="6" 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"/> <access gcs="readwrite" flight="readwrite"/>
<telemetrygcs acked="true" updatemode="onchange" period="0"/> <telemetrygcs acked="true" updatemode="onchange" period="0"/>